
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 argument
unddate: 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?
LF
Wenn 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.