Je cherche un moyen d’envoyer une commande exécutée à un terminal TTY. Par exemple, disons que j'ouvre le terminal gnome et que je tape Sudo aptitude update && Sudo aptitude upgrade
sur la fenêtre.
Comment puis-je envoyer ceci à un terminal TTY au lieu de l'utiliser dans l'environnement graphique TTY7?
Je recommanderais de ne pas le faire directement, mais d'utiliser un multiplexeur de terminal, tel que tmux, comme intermédiaire.
Dans le terminal qui devrait recevoir la commande, démarrez tmux avec un identifiant:
tmux new-session -s MYSES
Envoyez-lui des commandes avec:
tmux send-keys -t MYSES "Sudo aptitude update && Sudo aptitude upgrade"$'\n'
Ceci est 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. Il est recommandé de conserver tous les fichiers binaires/exécutables personnalisés dans ce répertoire bin.
Démarrez un autre terminal ou basculez sur un autre terminal ouvert que vous souhaitez contrôler et exécutez 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 permet à ttyecho d'envoyer une nouvelle ligne après la commande, de sorte que la commande soit exécutée et non simplement insérée. Cet utilitaire peut en fait être utilisé pour envoyer des données à d’autres terminaux. Par exemple, vous pouvez ouvrir vim dans /dev/pts/5 , puis exécuter le programme suivant: commande dans le terminal de contrôle pour forcer vim à quitter /dev/pts/5 .
Sudo ttyecho -n /dev/pts/5 :q
Pour éviter d'utiliser Sudo tout le temps et pour 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/