So senden Sie einen Terminalbefehl an ein TTY-Terminal

8

Ich suche nach einer Möglichkeit, einen ausgeführten Befehl an ein TTY-Terminal zu senden. Nehmen wir zum Beispiel an, ich öffne das Gnome-Terminal und tippe in das Fenster, das ich tippe sudo aptitude update && sudo aptitude upgrade.

Wie kann ich dies an ein TTY-Terminal senden, anstatt damit in der TTY7-GUI-Umgebung zu arbeiten?

Luis Alvarado
quelle

Antworten:

7

Ich würde empfehlen, dies nicht direkt zu tun, sondern einen Terminal-Multiplexer wie tmux als Zwischenstation zu verwenden.

In dem Terminal, das den Befehl erhalten soll, starten Sie tmux mit einer Kennung:

tmux new-session -s MYSES

Senden Sie Befehle an:

tmux send-keys -t MYSES "sudo aptitude update && sudo aptitude upgrade"$'\n'
Thor
quelle
Wenn Sie byobu verwenden, funktioniert dies auch! Und Sie können -t MYSES löschen, wenn gerade eine Sitzung ausgeführt wird, deren Namen Sie nicht kennen. Danke!
ExploWare
10

Dies ist ein Programm, das helfen wird:

#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);
}

Kopieren Sie den obigen Code in eine C-Datei (z. B. ttyecho.c). Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem Sie die C-Datei erstellt haben, um den Code zu kompilieren.

make ttyecho

Kopieren Sie diese Datei in das bin-Verzeichnis unter Ihrem Home-Verzeichnis. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Es wird empfohlen, alle benutzerdefinierten Binärdateien / ausführbaren Dateien in diesem bin-Verzeichnis zu speichern.

Starten Sie ein anderes Terminal oder wechseln Sie zu einem anderen offenen Terminal, das Sie steuern und den Befehl tty ausführen möchten. Unten sehen Sie eine Beispielausgabe.

@~$ tty

/ dev / pts / 5

Führen Sie nun den folgenden Befehl im steuernden / ursprünglichen Terminal aus , um einen Befehl für / dev / pts / 5 auszuführen.

sudo ttyecho -n /dev/pts/5 ls

Sie werden sehen, dass der Befehl ls in / dev / pts / 5 ausgeführt wird . Die -n Option wird eine neue Zeile nach dem Befehl ttyecho senden, so dass der Befehl nicht nur eingefügt ausgeführt wird. Dieses Dienstprogramm kann infact verwendet werden, um Daten an andere Terminals zu senden. Sie können beispielsweise vim in / dev / pts / 5 öffnen und dann den folgenden Befehl im steuernden Terminal ausführen, damit vim in / dev / pts / 5 beendet wird .

sudo ttyecho -n /dev/pts/5 :q

Um zu vermeiden, dass sudo ständig verwendet wird, damit der Befehl leicht skriptfähig ist, ändern Sie die Eigentümer / Berechtigungen dieser ausführbaren Datei mit den folgenden Befehlen.

sudo chown root:root ttyecho
sudo chmod u+s ttyecho

NB: Das Setzen des Setuid-Bits kann zu einem Sicherheitsrisiko werden.

Quelle: http://www.humbug.in/2010/utility-to-send-commands-or-data-to-other-terminals-ttypts/

Eyal Levin
quelle