Exécuter la commande dans le terminal actif distant

10

Supposons que vous ayez un émulateur de terminal (T1) ouvert avec un PID de 6350.

Depuis un autre terminal, tapez cette commande (C1):

echo "ls\n" > /proc/6350/fd/0

Cela écrit lset la nouvelle ligne en T1 mais ne l'exécute pas. Pourquoi?

J'ai également essayé d'utiliser cat|bashavec echo "ls\n" > /proc/catid/fd/0mais il n'est toujours pas exécuté.

Comment puis-je répercuter la commande dans un autre terminal et la faire exécuter?

réponse possible:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

Dans ce cas, vous ne pouvez plus écrire directement dans le terminal (tout est affiché de la même manière que la commande (C1) affiché dans ce terminal.

rvlander
la source
J'ai lu cela, mais ce n'est pas très utile.
rvlander
1
Cela peut ne pas être "utile" comme pour vous donner un moyen de le faire, mais cela répond à votre question: vous ne pouvez pas. Vous pouvez nous dire l'objectif final que vous essayez d'atteindre et voir s'il existe un autre moyen.
Kevin
Ok vous ne pouvez pas mais alors pourquoi le texte est affiché dans l'autre terminal?
rvlander
parce que vous envoyez le texte à l'interface du terminal, pas au shell.
rush

Réponses:

11

Il existe un utilitaire de ligne de commande appelé ttyechoqui peut envoyer une commande à un autre terminal (tty / pts) et exécuter la commande.

sudo ttyecho -n /dev/pts/5 ls

Voir: Utilitaire pour envoyer des commandes ou des données à d'autres terminaux (tty / pts)

Voir aussi: ttyechocode source sur github .

Une autre commande tty intéressante est selectorun matcher interactif en temps réel dans la console qui met à jour le tampon d'entrée tty.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

Voir: sélecteur - RECHERCHE DYNAMIQUE EN CONSOLE

tchad
la source
Malheureusement, le lien vers ttyechole code source sur github semble être rompu. Cependant, il semble être disponible à la place sur github.com/osospeed/ttyecho .
Wilson F
7

Lorsque vous émettez une écriture vers /dev/pts/X( /proc/6350/fd/0, 1et 2n'est qu'un lien symbolique vers cela), ce qui se passe est exactement la même chose que lorsque le processus 6350(ou l'un de ses enfants, convenablement bifurqué) sort quelque chose: il écrit sur le terminal.

Si vous essayez de lire à partir de cet appareil ( cat < /dev/pts/X), des choses géniales se produiront. Vous devriez voir apparaître les choses que vous tapez dans le shell d'origine. (Très probablement seulement après la première nouvelle ligne que vous avez tapée - je suppose que le programme terminal ( xtermou tout ce que vous utilisez) fait un tampon de ligne, et le 6350shell qui a été bloqué readobtient ce morceau; alors soit le shell pourrait, soit pourrait non, gagnez les lectures suivantes, mais je peux très bien me tromper sur ce point.)

Le truc, c'est que lorsque vous lisez ou écrivez sur cet appareil, vous ne parlez pas à l'autre shell qui l'utilise. Vous parlez à l'émulateur de terminal ( xtermpar exemple). Seul l'émulateur de terminal peut injecter des données dans ce canal (ce que le shell lit), et tout ce que le shell écrit va au terminal. Attacher un deuxième shell ne change rien à cela.

Si vous souhaitez injecter des commandes dans ce 6530processus, il devra le faire via le terminal (que ce soit une application X11 ou autre).

Lecture recommandée: Quelle est la différence exacte entre un «terminal», un «shell», un «tty» et une «console»?

Tapis
la source
1
Fait intéressant, en lisant les pts ( cat /dev/pts/x, vous n'avez pas besoin <), je reçois les lettres en alternance stricte entre les terminaux.
Kevin
Ne pas utiliser la redirection ne change probablement pas grand-chose. J'obtiens une sortie non prévisible de toute façon.
Mat
Intéressant, merci pour le lien. Il en /proc/6350/fd/0est de même pour un lien symbolique vers le parent stdin, process 6350qui est un terminal. Je suppose que c'est la même chose pour les applications fenêtrées?
rvlander