Posso executar alguns comandos ao iniciar a sessão ssh antes de entrar no modo interativo?

13

Ao iniciar a sessão ssh com o comando ssh, parece ter duas opções - sessão interativa padrão com env padrão e a partir do diretório home - ou executar comando arbitrário, mas não interativamente (até truques como ssh "command; command; bash -i -l"esse parecem não fazer muito bem). Muitas vezes eu quero uma sessão interativa, mas com algo acontecendo antes disso - normalmente uma mudança de diretório ou, às vezes, um ajuste no ambiente do sistema. Essas coisas variam de sessão para sessão, então eu não posso simplesmente colocá-las nela .bashrc.

Existe alguma maneira de fazer isso acontecer?

taw
fonte

Respostas:

13

Estou respondendo, pois finalmente descobri o segredo. Nem a -topção for sshnem a -lopção for bashlevarão o shell de login por conta própria - mas em combinação elas funcionam.

ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'muda as variáveis de ambiente do diretório, sets, e depois começa shell de login adequada (a única diferença que eu encontrei até agora é que /etc/motdnão é exibido desta forma - é normalmente ssh's ou loginresponsabilidade' s, não bash's - outras de que tudo parece para funcionar perfeitamente, e todas as variáveis ​​ambientais são idênticas).

Essas alterações de ambiente / diretório acontecem após o ssh, portanto, não são restritas por PermitUserEnvironmente configurações relacionadas (exatamente como planejado), mas antes .bashrc/ .profilesão executadas. Isso tem vantagens e desvantagens - é mais difícil substituir algo que é definido a partir de scripts bash init PS1, mas é mais fácil sshincluir exatamente os valores certos nas linhas de comando e .profilefazer todo o trabalho pesado.

E se realmente necessário, é realmente muito fácil fazer com que o bash execute algo depois .profilecom uma linha de comando como ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- muito feia quando colocada dessa maneira, mas esses .profilearquivos alternativos podem ser preparados antes. (até onde eu sei) bashtem alguns locais candidatos para .profilescript e executará o primeiro encontrado - . filenão possui fallbacks automáticos, então você precisará verificar onde está o normal, profilese quiser fazer isso)

taw
fonte
Incrível, obrigado por isso! Eu estava procurando uma maneira de processar a conta de um usuário logo após a ativação, e a opção "-t" fez com que funcionasse. Sem essa opção, o shell não tem um prompt, não tem histórico de comandos, morre de um SIGINT, etc.
Ashoat
Esta resposta é realmente útil, mas você está perdendo alguns ;s da primeira string de login ssh. Não me permite editar sua resposta porque não estou mudando o suficiente. Eu fiz isso funcionar ssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Eu acho que é isso que você pretendia.
Rob Kwasowski
2

Edite .bashrc e coloque suas configurações de ambiente específicas do SSH em:

if [ $SSH_TTY ]; then
    ...
fi

Isso permitiria adicionar configurações especificamente para sessões SSH. 'Claro, se tudo o que você deseja é definir variáveis ​​de ambiente arbitrárias logo no início, que variam de acordo com a sessão, não sei como você pode fazer a máquina adivinhá-las para você, além de digitá-las ... não importa o que aconteça, você' Precisamos de algumas condições testáveis ​​para basear a escolha das configurações.

Michael Louis Thaler
fonte
2

Na sshpágina do manual:

Além disso, o ssh lê ~ / .ssh / environment e adiciona linhas do formato "VARNAME = value" ao ambiente, se o arquivo existir e os usuários puderem alterar seu ambiente. Para mais informações, consulte a opção PermitUserEnvironment em sshd_config (5).

que diz:

PermitUserEnvironment
Especifica se as opções ~ / .ssh / environment e environment = em ~ / .ssh / allowed_keys são processadas pelo sshd (8). O padrão é "não". A ativação do processamento do ambiente pode permitir que os usuários ignorem as restrições de acesso em algumas configurações usando mecanismos como LD_PRELOAD.

Esse recurso pode ser usado para executar condicionalmente instruções em seu controle remoto ~/.bashrcusando a ifestrutura que Mickey sugeriu.

Pausado até novo aviso.
fonte
1

Basta executar desta maneira: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : para que esse prompt apareça
  • ; bash: para que ele retorne o controle apesar de executar o comando (aqui cd) e sair da sessão ssh
Sumit Ramteke
fonte
Bem-vindo ao ServerFault! Forneça uma explicação e / ou documentação para comandos ou scripts para explicar para que servem.
Cory Knutson
1
Obrigado @CoryKnutson, eu fiz as alterações conforme solicitado
Sumit Ramteke 8/08/18