Comment envoyer une commande de terminal à un terminal TTY

8

Je cherche un moyen d'envoyer une commande exécutée à un terminal TTY. Par exemple, disons que j'ouvre le gnome-terminal et sur la fenêtre que je tape sudo aptitude update && sudo aptitude upgrade.

Comment puis-je envoyer cela à un terminal TTY au lieu de travailler avec lui dans l'environnement GUI TTY7?

Luis Alvarado
la source

Réponses:

7

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 start 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'
Thor
la source
si vous utilisez byobu, cela fonctionne aussi! Et vous pouvez supprimer le -t MYSES s'il se trouve que vous exécutez déjà une session dont vous ne connaissez pas le nom. Thnx!
ExploWare
10

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/

Eyal Levin
la source