Il s'agit d'un programme qui aidera:
#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);
}
Copiez le code ci-dessus dans un fichier C (par exemple, ttyecho.c). Exécutez la commande suivante dans le répertoire dans lequel vous avez créé le fichier C pour compiler le code.
make ttyecho
Copiez ce fichier dans le répertoire bin sous votre répertoire personnel. Créez le répertoire s'il n'existe pas. C'est une bonne pratique de conserver tous les binaires / exécutables personnalisés dans ce répertoire bin.
Démarrez un autre terminal ou basculez vers tout autre terminal ouvert que vous souhaitez contrôler et exécuter la commande tty. Vous pouvez voir un exemple de sortie ci-dessous.
@~$ tty
/ dev / pts / 5
Maintenant, pour exécuter une commande sur / dev / pts / 5 , exécutez la commande suivante dans le terminal de contrôle / d'origine.
sudo ttyecho -n /dev/pts/5 ls
Vous verrez que la commande ls est exécutée dans / dev / pts / 5 . L' option -n oblige ttyecho à envoyer une nouvelle ligne après la commande, afin que la commande soit exécutée et pas seulement insérée. Cet utilitaire peut être utilisé pour envoyer des données à d'autres terminaux. Par exemple, vous pouvez ouvrir vim dans / dev / pts / 5 puis exécuter la commande suivante dans le terminal de contrôle pour provoquer la sortie de vim dans / dev / pts / 5 .
sudo ttyecho -n /dev/pts/5 :q
Pour éviter d'utiliser sudo tout le temps, afin que la commande soit facilement scriptable, modifiez les propriétaires / autorisations de cet exécutable à l'aide des commandes suivantes.
sudo chown root:root ttyecho
sudo chmod u+s ttyecho
NB: La définition du bit setuid peut devenir un risque pour la sécurité.
Source: http://www.humbug.in/2010/utility-to-send-commands-or-data-to-other-terminals-ttypts/