Houve uma votação para encerrar isso como "não está claro o que você está pedindo". Aparentemente, ser meticuloso não é uma coisa boa, então eu vou ser conciso:
Quando você SSH para um host remoto: é possível executar um programa diretamente em vez de ser executado sob o shell padrão do usuário.
- a rede está com espaço aéreo
- todos na rede têm acesso shell a todas as máquinas
- A TI pode fazer as alterações necessárias, desde que essas alterações não aumentem o risco de alguém obter um shell de raiz (além do que já é possível de qualquer maneira).
- Como prova de que algo parecido é possível:
sftp
, um "subsistema" ssh, é capaz de executar sem executar o shell padrão do usuário, enquanto o subsistema scp
ainda o utiliza.
- Eu tentei implementar um subsistema, mas ele ainda é executado no shell padrão do usuário.
Eu não acho que haja uma boa solução para este problema (a não ser convencer um grande número de pessoas que não são * nix a abandonar a muleta em que estão se apoiando há anos), mas eu pensei em colocar a pergunta lá fora, na esperança de estar enganado.
Abaixo está a questão menos concisa.
No meu escritório há um grande número de pessoas (3-500 +) usando uma variedade de configurações estranhas e bizarras. É muito difícil prever como o software que escrevemos se comportará para um determinado usuário, já que seu ambiente pode violar totalmente nossas expectativas.
Para solucionar isso, alterei nossa compilação para remover o ambiente do usuário, para que não afetasse a compilação e, com base no sucesso dessa estratégia, encerramos a execução de nosso software em um shell script que faz o mesmo tipo de coisa.
Infelizmente, o iniciador ainda pode ser afetado pelo ambiente do usuário. Quando executado remotamente, o usuário .cshrc
/ .login
normalmente tem um monte de lixo eletrônico que causa longos atrasos antes que o iniciador comece a executar.
Normalmente, eu estaria inclinado a dizer "conserte sua porcaria", mas não estamos falando de pessoas que gostem de * nix; essa é uma muleta em que eles se apoiaram por anos e estão mais inclinados a continuar culpando nosso software por seus problemas de configuração.
Em suma, estou procurando uma maneira de causar um curto-circuito completo em seus scripts de ambiente bobo.
Para simular essa situação, configurei meu shell padrão como tcsh e coloquei hostname; sleep 10
em meu .cshrc
, depois executei alguns testes:
O - sftp não imprime / adormece - apesar disso, a máquina alvo nesse caso era solaris, onde o sftp é embutido no sshd, e eu não pensei em testar em uma caixa linux. A execução de
ptree
na árvore do processo que atende à conexão do sftp mostra que ele não está sendo executado em um shell.
- scp imprime o texto & dorme por 10s
- cada variante de execução de comandos no host remoto através de ssh faz com que o comando seja executado sob o shell padrão do usuário; Eu tentei:
- O óbvio - passar um comando em mais de ssh
-
command=
em .ssh/authorized_keys
- Eu fiz um "subsistema" personalizado no meu linux pessoal
/etc/ssh/sshd_config
- Ativou
PermitUserEnvironment
na minha máquina para tentar configurar o SHELL
- Não funcionou de todo:
SHELL=/bin/bash ssh -o "SendEnv SHELL" localhost
- Meio trabalhado: use
environment=
ou ~/.ssh/enviornment
para definir SHELL
- Funcionou um pouco em que o SHELL foi definido, mas na verdade é executado sob o meu shell padrão verdadeiro
Eu consegui usar netcat
para encaminhar um shell sobre uma sessão ssh existente, mas isso parece usar um trenó para quebrar um ovo - tanto confuso quanto altamente inapropriado.
Uma pessoa em nossa organização sugeriu fazer outro usuário que, por qualquer meio, todo mundo seria capaz de se logar como aquele usuário sobre o ssh, então :: solução de bolha turva com muita mão acenando :: para fazer o programa rodar como o usuário original.
Estou um pouco duvidoso em fazer algo assim. Pode não ser tão ruim quanto encaminhar um shell com netcat, ou algo pesado e quebradiço como mudar temporariamente o nome de .cshrc
, mas ainda não gosto dele.
Todas as sugestões são bem vindas.