/ / eseguire il comando multiline bash su ssh non funziona - bash, ssh

eseguire il comando multiline bash su ssh non funziona - bash, ssh

Ho bisogno di eseguire un comando bash su più righe su ssh, tutti i tentativi possibili esauriti ma senza fortuna -

echo "3. All files found, creating remote directory on the server."
ssh -t $id@$host bash -c ""
if [[ -d ~/_tmp ]]; then
rm -rf ~/_tmp/*
else
mkdir ~/_tmp
fi
"" ;

echo "4. Sending files ..."
scp ${files[@]} $id@$host:~/_tmp/ ;

Ecco l'output -

user@linux:/tmp$ ./remotecompile
1. Please enter your id:
user
2. Please enter the names of the files that you want to compile
(Filenames *must* be space separated):
test.txt
3. All files found, creating remote directory on the server.
Password:
Unmatched ".
Unmatched ".
Connection to host.domain.com closed.

Nota, non voglio mettere ogni 2-3 righe di comandi bash if-then-else-fi in file separati.

Qual è il modo giusto per farlo?

risposte:

3 per risposta № 1

Usa un heredoc con escape per far passare il suo contenuto letterale. (Senza la fuga, cioè usando solo <<EOFle espansioni di shell verrebbero elaborate localmente, creando casi d'angolo più interessanti se si utilizzavano variabili all'interno del codice eseguito in remoto).

ssh "$id@$host" bash <<"EOF"
if [[ -d ~/_tmp ]]; then
rm -rf ~/_tmp/*
else
mkdir ~/_tmp
fi
EOF

Se vuoi passare argomenti, farlo in modo non ambiguo diventa più interessante (dal momento che ci sono due livelli separati di analisi della shell coinvolti), ma il printf "%q" builtin salva la giornata:

args=( "this is" "an array" "of things to pass" 
"this next one is a literal asterisk" "*" )
printf -v args_str "%q " "${args[@]}"
ssh "$id@$host" bash -s "$args_str" <<"EOF"
echo "Demonstrating local argument processing:"
printf "%qn" "$@"
echo "The asterisk is $5"
EOF

1 per risposta № 2

Questo funziona per me:

ssh [hostname] "
if [[ -d ~/_tmp ]]; then
rm -rf ~/_tmp
else
mkdir ~/_tmp
fi
"