BASH subprocesso usando SSH no script?

2

Eu quero fazer algo como o seguinte em um script

$ ssh host1 "$(command)"

No entanto, os subprocessos são executados antes que a conexão SSH seja estabelecida, porque se eu fizer o seguinte

$ ssh host1 "$(hostname)"

o nome do host da máquina local é retornado. Eu quero poder usar subprocessos porque isso tornaria outras coisas que estou tentando fazer mais facilmente.

Editar: um exemplo mais completo, conforme solicitado. Eu tenho uma lista de nomes de host que eu preciso adicionar entradas crontab para. Cada sistema pertence a um usuário específico e deve ter a entrada adicionada em seu nome. O dono do sistema está contido no nome do host do sistema, então, analisando o nome do host, eu posso su para o usuário apropriado e editar seu crontab de acordo. Por exemplo, algo assim:

for host in $(cat /tmp/hosts); do
echo -e "----------------------------"
echo -e "# SSH to host $host"
echo -e "----------------------------"
ssh $host "su - $(hostname | cut -b-5-); crontab -e";
done
    
por Timothy Pulliam 12.02.2018 / 16:20

1 resposta

1

Sua substituição de comando está se expandindo localmente porque as aspas duplas permitem que o shell seja ativado.

A aspa dupla permitirá que o shell interprete $ , ' , \ e, se a expansão do histórico estiver ativada, !

As aspas simples, por outro lado, preservam o valor literal de todos os caracteres especiais.

Assim, quando você cita a substituição do seu comando, está garantindo que ele seja passado para a máquina remota como está. Você também pode usar o caractere de escape para isso se tiver que preservar uma variável local como parte de sua substituição de comando.

ssh user@host "$(command)"    #will expand locally
ssh user@host '$(command)'    #will expand on the remote machine
ssh user@host "\$(command $local_var)"    #will expand local_var locally but send the command substitution to the remote machine
    
por 12.02.2018 / 18:40