2008-12-01 8 views
17

In einem Bash-Skript führe ich einen Befehl auf einem Remote-Rechner durch ssh. Wenn Benutzer das Skript durch Drücken von Strg + C bricht, stoppt es nur das Skript - nicht einmal SSH-Client. Darüber hinaus, auch wenn ich ssh Client zu töten der Remote-Befehl noch läuft ...Wie ssh zu machen, um Remote-Prozess zu töten, wenn ich ssh selbst unterbrechen?

Wie kann bash lokalen ssh Client und Remote-Befehl Aufruf auf Crtl + c zu töten?

Ein einfaches Skript:

#/bin/bash 
ssh -n -x [email protected] 'mysqldump db' -r file.sql 

Antwort

17

Eventual fand ich eine Lösung wie folgt aus:

#/bin/bash 
ssh -t -x [email protected] 'mysqldump db' -r file.sql 

Also - ich '-t' anstelle von '-n' verwenden. Das Entfernen von '-n' oder die Verwendung eines anderen Benutzers als root hilft nicht.

+5

Ich brauchte -t-t (zweimal), damit es funktioniert. – gravitation

1
trap "some_command" SIGINT 

some_command lokal ausführen, wenn Sie Strg + C drücken. help trap wird Sie über seine anderen Optionen informieren.

In Bezug auf die ssh Problem, ich weiß nicht viel über ssh. Vielleicht können Sie es anrufen ssh -n -x [email protected] 'killall mysqldump' anstelle von some_command, um den Remote-Befehl zu töten?

2

Wissen Sie, welche Optionen Sie an ssh übergeben? Ich vermute nicht. Die Option -n leitet die Eingabe von/dev/null um, sodass der Prozess, den Sie auf dem Remote-Host ausführen, SIGINT wahrscheinlich nicht von Strg-C aus erkennt. Jetzt

, lassen Sie uns darüber reden, wie schlecht eine Idee ist es Remote-Root-Logins zu ermöglichen:

Es ist ein wirklich, wirklich schlechte Idee. Sehen Sie sich HOWTO: set up ssh keys für einige Vorschläge an, wie Sie die Remote-Prozessausführung über ssh sicher verwalten können. Wenn Sie remote etwas mit Rechten ausführen müssen, benötigen Sie wahrscheinlich eine Lösung, die einen öffentlichen ssh-Schlüssel mit eingebettetem Befehl und ein Skript enthält, das als root mit freundlicher Genehmigung von sudo ausgeführt wird.

2

Wenn Ihre SSH Sitzung endet, wird Ihre Shell eine SIGHUP erhalten. (Auflegen-Signal). Sie müssen sicherstellen, dass es an alle Prozesse gesendet wird, die von ihm gestartet werden. Für bash, versuchen Sie shopt -s huponexit; your_command. Das funktioniert möglicherweise nicht, da die man-Seite sagt, dass huponexit nur für interaktive Shells funktioniert.

Ich erinnere mich daran, mit Benutzern, die Jobs auf meinem Cluster ausgeführt, und ob sie Nohup oder nicht verwenden mussten (um das entgegengesetzte Verhalten von dem was Sie wollen), aber ich kann nichts in der bash man page über finden ob untergeordnete Prozesse SIGHUP standardmäßig ignorieren. Hoffentlich wird Huponexit den Trick machen. (Sie könnten diesen Shopt in Ihrem .bashrc, anstatt auf der Kommandozeile, denke ich.)

Ihre ssh -t sollte funktionieren, obwohl, wenn die Verbindung schließt, liest aus dem Terminal liest EOF oder einen Fehler, und das macht die meisten Programme zu beenden.