Envoi de texte/commande dans un terminal

Fermé
Lineo - 13 août 2012 à 12:44
 Utilisateur anonyme - 28 oct. 2012 à 16:23
Bonjour,

J'ai une question bien différente de mon post précédent à vous poser car je n'arrive pas non plus à trouver une solution .

Alors je vais donner directement un exemple :
Si j'ouvre un terminal, puis un autre, et que dans ce 2eme terminal, je vais dans /proc/PID_DU_PREMIER_TERMINAL/fd
Dans ce répertoire il y a les liens vers les descripteurs ouverts du premier terminal : 0,1,2,255 (qui pointent tous dans mon exemple vers /dev/pts/0)
Je peux alors faire par exemple : echo ls >0
Et "ls" + un retour à la ligne s'affichent bien sur mon premier terminal.

Maintenant, comment faire pour que la commande "ls" s'exécute bien dans mon premier terminal au lieu de juste s'afficher ?
Comme si j'avais tapé ls et validé par la toucher "Entrée"

Je ne trouve pas la solution
Sauriez-vous m'aider ?

Merci
:-)
A voir également:

6 réponses

Utilisateur anonyme
13 août 2012 à 12:58
simplement de la même manière
ls $repertoire > /proc/$pid/fd/0
1
Ben non là le "ls" est exécuté dans le premier terminal, et le résultat affiché dans le second.
Alors que je cherche à exécuter ls dans le premier terminal, comme si je l'avais saisi au clavier dedans.

En gros le terminal 1 écoute ce qui est tapé au clavier sur STDIN. Je souhaite envoyer ma commande dans ce STDIN depuis mon autre terminal.
Mais je ne sais pas comment lui dire que j'ai appuyé sur "Entrée"
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
14 août 2012 à 09:59
Salut,

Si tu nous expliquais la finalité de la chose, peut être serions-nous plus à même de trouver/d'envisager une solution, non ? ;-\
1
Salut,
Pour l'instant je n'ai pas d'autre finalité que celle là, j'aimerais juste savoir comment faire afin de mieux comprendre le fonctionnement d'un terminal avec /bin/bash

D'après ce que je sais un processus ouvre par défaut 3 descripteurs : STDIN, STDOUT, et STDERR, mais dans le cas d'un terminal qui lance un bash, là le STDIN est connecté à /dev/null pour le terminal, et bash est connecté à un /dev/pts/1 -> qui serait géré par le noyau et ensuite "connecté" au clavier ?. pourtant dans le cas d'une connexion par SSH, il y a ce pseudo terminal mais on n'utilise plus le clavier physique de la machine, d'où ma déduction : on peut passer outre et envoyer directement les commandes depuis un flux pour qu'elles soient interprétées comme si elles venaient du "circuit" connecté au clavier.

Quand on fait une redirection vers ce /dev/pts/1, le texte s'affiche bien dans le terminal mais impossible de "valider" donc il faudrait un code spécial pour simuler "Entrée" ?

Au niveau de bash, J'ai remarqué qu'il pouvait traiter du texte avec saut de ligne et que s'il le cache au travers des guillemets qui n'ont de valeur que pour l'utilisateur qui les saisit et les voit, bash lui utilise le caractère \0 pour séparer, voir peut être d'autres.
Donc le fait qu'il passe une ligne au lieu de valider la commande ne m'étonne pas, et j'aimerais savoir comment il faut faire cette touche "Entrée" en reproduisant le signal/la séquence qui est envoyée quand on le fait depuis un clavier.

De plus avec un bash -s, on peut bien passer les commandes sur l'entrée standard, en séparant par des saut de ligne pour valider et là ça marche ! Et si on veut faire du multilignes, il suffit de mettre des guillemets "" exactement comme on doit le faire quand on saisit au clavier ! Alors comment faire cela avec un bash déjà ouvert dans un terminal qui écoute bien quelquepart ?



