Cara mengirim perintah terminal ke terminal TTY

8

Saya mencari cara untuk mengirim perintah yang dieksekusi ke terminal TTY. Sebagai contoh, katakanlah saya membuka terminal gnome dan pada jendela saya ketik sudo aptitude update && sudo aptitude upgrade.

Bagaimana saya bisa mengirim ini ke terminal TTY alih-alih bekerja dengannya di lingkungan GUI TTY7?

Luis Alvarado
sumber

Jawaban:

7

Saya akan merekomendasikan tidak melakukan itu secara langsung, tetapi gunakan terminal multiplexer, seperti tmux, sebagai di antara keduanya.

Di terminal yang seharusnya menerima perintah start tmux dengan pengenal:

tmux new-session -s MYSES

Kirim perintah ke sana dengan:

tmux send-keys -t MYSES "sudo aptitude update && sudo aptitude upgrade"$'\n'
Thor
sumber
jika Anda menggunakan byobu ini berfungsi juga! Dan Anda dapat menghapus -t MYSES jika kebetulan menjalankan sesi sudah Anda tidak tahu nama. Thnx!
ExploWare
10

Ini adalah program yang akan membantu:

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

Salin kode di atas ke beberapa file C (Untuk mis. Ttyecho.c). Jalankan perintah berikut di direktori yang Anda buat file C untuk mengkompilasi kode.

make ttyecho

Salin file ini ke direktori tempat sampah di bawah Direktori Beranda Anda. Buat direktori jika tidak ada. Ini adalah praktik yang baik untuk menjaga semua binari / executable khusus dalam direktori bin ini.

Mulai terminal lain atau pindah ke terminal terbuka lain yang ingin Anda kendalikan dan jalankan perintah tty. Anda dapat melihat contoh output di bawah ini.

@~$ tty

/ dev / pts / 5

Sekarang untuk menjalankan perintah pada / dev / pts / 5 , jalankan perintah berikut di terminal pengendali / asli.

sudo ttyecho -n /dev/pts/5 ls

Anda akan melihat bahwa perintah ls dijalankan di / dev / pts / 5 . The -n pilihan membuat ttyecho mengirim baris baru setelah perintah, sehingga perintah dijalankan dan tidak hanya dimasukkan. Utilitas ini dapat digunakan untuk mengirim data apa pun ke terminal lain. Misalnya, Anda dapat membuka vim di / dev / pts / 5 dan kemudian menjalankan perintah berikut di terminal pengendali untuk menyebabkan vim keluar di / dev / pts / 5 .

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

Untuk menghindari penggunaan sudo sepanjang waktu, sehingga perintahnya mudah skrip, ubah pemilik / izin yang dapat dieksekusi ini dengan menggunakan perintah berikut.

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

NB: Mengatur bit setuid dapat menjadi risiko keamanan.

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

Eyal Levin
sumber