Wie kann ich eine Bildschirmsitzung mit einem Befehl über ssh auf einem Remote-Server von meinem Desktop aus starten?

57

Ich möchte Bildschirmsitzungen auf Remote-Servern mit einem einzigen ssh-Befehl auf meinem Desktop starten können. Der Bildschirm scheint jedoch ein Terminal zu benötigen, das nicht verfügbar ist, wenn ein Befehl über ssh ausgeführt wird.

Also das Offensichtliche

ssh [email protected] screen "tail -f /var/log/messages"

(als Beispiel) funktioniert nicht und gibt

Must be connected to a terminal.

Ich möchte, dass ssh den Befehl unter einem Bildschirm startet, damit ich mich später anmelden und eine Verbindung zu einer Bildschirmsitzung herstellen kann, die ich manuell gestartet hätte.

Thomas Vander Stichele
quelle
Übrigens können Sie diesen Fehler nicht durch schlechte Bildschirmnutzung treffen. Ich hatte eine Shell-Funktion, die exec <foo ausführte, um aus einer Datei zu lesen. Viel später in einem großen Skript habe ich versucht, screen zu starten. Alle folgenden Methoden obv. gescheitert als der wahre Schuldige war der exec. Einer, den man bedenken sollte. Stellen Sie sicher, dass Sie nicht versehentlich Ihren eigenen Stdin getötet haben.
Neil McGill

Antworten:

77

Versuchen Sie es mit der Option -t für ssh

ssh -t [email protected] screen "tail -f /var/log/messages"

Vom Menschen ssh

-t Pseudotty-Zuweisung erzwingen. Hiermit können Arbitrierungs-
        Bildschirmbasierte Programme auf einem Remote-Computer, die sein können
        Sehr nützlich zB bei der Implementierung von Menü-Diensten. Mehrfach -t
        Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat.
Kjetil Joergensen
quelle
Ich versuche das selbe mit tmux ssh -t user@machine tmux attachund ich kann eine entfernte tmux-Sitzung anhängen, aber es bringt die Zeichenkodierung durcheinander. Es werden nur ASCII-Zeichen angezeigt. Gibt es eine Lösung dafür?
Macario
1
@Macario Sie möchten möglicherweise eine separate Frage dazu öffnen, obwohl sie tangential zusammenhängt, wenn Sie sie mit ssh -t ausführen. Es klingt eher so, als würde LC_ * für interaktive und nicht interaktive Ausführung unterschiedlich eingestellt. Wenn Sie eine Befehlszeile zur Ausführung an ssh übergeben, wird diese in der nicht interaktiven Umgebung ausgeführt. Es ist auch möglich, dass die Umgebungsvariable TERM nicht übergeben wird, wenn sie nicht interaktiv ausgeführt wird. In diesem Fall hat tmux keine Ahnung, über welche Funktionen Ihr Terminal tatsächlich verfügt, und greift auf den kleinsten gemeinsamen Nenner zurück.
Kjetil Joergensen
Ich benutze kein ssh, habe aber das gleiche Problem. Bitte helfen Sie. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Sie können verwenden:

ssh root@host screen -m -d "tail -f /var/log/messages"

Dadurch wird ein losgelöster Bildschirm mit einem darauf ausgeführten Befehl gestartet.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.
Alakdae
quelle
1
Ihre Antwort war genauso gut, schade, dass ich wählen muss. Vielleicht sollte jemand die erste Antwort bearbeiten und Ihre Informationen hinzufügen.
Thomas Vander Stichele
8

Späte Antwort, aber das ist, was ich tue, ich mache einen Alias ​​(nennen wir es t), der dies tut:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Dies weist Sie sshan, die Agent- und X11-Weiterleitung zu deaktivieren und screeneine Verbindung zu einer laufenden Sitzung herzustellen, bei Bedarf eine neue Sitzung zu starten, ^Zals Breakout-Befehl zu verwenden, UTF-8 zu verwenden und das Terminal im Auge zu behalten.

All dies bedeutet, dass ich ein Terminal öffnen kann, ttippe und es öffnet meine Bildschirmsitzung auf $ MYSERVER. Ich kann dann ein anderes Terminal öffnen, dasselbe tun und ein anderes Fenster für dieselbe Sitzung öffnen.

Es ist wirklich schön, mehrere Terminalfenster für dieselbe Bildschirmsitzung zu haben, damit Sie zwei Bildschirmregisterkarten gleichzeitig anzeigen können.

w00t
quelle
1
Ich habe einige Seiten durchgelesen, die nicht ganz das geantwortet haben, wonach ich gesucht habe, aber Sie haben es geschafft. Ich gehe davon aus, dass derzeit wahrscheinlich entweder screen oder tmux auf den meisten Servern installiert ist. Die Server, mit denen ich eine Verbindung herstelle, sind möglicherweise kurzlebig, sodass ich mich nicht mit dem bashrc anlegen wollte, wie die meisten Antworten vermuten lassen. Sie können dies auch zu einer Funktion in Ihrer Shell machen und Argumente wie $ host und $ command akzeptieren (die Sie am Ende einfügen würden). Und anstatt Ihren Alias ​​fest zu codieren, tder ein einzelner Host ist, können Sie ihn mit Hostnamen in Ihrer ssh_config kombinieren.
Dragon788
@ dragon788 tatsächlich habe ich es jetzt zu einer Funktion gemacht und $ MYSERVER durch "$ @" ersetzt. Ich benutze das immer noch viel.
Mittwoch,
4

Wenn Sie Folgendes in die Datei ~ / .bashrc auf meinem Server einfügen, wird eine Bildschirmsitzung gestartet, wenn ich mich zum ersten Mal am Server anmelde oder wenn bereits eine ausgeführt wird, wird eine erneute Verbindung zu dieser Sitzung hergestellt.

Ich finde das sehr praktisch:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
quelle
Ich habe es versucht, aber wenn ich es tue, screen -lssehe ich keine Bildschirmsitzung
Tarun