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.
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)
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.
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.
;
s da primeira string de login ssh. Não me permite editar sua resposta porque não estou mudando o suficiente. Eu fiz isso funcionarssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'
. Eu acho que é isso que você pretendia.Edite .bashrc e coloque suas configurações de ambiente específicas do SSH em:
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.
fonte
Na
ssh
página do manual:que diz:
Esse recurso pode ser usado para executar condicionalmente instruções em seu controle remoto
~/.bashrc
usando aif
estrutura que Mickey sugeriu.fonte
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 (aquicd
) e sair da sessão sshfonte