Send Commands or Data to Other Terminals
http://ananddrs.com/2013/09/25/send-commands-to-other-terminals/
Send Commands or Data to Other Terminals
Somehow I need to send commands from one terminal to another. Luckily I found this postwhich saves my time. Here is a set of steps that one need to follow:
Copy the code below to a C file (e.g. ttyecho.c)
#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); }
Run the following command in the directory where the C file (ttyecho.c) has been created
make ttyecho
The above command will create an executable file named ttyecho
Copy this file to the bin directory under your Home Directory. In my case it is /home/pi/bin
. Create the bin directory if it doesn’t exist. It is a good practice to keep all custom binaries/executables in this bin directory.
Now change the owner/group to root using the following commands
sudo chown root:root ttyecho sudo chmod u+s ttyecho
The above two commands change the owner/group to root and set the setuid bit for the executable which will allow you to run the utility with root permissions.
Start another terminal or switch to another existing terminal that you wish to control and execute the command tty in order to determine the terminal. You can see a sample output below.
@~$ tty /dev/pts/5
Now to execute a command on /dev/pts/5
, run the following command in the controlling/original terminal.
ttyecho -n /dev/pts/5 ls
You will see that the ls
command is executed in /dev/pts/5
. The -n
option makes ttyecho
send a newline after the command, so that the command gets executed and not just inserted.