Wie führe ich den Remote-Befehl ssh mit mehreren Befehlen in Anführungszeichen aus?


0

Ich habe viele Kombinationen ausprobiert, aber keine davon hat funktioniert, und jetzt sind meine Ideen erschöpft.

Meine Absicht ist es also, Zeit vom geplanten at-job zu bekommen und eine weitere AT-job eine halbe Stunde vorher zu machen. Führen Sie diesen Befehl in der for-Schleife auf vielen Computern aus.

Ich bin so weit gegangen, aber das macht den AT-Job im Quell-Linux, nicht im Ziel:

ssh linuxserver atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }

Dann bin ich sicher, dass die for-Schleife das Zitieren erschwert, aber ich kann es nicht testen, bevor ich diesen vorherigen Befehl zum Laufen bringen kann. Ich würde dann for-loop wie folgt verwenden:

for loop in $(cat /tmp/names)
do 
ssh $loop atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; } 
done

Irgendwelche Ideen?


1
Solche Vorkehrungen werden wahrscheinlich am besten mit einem Skript auf der Remote-Maschine getroffen.
Raúl Salinas-Monteagudo

Antworten:


0

Wenn Sie Zugriff auf haben bash, können Sie das printf '%q\n' "$command"Muster verwenden, um einen gültigen Befehl abzurufen. Erstellen Sie zunächst einen gültigen lokalen Befehl wie folgt:

atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }

Nun legt es in eine Variable , so dass , wenn Sie genau die gleiche Ergebnis erhalten wider. Der einfachste Weg, dies zu tun, ist die Verwendung von einfachen Anführungszeichen, wo immer dies möglich ist, und doppelten Anführungszeichen, wo immer dies erforderlich ist ( nur zum Umbrechen von einfachen Anführungszeichen):

$ cat command.sh
atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }
$ command='atq | awk '"'"'{print ($3), $2}'"'"' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }'

Sie können überprüfen, ob diese identisch sind mit diff:

$ diff command.sh <(echo "$command")
$ echo $?
0

Drucken Sie das jetzt aus, damit Sie es in einen sshBefehl einfügen können :

printf '%q\n' "$command"
atq\ \|\ awk\ \'\{print\ \(\$3\)\,\ \$2\}\'\ \|\ \{\ read\ time\;\ date\ -d\ \"\$time\ -30\ min\"\ \"+%H:%M\ %F\"\ \;\ \}\ \|\ \{\ read\ time2\;\ echo\ \"yum\ upgrade\ -y\"\ \|\ at\ \"\$time2\"\ \;\ \}

Hässlich, aber es funktioniert.


0

Mit Ihrem Befehl wird nur der atqBefehl auf dem Remote-Computer ausgeführt. Sie müssen nur eine lange Befehlszeile in einfachen Anführungszeichen übergeben:

ssh linuxserver '  command1 'command2' command3  '

Es gibt jedoch einfache Anführungszeichen in Ihrer Befehlszeile, sodass Sie sie folgendermaßen umgehen können:

ssh linuxserver $'  command1 \'command2\' command3  '

Das Ergebnis wäre also:

ssh linuxserver $' atq | awk \'{print ($3), $2}\' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; } '

Vielen Dank, es funktioniert! :) Aber ich verstehe die Bedeutung des $ -Zeichens vor den einfachen Anführungszeichen nicht?
Okkim

Egal, ich habe es gefunden. mywiki.wooledge.org/Quotes
Okkim

0

Versuchen Sie nicht, mit der ssh hostname command arg1 arg2 ... argNSyntax zu schlau zu sein . Erstellen Sie ein Shell-Skript auf dem Remote-Host und lassen Sie es die Arbeit erledigen, anstatt Ihren Mitarbeitern die Augen vor dem Zitieren zu verbrennen. Dh:

$ ssh linuxserver /usr/local/bin/my_atq.sh

Ja, ich weiß, dass dies viel einfacher ist, aber ich möchte keine Skripte auf alle Server kopieren. Es funktioniert jetzt und ich habe etwas Neues gelernt.
Okkim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.