Come posso avviare una sessione schermo con un comando su ssh su un server remoto dal mio desktop?


57

Voglio essere in grado di avviare sessioni dello schermo su server remoti da un singolo comando ssh sul mio desktop. Tuttavia, lo schermo sembra necessitare di un terminale, che non è disponibile quando si esegue un comando tramite ssh.

Quindi l'ovvio

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

(come esempio) non funziona e dà

Must be connected to a terminal.

Voglio che ssh avvii il comando sotto una schermata in modo da poter accedere in un secondo momento e allegarlo come farei con una sessione di schermata che avrei avviato manualmente.


A parte questo, puoi colpire questo errore non attraverso un cattivo utilizzo dello schermo. Avevo una funzione shell che stava eseguendo <foo per leggere da un file. Molto più tardi in una sceneggiatura di grandi dimensioni ho provato ad avviare lo schermo. Tutti i metodi seguenti obv. fallito perché il vero colpevole era il dirigente. Uno da tenere a mente. Controlla di non aver ucciso il tuo stdin inavvertitamente.
Neil McGill,

Risposte:


77

Prova a usare l'opzione -t per ssh

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

Da man ssh

-t Forza l'allocazione pseudo-tty. Questo può essere usato per eseguire arbi-
        provare programmi basati su schermo su una macchina remota, che può essere
        molto utile, ad esempio, quando si implementano servizi di menu. Multiple -t
        le opzioni forza l'allocazione di tty, anche se ssh non ha tty locale.

Sto provando lo stesso con tmux ssh -t user@machine tmux attache posso collegare una sessione remota di tmux ma si sbaglia con la codifica dei caratteri. Visualizza solo caratteri ASCII. C'è una correzione per questo?
Macario,

1
@Macario potresti voler aprire una domanda separata per questo, mentre è tangenzialmente correlato mentre lo stai eseguendo con ssh -t, suona più come se fosse correlato all'impostazione LC_ * in modo diverso per l'esecuzione interattiva o non interattiva. Quando si passa una riga di comando a ssh per l'esecuzione, verrà eseguita con l'ambiente non interattivo. È anche possibile che la mancanza della variabile d'ambiente TERM venga trasmessa durante l'esecuzione in modo non interattivo, nel qual caso tmux non avrebbe idea delle capacità effettivamente presenti sul proprio terminale e ricade sul minimo comune denominatore.
Kjetil Joergensen,

Non sto usando SSH ma sto affrontando lo stesso problema. Per favore aiuto. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou

32

Puoi usare:

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

Ciò avvia una schermata separata con un comando in esecuzione su di essa.

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

1
La tua risposta è stata altrettanto buona, peccato che devo scegliere. Forse qualcuno dovrebbe modificare la prima risposta e aggiungere le tue informazioni.
Thomas Vander Stichele,

8

Risposta in ritardo, ma questo è quello che faccio, faccio un alias (chiamiamolo t) che fa questo:

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

Questo dice sshdi disabilitare l'agente e l'inoltro X11 e dice screendi collegarsi a una sessione in esecuzione, avviarne una nuova se necessario, usare ^Zcome comando breakout, usare UTF-8 ed essere furbo sul terminale.

Tutto questo significa che posso aprire un terminale, digitare te questo aprirà la mia sessione su $ MYSERVER. Posso quindi aprire un altro terminale, fare la stessa cosa e ottenere un'altra finestra per la stessa sessione.

È davvero bello avere più finestre terminali nella stessa sessione dello schermo in modo da poter guardare contemporaneamente due schede dello schermo.


1
Ho letto alcune pagine non rispondendo esattamente a quello che stavo cercando, ma l'hai inchiodato. Suppongo che sia screen o tmux sia probabilmente sulla maggior parte dei server in questi giorni, e quelli a cui mi collego sono potenzialmente effimeri, quindi non volevo sbagliare con la bashrc come la maggior parte delle risposte suggerisce. Puoi anche rendere questa una funzione nella tua shell e accettare argomenti come $ host e $ command (che metteresti alla fine). E invece di codificare il tuo alias su tcui è un singolo host, puoi combinarlo con i nomi host nel tuo ssh_config.
dragon788,

@ dragon788 infatti, l'ho resa una funzione ora e ho sostituito $ MYSERVER con "$ @". Lo uso ancora molto.
wgt

4

Inserendo quanto segue nel file ~ / .bashrc sul mio server, avvia una sessione di schermo la prima volta che accedo al server o, se ne è già in esecuzione uno, mi riconnette a quella sessione.

Lo trovo molto utile:

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

Ci ho provato, ma quando lo faccio screen -lsnon vedo alcuna sessione sullo schermo
Tarun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.