Existe um subsistema no SSH (Open): é um programa que é lançado quando você solicita algo diferente de shell interativo. Tecnicamente é apenas um executável no host remoto que é exec
'd por sshd
child depois de autenticar você e chamar setuid.
Você pode localizar uma definição de subsistema padrão para sftp
em sua configuração de SSH:
Subsystem sftp /usr/lib/openssh/sftp-server
Como é apenas um executável simples, não um SUID ou especial de qualquer outra forma, você pode escrever um script de shell que alterará quaisquer atributos necessários e, em seguida, apenas iniciará o manipulador de subsistema original.
Coloque o seguinte script na pasta /usr/lib/openssh
como, por exemplo, sftp-fperm-server
(isso não é necessário, apenas para manter as coisas em um só lugar):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
Em seguida, adicione uma linha no final de /etc/ssh/sshd_config
:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
Em seguida, reinicie o sshd
(ele não interrompe as sessões na reinicialização) e inicie sftp
com a opção -s sftp-fperm
. Voila! os arquivos recebem a nova umask especificada.
Se você não quiser especificar essa opção a cada vez, apenas altere a definição do subsistema padrão. Sessões interativas não serão afetadas por isso, então não há chances de quebrar algo.
Se você quiser usar o comando newgrp
, as coisas serão um pouco mais complicadas. newgrp
sempre lança um novo shell interativo enquanto estupidamente não permite passar nenhum parâmetro para ele, então você não pode usá-lo como umask
no exemplo anterior. Mas você pode substituir a última linha no script por:
SHELL=/usr/lib/openssh/sftp-server newgrp git
Na verdade, chamar o newgrp
para algum grupo ao qual pertenço envia uma solicitação de senha, por isso não pude verificar essa solução (quero dizer apenas newgrp
one), mas funciona quando passo o /bin/id
em meu laptop (sem SSH), então se você tem newgrp
trabalhando para o usuário, nenhum problema deve surgir.