Contexto: Estou tentando executar vários comandos em uma máquina remota que não consigo acessar diretamente - primeiro preciso fazer ssh em uma máquina gateway, depois fazer ssh a partir daí e executar os comandos.
Basicamente, o que procuro é uma maneira de empacotar um conjunto de comandos que eu possa passar por qualquer número de níveis de ssh. Isso pode ser feito? Suspeito que a melhor resposta será usar o scp para copiar um script e depois executá-lo, o que é uma opção.
Observe que usei o comando hostname como uma forma de mostrar o que está acontecendo - não é isso que eu realmente quero fazer!
Começando com um comando que executa 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 passei isso em:
command="
hostname;
hostname;
"
ssh gateway.my.company $command
A saída é exatamente a mesma - ambos hostname
os comandos são executados no destino.
Em seguida, adiciono o salto ssh extra (para a máquina privada):
ssh gateway.my.company ssh target_machine_ip $command
Desta vez os dois hostname
comandos são executados em máquinas diferentes:
target_machine
gateway_machine
Parece que posso resolver esta etapa agrupando o cmd entre aspas de escape (ou seja \"$command\"
), mas se fizer isso, terei que envolvê-lo de forma diferente para o caso direto, pois ssh gateway.my.company \"$command\"
não funciona mais
NOTA: Compreendo que os comandos não devem ser armazenados em uma variável, mas em uma função, mas como estou usando o ssh, qualquer função que eu declarei não existiria depois que eu fizesse o ssh no próximo servidor.
EDIT: A pergunta original omitiu o segundo salto, desculpe!
Responder1
você está faltando apenas algumas citações:
ssh gateway.my.company "$command"