Aqui está um exemplo básico de script.
# Assign values to variables locally.
myvar1="myvalue1"
myvar2="myvalue2"
# Add your local commands here.
ssh myremotehost "$(
cat <<HEREDOC_EXPORT_VARIABLES
export myvar1="$myvar1"
export myvar2="$myvar2"
HEREDOC_EXPORT_VARIABLES
cat <<'HEREDOC_SUDO'
sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS'
# Optionally display your variables.
echo "myvar1: $myvar1"
echo "myvar2: $myvar2"
# Add your remote commands here.
HEREDOC_COMMANDS
HEREDOC_SUDO
)" | tee logfile.log
Explicação de diferentes partes.
Variáveis atribuídas a valores localmente (antes de executar comandos na máquina remota):
myvar1="myvalue1"
myvar2="myvalue2"
"$(
... )"
permite agrupar vários comandos e permitir o uso de aspas duplas nesse bloco.
Exportar bloco aqui-documento, que não está entre aspas simples, permite usar variáveis locais no bloco:
cat <<HEREDOC_EXPORT_VARIABLES
...
...
HEREDOC_EXPORT_VARIABLES
Exportação de variáveis locais para estar disponível para comandos remotos.
export myvar1="$myvar1"
export myvar2="$myvar2"
Bloco Outer here-document, que está entre aspas simples, para excluir o comando sudo e remover a necessidade de escape de variáveis remotas para o documento interno interno (potencialmente pode ser substituído por echo
sem o avanço de linha):
cat <<'HEREDOC_SUDO'
...
...
HEREDOC_SUDO
Bloco Inner here-document, que está entre aspas simples, para remover a necessidade de escape de variáveis remotas.
sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS'
...
...
HEREDOC_COMMANDS
A opção -E
em sudo
permite preservar as variáveis de ambiente, que foram exportadas anteriormente.
tee logfile.log
permite a saída de eco para o terminal e para um arquivo de log ao mesmo tempo.
Como bônus, você pode substituir ssh myremotehost "$(
line por echo "$(
e obter uma saída de como será sua parte executada remotamente para fins de depuração.
Dica: você pode precisar escapar de uma citação simples ou dupla não pareada dentro de "$(
... )"
block, mesmo que você a use em um comentário.