ssh sem usar o shell padrão do usuário

4

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.

    
por Brian Vandenberg 17.03.2015 / 08:03

2 respostas

1

Deve ser possível realizar o que você deseja com um subsistema, mas tenho certeza de que será necessário escrever um binário sshd personalizado, já que o código OpenSSH fornece apenas o subsistema sftp e apenas configura uma estrutura extensível para definições adicionais. .

    
por 16.04.2015 / 19:45
2

Pelo menos com Bash, ssh com o argumento "-t" (por exemplo, ssh server1 -t '/foo/bar/script.sh' ) executará um comando remoto sem executar "~ / .bashrc" (o equivalente bash a "~ / .cshrc / login").

    
por 16.04.2015 / 20:52

Tags