web-dev-qa-db-fra.com

Comment envoyer une commande de terminal à un terminal TTY

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?

8
Luis Alvarado

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'
7
Thor

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/

10
user61928