Executa o ssh como um comando de outro comando ssh

2

Eu quero rodar um programa em uma máquina que eu tenho acesso ssh a partir de uma máquina de gateway que eu possa acessar com o ssh também.

Quando eu quero executar um programa mpi na máquina de destino T , eu acesso ao gateway G da minha máquina local da maneira usual:

ssh user@Gateway

Uma vez na máquina G , inicio meu programa na máquina de destino assim:

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

Dessa forma, tudo funciona corretamente (observe que preciso que ssh-agent e ssh-add sejam executados antes de mpirun , consulte esta questão para detalhes .)

Eu quero passar o segundo comando ssh diretamente para o comando ssh na minha máquina local quando eu acessar o Gateway, algo assim

ssh user@Gateway "ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

Mas isso não funciona, por causa do " eu acho.

PS: não consigo usar o encaminhamento de agente ssh.

    
por 0xFF 30.06.2011 / 17:49

2 respostas

2

Você tem o escape do $ . Caso contrário, $(ssh-agent -s) será avaliado em sua máquina local em vez da máquina do gateway.

ssh user@Gateway "ssh Target 'eval \$(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

Você pode verificar os resultados de escape usando echo

$ echo "foo $(echo bar)"
foo bar
$ echo "foo \$(echo bar)"
foo $(echo bar)
    
por 30.06.2011 / 19:14
3

Seu comando avalia $(ssh-agent -s) na máquina local, pois está entre aspas duplas. Você precisa colocar o comando inteiro para rodar no gateway entre aspas simples. Como o próprio comando contém aspas simples (para proteger o código que deveria ser executado no destino), é necessário escapar dessas aspas simples como '\'' .

ssh user@Gateway 'ssh Target '\''eval $(ssh-agent -s); ssh-add my_key; mpirun --hostfile .hosts program'\'

Você pode automatizar a etapa do gateway configurando seu cliente ssh local. Coloque isso no seu ~/.ssh/config :

Host Target
User user
ProxyCommand ssh Gateway nc %h %p

nc é netcat . Então corra

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

diretamente da máquina local.

    
por 30.06.2011 / 19:17