Ich würde gerne so etwas machen, ssh example.com 'ls'
aber per ssh manpage:
Wenn ein Befehl angegeben wird, wird er auf dem Remote-Host anstelle einer Anmeldeshell ausgeführt.
Was also passiert, ist, dass ls
es seine Ausgabe anzeigt und dann ssh beendet wird.
Was ich nicht herausfinden kann, ist, wie die vollständige Anmeldeshell geöffnet und dann der Befehl in dieser Shell ausgeführt wird. Lassen Sie die Shell geöffnet, nachdem der Befehl ausgeführt wurde. Als hätte ich manuell folgendes gemacht:
localhost$ ssh example.com
example.com$ ls
/folder1
/folder2
example.com$ _
Irgendwelche Ideen?
ssh example.com 'ls;bash'
?Antworten:
Sag bash einfach, dass sie ausgeführt werden soll
ls
und dann selbst in einer Login-Shellquelle
screen
. Ansonsten scheint es das zu tun, was ich versucht habe.-t
Pseudo-Terminal-Zuordnung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einem Remote-Computer auszuführen. Ist etwas richtiger alsbash -i
.exec
Es wird kein neuer Prozess erstellt.-l
sucht in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle aus ... Ohne diese Funktion können Sie wahrscheinlich keine Skripte / Befehle aus dem Verzeichnis ~ / bin ausführen, da dieser Code from ~ / .profile wird ohne-l
flag nicht ausgeführt :quelle
bash
dich patchen , um das zuzulassen.exec bash
oderexec $SHELL
In deinem Kommentar zur Antwort von fons sagst du, dass es während der Benutzung nicht funktioniert
screen
.Könnten Sie das näher erläutern? Im Quellcode von openssh führt sshd den Befehl durch Aufrufen aus
Wenn Ihre Standard-Shell beispielsweise "" ist
screen
, funktioniert dies nicht so gut, dascreen
das-c
Flag von "" nur das Flag überschreibt.scrreenrc
. Es gibt also wirklich keine Möglichkeit, Befehle an den Bildschirm zu senden, wenn es Ihre Standard-Shell ist. Sie müssen eigentlich screen als Befehl für ssh ausführen, aber mit einer Standard-Shell, die kein screen ist .Wenn du das versuchst, werden die Dinge wirklich komisch, da
screen
auch Fenster mit nicht interaktiven Programmen geschlossen werden, also musst du einen ähnlichen Trick wie bei Fons machen, aber eine Ebene tiefer. SO, mit zB / bin / bash (und nicht - Bildschirm) als Standard - Shell So etwas wie:Um einen tiefen Atemzug zu machen, führen Sie bash -c mit dem Befehl screen aus, wodurch ein neues Fenster geöffnet wird. Wenn dieses Fenster gerade geöffnet würde, würde es enden und der Bildschirm würde sich beenden, also verwenden wir den Trick von fons innerhalb des neuen Bildschirmfensters .
Ich denke, das wird funktionieren, wenn du es überhaupt versucht hast;)
quelle
screen
in dieser Situation habe, ist, dass ich es normalerweiseexec screen -RR
von meinem lade.profile
. Dies bedeutet, dassbash -l
versucht wird, einen Bildschirm zu laden, der den Rest davon abwirft. es scheint, dass ich es umgehen kann, indem ich '-l' sowohl in Ihrer als auch in der @ fons-Lösung entferne (Ihre Lösung lässt mich dann drinscreen
). Es ist aber irgendwie wackelig.Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat:
quelle