2014-07-13 7 views
4

J'ai un terminal qui utilise STDIN 3 (/ proc/xxxx/fd/0 ->/dev/pts/3)exécuter une commande dans un autre terminal via/dev/pts

Donc, si (dans un autre terminal) Je fais:

echo 'do_something_command' > /dev/pts/3 

La commande est montrée dans mon premier terminal (pts 3), mais la commande n'est pas exécutée. Et si (dans ce terminal pts 3) je suis dans un programme attendant des données de stdin, les données sont écrites à l'écran mais le programme ne les capture pas à partir de stdin. Ce que je veux faire est d'exécuter la commande "do_something_command" non seulement l'afficher.

Quelqu'un peut-il m'expliquer ce comportement? Et bien sûr, comment réaliser mon intention ...

+0

Avez-vous besoin d'appuyer sur Entrée dans '/ dev/pts/3' après avoir reçu des données? – Nullpointer

+0

Je l'ai essayé ... si j'entre dans le terminal (pts 3) après avoir envoyé des données à/dev/pts/3, seule l'entrée est reçue. pas la commande "do_something_command". c'est comme si ça n'existait jamais ... seulement montré. – ton

+0

l'intention réelle est de contrôler mpg123 -R à partir d'un autre terminal. mais je suis curieux de connaître la fonctionnalité pts et ce qui peut ou ne peut pas faire avec. et pourquoi. – ton

Répondre

1

Je reçois complètement ce que vous me demandez. Vous pouvez y parvenir en écrivant et en exécutant vous-même un petit morceau de code dans C. Cela devrait vous donner une idée.

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/ioctl.h> 
#include <string.h> 
#include <unistd.h> 

void print_help(char *prog_name) { 
     printf("Usage: %s [-n] DEVNAME COMMAND\n", prog_name); 
     printf("Usage: '-n' is an optional argument if you want to push a new line at the end of the text\n"); 
     printf("Usage: Will require 'sudo' to run if the executable is not setuid root\n"); 
     exit(1); 
} 

int main (int argc, char *argv[]) { 
    char *cmd, *nl = "\n"; 
    int i, fd; 
    int devno, commandno, newline; 
    int mem_len; 
    devno = 1; commandno = 2; newline = 0; 
    if (argc < 3) { 
     print_help(argv[0]); 
    } 
    if (argc > 3 && argv[1][0] == '-' && argv[1][1] == 'n') { 
     devno = 2; commandno = 3; newline=1; 
    } else if (argc > 3 && argv[1][0] == '-' && argv[1][1] != 'n') { 
     printf("Invalid Option\n"); 
     print_help(argv[0]); 
    } 
    fd = open(argv[devno],O_RDWR); 
    if(fd == -1) { 
     perror("open DEVICE"); 
     exit(1); 
    } 
    mem_len = 0; 
    for (i = commandno; i < argc; i++) { 
     mem_len += strlen(argv[i]) + 2; 
     if (i > commandno) { 
      cmd = (char *)realloc((void *)cmd, mem_len); 
     } else { //i == commandno 
      cmd = (char *)malloc(mem_len); 
     } 

     strcat(cmd, argv[i]); 
     strcat(cmd, " "); 
    } 
    if (newline == 0) 
     usleep(225000); 
    for (i = 0; cmd[i]; i++) 
     ioctl (fd, TIOCSTI, cmd+i); 
    if (newline == 1) 
     ioctl (fd, TIOCSTI, nl); 
    close(fd); 
    free((void *)cmd); 
    exit (0); 
} 

Compilez-le et exécutez-le avec les autorisations sudo. Par exemple, si vous voulez exécuter une commande sur /dev/pts/3, faites simplement sudo ./a.out -n /dev/pts/3 whoami, exécute un whoami sur /dev/pts/3. Ce code a été complètement pris de this page.

0

Vous semblez utiliser les citations incorrectes autour de la commande. Supprimez les guillemets et la commande echo, ou utilisez echo et back-ticks (`).

Essayez:

echo `date` > /dev/pts/3 

ou tout simplement

date > /dev/pts/3 

Notez que tout fonctionne sur/dev/pts/3 ne serait pas en mesure de lire ce qui apparaît "derrière".

+2

Merci, mais ce n'est pas ce que je cherche ... votre suggestion redirige uniquement la sortie de la commande vers/dev/pts/3, ce que j'essaie de faire est d'exécuter la commande dans/dev/pts/3. – ton

Questions connexes