Forum Programmation.shell Détecter des pipes à travers ssh.

Posté par  .
Étiquettes : aucune
1
9
nov.
2011

Bonjour,
J’ai écris ceci pour détecter si mon script est utilisé dans un terminal ou via un pipe.

#!/bin/bash
echo -n "STDIN: "; [ -t 0 ] && echo TERM || echo PIPE
echo -n "STDOUT:: "; [ -t 1 ] && echo TERM || echo PIPE
echo -n "STDERR: "; [ -t 2 ] && echo TERM || echo PIPE


Utilisation en local :
$ ./term.sh
STDIN: TERM
STDOUT:: TERM
STDERR: TERM
$ echo toto | ./term.sh
STDIN: PIPE
STDOUT:: TERM
STDERR: TERM
$ ./term.sh | grep STD
STDIN: TERM
STDOUT:: PIPE
STDERR: TERM
$ 


Via ssh :
$ ssh localhost ./term.sh
login@localhost password:
##################
# BASHRC running #
##################
STDIN: PIPE
STDOUT:: PIPE
STDERR: PIPE
$ ssh -t localhost ./term.sh
login@localhost password:
##################
# BASHRC running #
##################
STDIN: TERM
STDOUT:: TERM
STDERR: TERM
Connection to localhost closed.
$ echo toto | ssh -t localhost ./term.sh
login@localhost password:
##################
# BASHRC running #
##################
STDIN: PIPE
STDOUT:: PIPE
STDERR: PIPE
$ 

Donc question, comment dire à ssh de laisser les terminaux comme il les trouve ?
J’ai cherché du côté de tput, mais je n’ai rien trouvé de valable :'(

Question subsidiaire, comment empêcher l’exécution du bash(rc|_login) ?

  • # un bout de reponse

    Posté par  . Évalué à 2.

    pour la question de pipe/term je ne sais pas mais

    Question subsidiaire, comment empêcher l’exécution du bash(rc|_login) ?

    je penses qu'il suffirait, si l'utilisateur ne fait que de l'accès distant (via ssh)
    de forcer son shell à être ton script.

    en tant que foot sur la machine serveur,
    chsh user /usr/local/bin/monscript.sh

    ainsi quand l'utilisateur se connecte, il lance forcement monscript.sh
    sans lancer bash si le script ne le lances pas.

    y a peut-être aussi des options au serveur SSH pour faire des trucs plus complexes

  • # pour le bash sans conf :

    Posté par  (site web personnel, Mastodon) . Évalué à 2.

    Salut,

    Question subsidiaire, comment empêcher l’exécution du bash(rc|_login) ?

    bash -norc
    
    

    On ne peut pas mettre d'array dans le string...

  • # D'autres essais

    Posté par  . Évalué à 2.

    #> echo toto | ssh -t localhost ~/term.sh
    Pseudo-terminal will not be allocated because stdin is not a terminal.
    STDIN: PIPE
    STDOUT:: PIPE
    STDERR: PIPE
    
    

    Dans le cas qui te pose souci, j'ai un message en plus.

    Et dans ce cas là, on peut faire :

    #> echo toto | ssh -t -t localhost /home_shared/fredd/term.sh
    toto
    STDIN: TERM
    STDOUT:: TERM
    STDERR: TERM
    
    

    ou alors
    #>ssh t localhost "echo toto | /home_shared/fredd/term.sh"
    STDIN: PIPE
    STDOUT:: TERM
    STDERR: TERM
    Connection to localhost closed.
    
    

    mais j'ai peur qu'aucun des deux ne te soit utile !

    En clair, ssh laisse les terminaux comme il les trouvent.
    Le truc, c'est qu'il doit en créer (-t) un tty si tu lui demandes ou pas (-T ou rien) de l'autre côté du tunnel ssh.
    Dans le second cas, il redirige tout pour te ressortir les entrées/sorties de ce côté du tunnel. Dans le premier, il alloue un terminal dont il redirige les I/O et exécute ton programme dedans.

    • [^] # Re: D'autres essais

      Posté par  . Évalué à 1.

      Tiens, c’est rigolo, dans ton premier exemple, je n’ai pas la phrase :
      « Pseudo-terminal will not be allocated because stdin is not a terminal. »

      Je n’ai pas le choix de la version ssh. Mais ça explique sans doute nos différences.

      $ ssh -v
      OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
      …
      $ 
      
      

      Sinon, je voulais juste que ssh simule sur le serveur distant le même type de terminal qu’il a lui, mais avec une granularité de chacune des sorties, pas globalement.

      Je n’ai rien trouvé sur le net. Me demande si je vais pas posé la question sur la ML de openssh.

    • [^] # Pareil ICI pour les tests du premier post

      Posté par  . Évalué à 2.

      en local sur le serveur

      _/tmp/test.sh
      STDIN: TERM
      STDOUT:: TERM
      STDERR: TERM

      à distance :
      Client : OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011 (OSX)
      Serveur : OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 Mar 2009 (Ubuntu 10.04)

      en ssh depuis ma machine vers mon serveur :

      ssh example.com /tmp/test.sh
      STDIN: PIPE
      STDOUT:: PIPE
      STDERR: PIPE

      echo toto | ssh -t example.com /tmp/test.sh
      Pseudo-terminal will not be allocated because stdin is not a terminal.
      STDIN: PIPE
      STDOUT:: PIPE
      STDERR: PIPE

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.