Shell-Skript: SSH zur Remote-Maschine, dann beenden: „Exit“ funktioniert nicht

Shell-Skript: SSH zur Remote-Maschine, dann beenden: „Exit“ funktioniert nicht

Ich habe ein Shell-Skript des folgenden Typs:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

Ich führe es lokal aus, um etwas auf einem Remote-Server zu tun (dargestellt durch „echo „Hi““). Wenn ich es jedoch ausführe, sehe ich die Eingabeaufforderung auf dem Remote-Server – der Befehl „exit“ wird also nicht ausgeführt. Wenn ich dann manuell „exit“ in die Remote-Eingabeaufforderung eingebe, sehe ich „Verbindung zu myremotemachine.com“ geschlossen undDann "Hallo". Wie kann ich das Shell-Skript so einrichten, dass es korrekt beendet wird und mir die (lokale) Eingabeaufforderung anzeigt, von der aus ich es ausgeführt habe?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptUndSSH und Shell über SSH: Wie beenden?scheinen irgendwie verwandt zu sein, aber ich konnte die dort vorgestellten Ideen nicht übernehmen./

AKTUALISIEREN

Die folgende, nicht ganz so minimale Version führt zu Unmatched '..

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

Wenn ich die Anführungszeichen in diesem Snippet entferne, erhalte ich: bash: -c: option requires an argumentunddate: Undefined variable.

Antwort1

Dies sollte Ihr Problem lösen.

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

Oder Sie können Folgendes tun. Fügen Sie alle Befehle, die Sie auf dem Remote-Host ausführen möchten, in ein separates Skript ein. Geben Sie ihm einen Namen wie remote.sh

Führen Sie nun den folgenden

ssh [email protected] 'bash -s' < /path/to/remote.sh

Wo remote.sh enthält.

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

Antwort2

Du kannst tun

$ssh user@comp echo abc<ENTER>

dann wird dieser Befehl ausgeführt (Ausgabe abc) und beendet

Antwort3

Vielleicht haben Sie am Ende des Skripts keine neue Zeile?

LFWenn nach dem Beenden keine leere Zeile (genauer gesagt kein Zeilenvorschubzeichen) vorhanden ist , wird Ihr Skript nicht programmgesteuert die Eingabetaste drücken.

Antwort4

Obwohl Barlops Antwort richtig ist, denke ich, dass wir sie erweitern können, um sie klarer zu machen. Da Sie anscheinend ein Skript verwenden, würde ich so etwas vorschlagen:

#!/bin/bash

ssh [email protected] "echo Hi\!"

Zusätzliche Lektüre: Ich schlage auch vor, dass Sie sich Sonderzeichen ansehen und wann Sie sie maskieren müssen, da Bash Ausrufezeichen in doppelten Anführungszeichen automatisch analysiert. Sie können dies lösen, indem Sie entweder einfache Anführungszeichen oder das Backslash-Zeichen verwenden, um es zu maskieren.

Bearbeiten:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

Als ich eine vereinfachte Version ausprobiert habe, funktionierte die Datumsvariable problemlos. Vielleicht behebt dies das Bash-C-Problem, das Sie hatten. Außerdem ist das Beenden am Ende nicht erforderlich. Wenn der letzte Befehl ausgeführt wird, wird die SSH-Sitzung automatisch geschlossen.

verwandte Informationen