Savoir faire cela m'aiderait beaucoup à comprendre le fonctionnement de linux, des pseudos terminaux et des interpréteurs de commandes comme bash. Dans l'immédiat je n'ai pas d'autre finalité directe, mais ça pourra toujours servir un jour, je n'en doute pas.
Désolé si je ne suis pas très clair dans mes explications plus haut, le principal est dans ces dernières lignes qui résument la finalité de la chose.
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
14 août 2012 à 15:07
Ok, merci pour tous ces détails.
Honnêtement je pensais que c'était en rapport avec ton autre sujet ;-\

J'ai peut être une piste, avec la commande netcat ;-)
0
Merci je viens d'aller voir le lien
Mais je ne vois pas trop le rapport avec mon problème :/
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
14 août 2012 à 16:41
Ben tu peux déjà faire communiquer 2 shells ;-)

Ce que tu tapes sur un terminal (A) est exécuté sur l'autre (B), l'affichage se faisant sur A.

Ce n'est pas exactement ce que tu demandes, mais c'est déjà une petite avancée ;-))
0
Oui c'est pas du tout ce que je demandais :))
Je souhaite simuler l'envoi d'une commande venant du clavier à un terminal.

Si la chaine ressemble à
clavier-->driver-->noyau-->FD-->pseudo-terminal-->bash
Il me faut faire : "commande"+[TOUCHE ENTRÉE] > FD

Avec ton astuce netcat c'est juste un programme(le serveur) qui exécute des commandes et affiche le résultat dans son terminal.

Mais merci en tout cas d'essayer de m'aider :)
J'ai l'impression que je demande un truc compliqué ou sans solution :(

En tout cas si c'est pas possible entre un même utilisateur, root doit pouvoir le faire d'une façon ou d'une autre. root peut tout faire
0
Utilisateur anonyme
28 oct. 2012 à 16:23
le terminal est "inerte", il ne peut pas interpréter des commandes (c'est la tâche du shell), il ne sait qu'afficher le résultat des commandes.

ssh passe les commandes à un shell, pas à un terminal.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
13 août 2012 à 13:25
Salut,

eval ls > /proc/$pid/fd/0
0
Salut,
Ben c'est pareil, c'est exécuté dans le terminal, et seul le résultat est affiche dans l'autre
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
13 août 2012 à 13:46
Oups désolé, je me suis emmêlé les pinceaux ;-\
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
«le "ls" est exécuté dans le premier terminal, et le résultat affiché dans le second.
Alors que je cherche à exécuter ls dans le premier terminal, comme si je l'avais saisi au clavier dedans.
»
J'ai du sable dans les engrenages : je ne vois la différence entre une commande dont on envoie le résultat dans un autre terminal, et une commande envoyée et exécutée dans un autre terminal.
Le résultat de la commande est affiché sur le deuxième terminal !

quelle est la finalité de la manipulation ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
13 août 2012 à 19:33
J'ai eu du mal aussi, mais ouvre 2 teminaux et place-toi dans 2 répertoires différents, fais un "pwd" et envois-le dans l'autre, c'est la répertoire du 1er qui s'affiche alors que notre ami voudrait que ce soit celui du terminal qui reçoit...

Je crois que la seule façon de faire ça c'est en lançant un screen auparavant ;-\
0
désolé si je n'étais pas clair

La finalité de la manip c'est de faire exécuter une commande par un terminal, mais depuis un autre, peu importe la commande

Supposons que je sois dans mon 2eme terminal :
# echo $$
6666
echo 'echo $$' >/proc/5555/fd/0

Et dans autre terminal de PID 5555, je dois voir :
# echo $$
5555

exactement comme si je l'avais saisi au clavier
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
14 août 2012 à 08:27
en ouvrant un nouveau terminal ?
xterm -e 'echo $$;'"$SHELL"
0
Non dans un terminal déjà ouvert :)
0
erratum41 Messages postés 1 Date d'inscription dimanche 28 octobre 2012 Statut Membre Dernière intervention 28 octobre 2012
Modifié par erratum41 le 28/10/2012 à 16:39
sous ubuntu gnome
ouvrir bash :gnome-terminal --geometry 120x20+50+51
repere son id :ps -x|grep "bash"
envoi commande :ls >> /dev/pts/[numero bash]
ç'a peut aider a+
0