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

12

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

Existe alguma maneira de fazer isso acontecer?

    
por taw 07.07.2010 / 03:53

4 respostas

12

Eu auto-responderei, pois finalmente descobri o segredo. Nem a opção -t para a opção ssh , nem a -l para bash levarão ao 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' altera o diretório, define as variáveis de ambiente e inicia o shell de login apropriado (a única diferença que encontrei até agora é que /etc/motd não é exibido dessa maneira - normalmente é ssh 's ou login é responsabilidade, não bash 's - além de que tudo parece funcionar perfeitamente, e todas as variáveis ambientais são idênticas).

Essas alterações de ambiente / diretório acontecem depois do ssh, portanto, elas não são restritas por PermitUserEnvironment e configurações relacionadas (exatamente como planejado), mas antes de .bashrc / .profile ser executado. Isso tem vantagens e desvantagens - é mais difícil simplesmente sobrescrever algo que é definido a partir de scripts bash como PS1 , mas é mais fácil empacotar exatamente os valores corretos em ssh , e ter .profile fazendo todo o trabalho pesado .

E, se for realmente necessário, é realmente fácil fazer algo depois de .profile com a linha de comando como ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\h-\w \"" >~/xxx; bash --init-file ~/xxx' - muito feio quando colocado dessa forma, mas esses arquivos .profile alternativos podem ser preparados antes. (até onde eu sei, bash tem alguns locais candidatos para o script .profile e executará o primeiro encontrado - . file não tem esses fallbacks automáticos, então você precisa verificar onde está sua% normalprofile se você quiser fazer isso)

    
por 07.07.2010 / 07:44
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ê quer é definir variáveis de ambiente arbitrárias logo no início, que variam de acordo com a sessão, eu não sei como você pode fazer com que a máquina as adivinhe para você além de digitá-las ... não importa o quê, você Vai precisar de alguma condição testável para basear a escolha das configurações.

    
por 07.07.2010 / 04:43
1

Na página ssh man:

Additionally, ssh reads ~/.ssh/environment, and adds lines of the format “VARNAME=value” to the environment if the file exists and users are allowed to change their environment. For more information, see the PermitUserEnvironment option in sshd_config(5).

que diz:

PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in ~/.ssh/authorized_keys are processed by sshd(8). The default is “no”. Enabling environment processing may enable users to bypass access restrictions in some configurations using mechanisms such as LD_PRELOAD.

Este recurso pode ser usado para executar condicionalmente instruções em seu controle remoto ~/.bashrc usando a estrutura if que Mickey sugerido.

    
por 07.07.2010 / 06:23
0

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

  • -t : de modo que o prompt sh'd apareça
  • ; bash : para que ele retorne o controle apesar de executar o comando (aqui cd ) e sair da sessão ssh
por 08.10.2018 / 19:03

Tags