В (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
работать для пользователя никаких проблем возникнуть не должно.