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.