如何将终端命令发送到TTY终端

我正在寻找一种方法将执行的命令发送到TTY终端。 例如,让我们说我打开gnome-terminal并在窗口上输入sudo aptitude update && sudo aptitude upgrade

如何将其发送到TTY终端而不是在TTY7 GUI环境中使用它?

我建议不要直接这样做,但是使用终端多路复用器(如tmux)作为中间件。

在应该接收命令的终端中,使用标识符启动tmux:

 tmux new-session -s MYSES 

向它发送命令:

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

这是一个有助于:

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

将上面的代码复制到某个C文件(例如ttyecho.c)。 在已创建C文件的目录中运行以下命令以编译代码。

 make ttyecho 

将此文件复制到主目录下的bin目录。 如果目录不存在,请创建该目录。 将所有自定义二进制文件/可执行文件保留在此bin目录中是一种很好的做法。

启动另一个终端或切换到您希望控制的任何其他开放终端并执行命令tty。 您可以在下面看到示例输出。

 @~$ tty 

的/ dev / PTS / 5

现在要在/ dev / pts / 5上执行命令,请在控制/原始终端中运行以下命令。

 sudo ttyecho -n /dev/pts/5 ls 

您将看到ls命令在/ dev / pts / 5中执行-n选项使ttyecho在命令后发送换行符,以便命令执行而不仅仅是插入。 该实用程序可以用于将任何数据发送到其他终端。例如,您可以在/ dev / pts / 5中打开vim,然后在控制终端中运行以下命令以使vim退出/ dev / pts / 5

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

为了避免一直使用sudo,以便命令易于编写脚本,请使用以下命令更改此可执行文件的所有者/权限。

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

注意:设置setuid位可能会带来安全风险。

资料来源: http : //www.humbug.in/2010/utility-to-send-commands-or-data-to-other-terminals-ttypts/