Normalerweise, wenn Sie einen Befehl an ssh wie folgt übergeben
ssh [email protected] 'some-command.sh'
Sie erhalten eine nicht interaktive Sitzung und ssh wird beendet, sobald der Befehl (oder das Skript oder was auch immer) ausgeführt wird. Wie kann ich eine interaktive Sitzung abrufen und dennoch einen Befehl ausführen, den ich auf meinem lokalen Computer angegeben habe? Zum Beispiel möchte ich in der Lage sein, einen Bildschirm zu öffnen und eine bestimmte Bildschirmsitzung neu zu starten:
ssh [email protected] 'screen -r 12345'
Dies ist jedoch nicht zulässig und gibt den Fehler "Muss mit einem Terminal verbunden sein" zurück. was ich vermute bedeutet im Wesentlichen "muss diesen Befehl von einer interaktiven Shell aufrufen".
Als weiteres Beispiel benutze ich eine Menge Maschinen bei der Arbeit, die oft erfordern, dass ich ein gemeinsames Konto benutze, um Rechte für bestimmte Dinge zu haben (ja, ich weiß: schlechte Idee, aber beschuldige mich nicht, das habe ich nicht eingerichtet Art und Weise), und sie haben in der Regel ksh als Standard-Shell. Ich möchte mich anmelden, zu bash (oder zsh) wechseln und das .bash_profile (oder .zshrc) meines eigenen Kontos beziehen. Dies wäre einfach, wenn ich eine interaktive SSH-Sitzung einrichten und einen Befehl an den Remotecomputer übergeben könnte, der bei der Anmeldung ausgeführt wird.
Ich habe eine sehr kludgey (und ungetestete) Lösung im Sinn, die ich posten werde, aber ich hoffe, dass jemand einen besseren Weg kennt.
UPDATE: Für diejenigen, die das nicht bemerkt haben, plane ich nicht, das alles von Hand zu machen. Wenn ich also auffordere, eine interaktive Sitzung zu eröffnen und dann von Hand zu machen, löst das eigentlich nichts.
2. UPDATE: Um es noch einmal zu klären: Ich versuche (beliebige) Befehle auf dem Server auszuführen (programmgesteuert auf dem Client angegeben), aber dann ist eine interaktive Sitzung geöffnet, die von allen Aktionen dieser programmgesteuerten Befehle betroffen ist.
echo "command" | ssh user@remote_host
Antworten:
Sie können den folgenden Befehl verwenden, um bash zu starten und Ihr eigenes Profil zu erstellen, wenn Sie ssh ausführen:
quelle
-t
Schalter behebt auch das Problem des Fragestellersscreen
.ssh -t www.dev "echo 'hi there'"
, wird die Verbindung sofort geschlossen, nachdem der Befehl ausgeführt wurde.Aufbauend auf der Antwort von dogbane sieht eine vollständige Lösung folgendermaßen aus:
Hier
-t
erzwinge ich die Zuweisung eines Pseudo-Terminals, das für eine interaktive Shell benötigt wird. Dann führe ich zwei Befehle auf dem Server aus: zuerst das, was ich vor dem Öffnen der interaktiven Shell tun wollte (in meinem Fall, indem ich das Verzeichnis in einen bestimmten Ordner ändere), und dann die interaktive Shell selbst. bash erkennt, dass es ein Pseudo-Terminal hat und reagiert interaktiv.Die einzelnen Anführungszeichen stellen sicher, dass das Ganze als Befehl, der von Ihrer Standard-Shell ausgeführt wird, an den Remote-Server übergeben wird.
Nochmals vielen Dank an Dogbane für den nötigen Hinweis
-t
. Früher habe ich dieses Problem mit gelöstexpect
, was definitiv bedeutet, eine Maus mit einer Kanone zu töten. (:quelle
Versuchen Sie diese Lösung.
Die Anmeldung ist interaktiv und Ihr Befehl wird so übergeben, als ob Sie ihn in der interaktiven Befehlszeile eingegeben hätten. Die Sitzung wird beendet, als hätten Sie etwas eingegeben
quelle
ssh
.-t
eine eigene Bash-Datei zu verwenden. +1Verwenden Sie ssh -X, um termIO cmds zu verwenden.
Außerdem können Sie Ihre Befehle wie "ssh 'source ~ / .bashrc && cd && do'" verketten.
quelle
Warum nicht detach auf dem Remote-System installieren und verwenden:
quelle
detach
,ls
halten nicht die Sitzung geöffnet und trennen , ohne den Druck der Ausgangls
aber es wird immer noch laufen.Die Antwort von laggingreflex ist nah ... Ich würde es wie folgt ändern:
Leider wird Ihnen die Funktionsweise wahrscheinlich nicht gefallen, da "cat" die Zeilen puffert, die in stdout geschrieben werden ... Wenn wir ein Skript namens "echo-cat" erstellen, das ungefähr so aussieht:
Wir erhalten das gleiche Ergebnis ohne Pufferung:
Damit kommen Sie Ihrem Ziel wahrscheinlich viel näher ...
quelle
Das ist klug und ungetestet, aber ich denke, es sollte funktionieren.
Erstellen Sie ein Skript mit dem Namen (zB) remote-starter, das nach einem user @ host-Argument ein Argument in Anführungszeichen setzt:
Dieses Skript sollte zuerst den in Anführungszeichen gesetzten Befehl (ohne Anführungszeichen) in der Datei mit dem Namen (z. B.)
.onetime
auf dem Remotecomputer speichern und dann einen regulären ssh-Befehl ausführen, wobei dieses Mal kein Befehl übergeben wird, der auf dem Remotecomputer ausgeführt werden soll. (Wenn Sie ssh [email protected] in einem Skript ausführen, funktioniert es möglicherweise, exec ssh [email protected] auszuführen.)Damit dies funktioniert, muss der Remotecomputer eine Quelle
.onetime
aus seinem .bash_profile oder .zshrc oder was auch immer erstellen. Nach der Ausführung.onetime
sollte es gelöscht werden.onetime
, sodass die Datei nicht mehr ausgeführt wird, wenn Sie sich regelmäßig anmelden.quelle