Comment lancer une session d'écran avec une commande sur ssh sur un serveur distant à partir de mon bureau?

57

Je souhaite pouvoir lancer des sessions d'écran sur des serveurs distants à partir d'une seule commande ssh sur mon bureau. Cependant, l'écran semble avoir besoin d'un terminal, qui n'est pas disponible lors de l'exécution d'une commande via ssh.

Donc l'évidence

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

(à titre d'exemple) ne fonctionne pas, et donne

Must be connected to a terminal.

Je veux que ssh lance la commande sous un écran afin que je puisse me connecter ultérieurement et l'attacher comme je le ferais à une session d'écran que j'aurais lancée manuellement.

Thomas Vander Stichele
la source
En passant, vous pouvez frapper cette erreur sans passer par une mauvaise utilisation de l'écran. J'avais une fonction shell qui exécutait exec <foo pour lire à partir d'un fichier. Beaucoup plus tard, dans un gros script, j'ai essayé de lancer l'écran. Toutes les méthodes ci-dessous obv. échoué car le véritable coupable était l'exec. Un à garder à l'esprit. Vérifiez que vous n'avez pas tué votre propre stdin par inadvertance.
Neil McGill

Réponses:

77

Essayez d'utiliser l'option -t pour ssh

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

De l'homme ssh

-t Force l'allocation de pseudo-tty. Ceci peut être utilisé pour exécuter des arbitrages
        trary programmes basés sur l’écran sur une machine distante, qui peuvent être
        très utile, par exemple, lors de la mise en œuvre de services de menu. Plusieurs -t
        options force l'allocation de tty, même si ssh n'a pas de tty local.
Kjetil Joergensen
la source
J'essaye la même chose avec tmux ssh -t user@machine tmux attachet je peux attacher une session à distance de tmux mais cela dérange avec l'encodage de caractère. Il affiche uniquement les caractères ascii. Y at-il un correctif pour cela?
Macario
1
@ Macario, vous souhaiterez peut-être ouvrir une question distincte à ce sujet. Bien qu'elle soit liée de manière tangentielle lorsque vous l'exécutez avec ssh -t, elle ressemble davantage à la définition de LC_ * différemment pour l'exécution interactive plutôt que non interactive. Lorsque vous passez une ligne de commande à ssh pour qu'elle s'exécute, elle sera exécutée avec l'environnement non interactif. Il est également possible que l'absence de la variable d'environnement TERM ne soit pas transmise lors d'une exécution non interactive. Dans ce cas, tmux n'aurait aucune idée des capacités réelles de votre terminal et retomberait sur le plus petit dénominateur commun.
Kjetil Joergensen
Je n'utilise pas ssh mais je suis confronté au même problème. S'il vous plaît aider. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Vous pouvez utiliser:

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

Cela commence un écran détaché avec une commande en cours d'exécution sur celui-ci.

   -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
la source
1
Votre réponse était également bonne, dommage que je doive choisir. Peut-être que quelqu'un devrait modifier la première réponse et ajouter vos informations.
Thomas Vander Stichele
8

Réponse tardive, mais voici ce que je fais, je fais un alias (appelons-le t) qui fait ceci:

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

Cela indique sshde désactiver l'agent et le transfert X11, et screend'attacher à une session en cours, d'en démarrer une nouvelle si nécessaire, de l'utiliser ^Zcomme commande de dérivation, d'utiliser UTF-8 et de faire preuve d'intelligence concernant le terminal.

Tout cela signifie que je peux ouvrir un terminal, taper tet cela ouvrira ma session d’écran sur $ MYSERVER. Je peux alors ouvrir un autre terminal, faire la même chose et obtenir une autre fenêtre pour la même session.

Il est vraiment agréable d’avoir plusieurs fenêtres de terminal pour la même session d’écran, ce qui vous permet de regarder deux onglets d’écran en même temps.

w00t
la source
1
J'ai lu pas mal de pages ne répondant pas exactement à ce que je cherchais, mais vous avez réussi. Je suppose que screen ou tmux sont probablement présents sur la plupart des serveurs ces temps-ci, et ceux auxquels je me connecte sont potentiellement éphémères. Je ne voulais donc pas jouer avec le bashrc comme le suggèrent la plupart des réponses. Vous pouvez également en faire une fonction de votre shell et accepter des arguments tels que $ host et $ command (que vous placeriez à la fin). Et plutôt que de coder en dur votre alias tqui est un hôte unique, vous pouvez le combiner avec des noms d’hôtes dans votre ssh_config.
dragon788
@ dragon788 en effet, j'en ai fait une fonction maintenant et j'ai remplacé $ MYSERVER par "$ @". J'utilise encore souvent celui-ci.
w00t
4

En insérant le texte suivant dans le fichier ~ / .bashrc sur mon serveur, il démarre une session d'écran la première fois que je me connecte au serveur ou, s'il en existe déjà une, me reconnecte à cette session.

Je trouve cela très pratique:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
la source
J'ai essayé ça, mais quand je vois screen -lsça, je ne vois aucune session d'écran
Tarun