В (Open) SSH есть такая вещь, как подсистема : это программа, которая запускается, когда вы запрашиваете что-то отличное от интерактивной оболочки. Технически это просто исполняемый файл на удаленном хосте, который будет execзаписан sshdпотомком после вашей аутентификации и вызова setuid.
Вы можете найти стандартное определение подсистемы sftpв вашей конфигурации SSH:
Subsystem sftp /usr/lib/openssh/sftp-server
Так как это простой исполняемый файл, а не SUID или какой-либо другой, вы можете написать сценарий оболочки, который изменит любые необходимые вам атрибуты, а затем просто запустить оригинальный обработчик подсистемы.
Поместите следующий скрипт в /usr/lib/opensshпапку, например, sftp-fperm-server(это не требуется, просто чтобы хранить вещи в одном месте):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
Затем добавьте строку в конце /etc/ssh/sshd_config:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
И затем перезапустите sshd(это не убивает сессии при перезапуске) и запустите sftpс -s sftp-fpermопцией. Вуаля! файлы получают новый указанный umask.
Если вы не хотите указывать эту опцию каждый раз, просто измените определение стандартной подсистемы. Интерактивные сеансы не будут затронуты этим, поэтому нет шансов что-то сломать.
Если вы хотите использовать newgrpкоманду, все будет немного сложнее. newgrpвсегда запускает новую интерактивную оболочку, тупо не позволяя передавать ей какие-либо параметры, поэтому вы не можете использовать ее как umaskв предыдущем примере. Но вы можете заменить последнюю строку в скрипте на:
SHELL=/usr/lib/openssh/sftp-server newgrp git
На самом деле вызов newgrpдля некоторой группы, к которой я принадлежу, отправляет запрос пароля, поэтому я не смог проверить это решение (я имею в виду только newgrpодно), но оно работает, когда я передаю его /bin/idна свой ноутбук (без SSH), поэтому, если вы начали newgrpработать для пользователя никаких проблем возникнуть не должно.