Cách gửi lệnh đầu cuối đến thiết bị đầu cuối TTY


8

Tôi đang tìm cách để gửi một lệnh đã thực hiện đến một thiết bị đầu cuối TTY. Ví dụ: chúng ta hãy nói rằng tôi mở gnome-terminal và trên cửa sổ tôi gõ sudo aptitude update && sudo aptitude upgrade.

Làm cách nào tôi có thể gửi cái này đến thiết bị đầu cuối TTY thay vì làm việc với nó trong môi trường GUI TTY7?

Câu trả lời:


7

Tôi khuyên bạn không nên làm điều đó trực tiếp, nhưng sử dụng bộ ghép kênh đầu cuối, chẳng hạn như tmux, như là một giữa.

Trong thiết bị đầu cuối sẽ nhận lệnh bắt đầu tmux với mã định danh:

tmux new-session -s MYSES

Gửi lệnh cho nó với:

tmux send-keys -t MYSES "sudo aptitude update && sudo aptitude upgrade"$'\n'

nếu bạn sử dụng byobu thì nó cũng hoạt động! Và bạn có thể bỏ MYSES -t nếu tình cờ đang chạy một phiên mà bạn không biết tên của. Thnx!
ExploWare

10

Đây là một chương trình sẽ giúp:

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

Sao chép mã trên vào một số tệp C (Ví dụ: ttyecho.c). Chạy lệnh sau trong thư mục bạn đã tạo tệp C để biên dịch mã.

make ttyecho

Sao chép tệp này vào thư mục bin trong Thư mục chính của bạn. Tạo thư mục nếu nó không tồn tại. Đó là một thực hành tốt để giữ tất cả các nhị phân / thực thi tùy chỉnh trong thư mục bin này.

Bắt đầu một thiết bị đầu cuối khác hoặc chuyển sang bất kỳ thiết bị đầu cuối mở nào khác mà bạn muốn kiểm soát và thực hiện lệnh tty. Bạn có thể thấy một đầu ra mẫu bên dưới.

@~$ tty

/ dev / điểm / 5

Bây giờ để thực thi lệnh trên / dev / pts / 5 , hãy chạy lệnh sau trong thiết bị đầu cuối kiểm soát / gốc.

sudo ttyecho -n /dev/pts/5 ls

Bạn sẽ thấy lệnh ls được thực thi trong / dev / pts / 5 . Các -n tùy chọn làm cho ttyecho gửi một dòng mới sau khi lệnh, do đó lệnh được thực thi và không chỉ chèn vào. Tiện ích này có thể Infact được sử dụng để gửi bất kỳ dữ liệu đến thiết bị đầu cuối khác Đối với ví dụ, bạn có thể mở vim trong / dev / pts / 5 và sau đó chạy lệnh sau trong việc kiểm soát thiết bị đầu cuối để gây vim để thoát trong / dev / pts / 5 .

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

Để tránh sử dụng sudo mọi lúc, để lệnh có thể dễ dàng được script, hãy thay đổi chủ sở hữu / quyền của tệp thực thi này bằng các lệnh sau.

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

NB: Đặt bit setuid có thể trở thành rủi ro bảo mật.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.