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


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 root@my.machine screen "tail -f /var/log/messages"

(als ein 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 einloggen und mich an eine Bildschirmsitzung anhängen kann, die ich manuell gestartet hätte.


55
2018-06-08 10:57


Ursprung


Abgesehen davon können Sie diesen Fehler nicht durch eine 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, den Bildschirm zu starten. Alle Methoden unten obv. gescheitert, da der wahre Schuldige die Exekutive war. Eine im Kopf zu behalten. Vergewissern Sie sich, dass Sie Ihre eigene stdin nicht versehentlich getötet haben. - Neil McGill


Antworten:


Versuchen Sie es mit der Option -t auf ssh

ssh -t root@my.machine screen "tail -f /var/log/messages"

Vom Mann ssh

-t Pseudo-tty-Zuweisung erzwingen. Dies kann verwendet werden, um Arbi-
        Programme auf einem Remote-Computer, die sein können
        sehr nützlich, z. B. beim Implementieren von Menüdiensten. Mehrere -t
        Optionen erzwingen die Zuweisung, auch wenn ssh kein lokales Terminal hat.

73
2018-06-08 11:04



Ich versuche das gleiche mit tmux ssh -t user@machine tmux attach und ich kann eine remote-tmux-Sitzung anhängen, aber es verwirrt die Zeichencodierung. Es werden nur ASCII-Zeichen angezeigt. Gibt es eine Lösung dafür? - Macario
@Macario möchten Sie vielleicht eine separate Frage dafür öffnen, während es tangential verwandt ist, da Sie es mit ssh -t ausführen, es klingt eher so, als ob es LC_ * anders anpasst, wenn Sie interaktiv oder nicht-interaktiv laufen. Wenn Sie eine Befehlszeile zur Ausführung an ssh übergeben, wird sie mit der nicht interaktiven Umgebung ausgeführt. Es ist auch möglich, dass die Umgebungsvariable TERM nicht ausgeführt wird, wenn nicht interaktiv ausgeführt wird. In diesem Fall hätte tmux keine Ahnung, welche Fähigkeiten Ihr Terminal tatsächlich hat, und fällt auf den kleinsten gemeinsamen Nenner zurück. - Kjetil Joergensen
Ich benutze kein ssh, aber ich sehe das gleiche Problem. Bitte helfen Sie. serverfault.com/questions/861632/unable-to-run-code-in-screen - zhangjinzhou


Sie können verwenden:

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

Das startet einen getrennten Bildschirm mit einem Befehl, der darauf ausgeführt wird.

   -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.

32
2018-06-08 14:08



Deine Antwort war gleich gut, schade, dass ich mich entscheiden muss. Vielleicht sollte jemand die erste Antwort bearbeiten und Ihre Informationen hinzufügen. - Thomas Vander Stichele


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

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

Das sagt ssh Agent und X11-Weiterleitung zu deaktivieren, und erzählt screen Um eine laufende Sitzung anzuhängen, starten Sie eine neue, falls erforderlich, verwenden Sie ^Z Verwenden Sie als Breakout-Befehl UTF-8 und seien Sie smart im Terminal.

All dies bedeutet, dass ich ein Terminal öffnen kann, tippe t und es wird meine Bildschirmsitzung auf $ MYSERVER öffnen. Ich kann dann ein anderes Terminal öffnen, das gleiche tun und bekomme ein weiteres Fenster zur selben Sitzung.

Es ist wirklich schön, mehrere Terminal-Fenster für dieselbe Bildschirmsitzung zu haben, so dass Sie sich zwei Bildschirme gleichzeitig ansehen können.


8
2017-09-12 20:48



Ich habe ein paar Seiten durchgelesen, die nicht ganz das waren, wonach ich gesucht habe, aber Sie haben es geschafft. Ich nehme an, entweder Bildschirm oder tmux ist wahrscheinlich auf den meisten Servern in diesen Tagen, und die, mit denen ich mich verbinde, sind möglicherweise vergänglich, also wollte ich nicht mit dem bashrc verwirren, wie die meisten Antworten vorschlagen. Sie können dies auch zu einer Funktion in Ihrer Shell machen und Argumente wie $ host und $ command akzeptieren (die Sie am Ende setzen würden). Und anstatt deinen Alias ​​fest zu codieren t Dies ist ein einzelner Host, den Sie mit Hostnamen in Ihrer ssh_config kombinieren können. - dragon788
@ dragon788 ich habe es tatsächlich zu einer Funktion gemacht und $ MYSERVER durch "$ @" ersetzt. Ich benutze diesen immer noch sehr. - w00t


Wenn ich folgendes in die ~ / .bashrc-Datei auf meinem Server lege, startet es eine Bildschirmsitzung, wenn ich mich das erste Mal am Server anmelde oder wenn eine bereits läuft, mich wieder mit dieser Sitzung verbindet.

Ich finde das sehr praktisch:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

4
2018-06-08 14:21



Ich habe das versucht, aber wenn ich es tue screen -ls dann sehe ich keine Bildschirmsitzung - Tarun