você só está perdendo algumas citações:
ssh gateway.my.company "$command"
Contexto: Estou tentando executar vários comandos em uma máquina remota que não posso acessar diretamente - primeiro tenho que usar ssh em uma máquina de gateway, depois ssh a partir daí e executar os comandos.
Basicamente, o que eu estou procurando é uma forma de empacotar um conjunto de comandos que eu possa passar por qualquer número de níveis de ssh. Isso pode ser feito? Eu suspeito que a melhor resposta seja usar o scp para copiar um script, então execute isso, que é uma opção.
Note que usei o comando hostname como uma maneira de mostrar o que está acontecendo - não é isso que eu realmente quero fazer!
A partir de um comando que faz um único ssh e executa um conjunto de comandos de várias linhas:
ssh gateway.my.company "
hostname;
hostname;
"
Isso funciona bem. A saída é algo como:
target_machine
target_machine
Em seguida, armazenei o conjunto de comandos em uma variável e a transmita em:
command="
hostname;
hostname;
"
ssh gateway.my.company $command
A saída é exatamente a mesma - ambos os comandos hostname
são executados no destino.
Em seguida, adiciono o extra ssh hop (à máquina privada):
ssh gateway.my.company ssh target_machine_ip $command
Desta vez, os dois comandos hostname
são executados em máquinas diferentes:
target_machine
gateway_machine
Parece que posso resolver essa etapa envolvendo o cmd em citações de escape (ou seja, \"$command\"
), mas se eu fizer isso, preciso envolvê-lo de forma diferente para o caso direto, pois ssh gateway.my.company \"$command\"
não funciona mais
NOTA: Eu aprecio que os comandos não devam ser armazenados em uma variável, mas em uma função, mas como estou usando ssh, qualquer função que eu declarasse não existiria assim que eu tivesse passado para o próximo servidor.
EDIT: pergunta original omitiu o segundo salto, desculpe!
você só está perdendo algumas citações:
ssh gateway.my.company "$command"
Tags bash-scripting