ssh, inicie um shell específico e execute um comando na máquina remota?


11

Estou em uma situação em que vários usuários estão compartilhando a mesma conta de usuário em uma máquina remota. Eu tenho um diretório "pessoal" onde escrevi meu próprio .zshrcarquivo e gostaria de ter uma maneira de:

  1. Iniciar uma sessão ssh na máquina remota com diretivas do meu arquivo de configuração ssh (por exemplo ControlMaster auto)
  2. Esta sessão executa um shell Z
  3. Ele executa um .zshrcno meu diretório "pessoal" (não no diretório inicial do usuário compartilhado)

Seria bom ter um apelido ou uma maneira simples de iniciar essas sessões ssh (é por isso que pensei em usar o arquivo de configuração do OpenSSH), mas estou aberto a outras idéias!

Usando o arquivo de configuração do OpenSSH?

Li na página do manual ssh_config do OpenSSH que posso usar a diretiva LocalCommandpara especificar um comando a ser executado localmente após a conexão bem-sucedida ao servidor. Isso me fez pensar que pode haver uma maneira de dizer ao configarquivo qual comando executar remotamente após a conexão com o servidor, mas parece não haver nenhum.


Eu não acho que você pode. Mas estou confuso sobre o motivo de você querer isso. Já existe um comando na linha de comando ssh. Por que você não pode correr ssh mycommand? E se você deseja executar algum comando de instalação antes de todo comando que vem sobre o ssh, por que não configurar o lado do servidor?
Gilles 'SO- stop be evil'

Obrigado @Guilles. Estou em uma situação em que vários usuários estão compartilhando a mesma conta remota; portanto, gostaria de configurar rapidamente algumas coisas ao efetuar logon remotamente. Mais especificamente, gostaria de iniciar um shell Z e pedir para executar um .zshrcem um diretório específico (ou seja, um diretório pessoal "pessoal"). Eu tentei ssh -t host_name 'zsh & source /path/to/my_zshrc', mas não deu certo (eu tenho FPATH variable not defined, e eu acho que é porque zshacabamentos antes de executar my_zshrc, e muito menos isso não me dar um shell Z)
Amelio Vazquez-Reina

Acho que isso merece uma atualização do OP, então acabei de atualizá-lo.
Amelio Vazquez-Reina

Tendo procurado uma resposta semelhante, me ocorre que essa pergunta está bem próxima do que você está tentando fazer.
Gilles 'SO- stop be evil'

Respostas:


15

A maneira mais óbvia de executar um comando remotamente é especificá-lo na linha de comando ssh. O comando ssh é sempre interpretado pelo shell do usuário remoto.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

Contas compartilhadas geralmente são uma má ideia; se possível, obtenha contas separadas para cada usuário. Se você está preso a uma conta compartilhada, pode criar um alias:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

Se você usar a autenticação de chave pública (novamente, recomendado), poderá definir comandos por chave em ~/.ssh/authorized_keys. Veja esta resposta para mais explicações. Edite a linha da sua chave no ~/.ssh/authorized_keysservidor (tudo em uma linha):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Fantastic @Guilles. Suas contribuições para este site o tornam um recurso tremendamente útil para todos nós. Muito obrigado mesmo. A propósito, eu não sabia sobre o execcomando. Qual é a exec zshdiferença de ligar zshdiretamente? Por que é importante neste caso em particular?
Amelio Vazquez-Reina

Hmm, quando eu corro ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'eu entendo HOME=~/bob: command not found. Eu acho que estou tcsh. Eu tenho o mesmo problema se tentar HOME=/home/bob. Eu tentei no bash e zsh. Alguma pista que possa estar causando isso? Finalmente, a sintaxe acima me deixaria com a sessão ssh aberta? (o que eu quero). Obrigado novamente.
Amelio Vazquez-Reina

1
O @intrpc execsubstitui o shell original pelo zsh; sem zsh, o shell original permaneceria na memória até o zsh sair e depois sair. A principal diferença é economizar um pouco de memória, não é muito importante. Se o seu shell de login for (t) csh, use setenv HOME ~/bob; exec zsh. Por fim, como o zsh é iniciado sem argumentos, você obtém uma sessão do shell, como faria se apenas rodasse sshe tivesse o zsh como seu shell de login.
Gilles 'SO- stop be evil'

Obrigado novamente por sua ajuda. Uma pergunta de acompanhamento aqui. Alguma maneira de executar mais comandos, após o exec zshcomando?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina Não é conveniente, a menos que você tenha algum controle sobre um dos arquivos de ponto. Você pode definir a variável de ambiente ZDOTDIRpara fazer o zsh procurar arquivos de ponto em um diretório diferente. Se você tem algum controle sobre os arquivos de pontos, então você pode fazer algo como add eval $LC_STARTUP_CODEpara $ZDOTDIR/.zshrce passar o código para executar na variável de ambiente LC_STARTUP_CODE.
Gilles 'SO- stop be evil'

-3

Para executar um comando remotamente após conectar o servidor, adicione no seu arquivo .ssh / config o seguinte trecho

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
Obrigado @ user626129, mas como mencionei na pergunta original, a LocalCommanddiretiva é executar um comando no shell local , não no shell remoto .
Amelio Vazquez-Reina
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.