Ich habe einige HP Switches, bei denen ich mich über ssh anmelde. Die Switches senden einen Terminalbefehl, um den Zeilenumbruch zu deaktivieren ("rmam" im terminfo-Sprachgebrauch), können ihn dann aber nicht wieder aktivieren, wodurch mein Terminal nach dem Beenden der ssh-Sitzung kaputt geht. Ich kann das Terminal durch Ausführen reparieren tput smam
.
Gibt es eine Möglichkeit, ssh dazu zu bringen, diesen Befehl nach dem Ende meiner ssh-Sitzung automatisch auszuführen?
Es würde mich nicht töten, es als Shell-Autobefehl oder Alias ssh
auszuführen, um diesen Befehl immer danach auszuführen, aber ich würde es vorziehen, das Problem über ssh zu lösen, damit ich den Befehl so beschränken kann, dass er nur ausgeführt wird, nachdem ich eine Verbindung zu bekannt hergestellt habe -bade Gastgeber.
Mein SSH-Client ist OpenSSH_6.2p2, aber ich kann ihn ändern oder aktualisieren, wenn irgendwo eine neue Funktion vorhanden ist.
ssh 1.2.3.4 && tput smam
Antworten:
OpenSSH hat eine Option namens
LocalCommand
, die einen Befehl auf der Clientseite ausführt, wenn Sie eine SSH-Verbindung herstellen. Leider wird der Befehl ausgeführt, bevor die SSH-Sitzung eingerichtet wurde, nicht danach. Aber das brachte mich auf die Idee, dass ich den vorhergehenden Prozess irgendwie dazu bringen könnte, auf das Ende der SSH-Sitzung zu warten. Trotz der Tatsache, dass der ssh-Prozess die übergeordnete PID des LocalCommand ist, stellt sich heraus, dass es immer noch nicht so einfach ist.Ich habe jedoch etwas gefunden, das unter MacOS X für mich funktioniert, und sollte auf (anderen) BSDs funktionieren, wenn nicht auf Linux. Ich habe ein kleines C-Programm geschrieben, das die
kqueue()
Schnittstelle verwendet, um auf seine eigene ppid zu warten und dann einen bereitgestellten Befehl auszuführen, sobald dieser Prozess beendet wird. (Quellcode-Liste unten für Interessierte.)Jetzt muss ich nur noch auf dieses Programm in meiner
~/.ssh/config
Datei verweisen :Und das scheint gut zu funktionieren. Diejenigen von euch , auf Linux ... Ich denke , Sie können versuchen , die gleiche Art der Sache durch die Abfrage für
LocalCommand
‚s ppid und die Hoffnung , dass die pid nicht wiederverwendet erhalten. (Siehe /programming/1157700/how-to-wait-for-exit-of-non-children-processes )wait4parent.c:
quelle
Sie können hierfür einen einfachen SSH-Wrapper erstellen und darin Befehle angeben, die nach SSH ausgeführt werden sollen, z
quelle
eval
. Es wirft den Vorteil der doppelten Anführungszeichen weg$@
.