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. Quero poder usar subprocessos porque isso facilitaria outras coisas que estou tentando fazer.
Editar: Um exemplo mais completo, conforme solicitado. Eu tenho uma lista de nomes de host aos quais preciso adicionar entradas crontab. Cada sistema pertence a um usuário específico e, portanto, deve ter a entrada adicionada em seu nome. O proprietário do sistema está contido no nome do host do sistema, portanto, analisando o nome do host, posso acessar su
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
Sua substituição de comando está se expandindo localmente porque as aspas duplas permitem que o shell o faça.
As aspas duplas permitirão que o shell interprete
$
,`
,\
, e se a expansão do histórico estiver habilitada!
As aspas simples, por outro lado, preservarão o valor literal de todos os caracteres especiais.
Portanto, quando você coloca aspas simples na substituição do comando, garante 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.