linux - write commands from one terminal to another

15,778

Solution 1

Python code:

#!/usr/bin/python

import sys,os,fcntl,termios
if len(sys.argv) != 3:
   sys.stderr.write("usage: ttyexec.py tty command\n")
   sys.exit(1)
fd = os.open("/dev/" + sys.argv[1], os.O_RDWR)
cmd=sys.argv[2]
for i in range(len(cmd)):
   fcntl.ioctl(fd, termios.TIOCSTI, cmd[i])
fcntl.ioctl(fd, termios.TIOCSTI, '\n')
os.close(fd)

Solution 2

Is posible to show the output of a command on multiple terminals simultaneously with the following script., and it works with all console programs, including the editors. For example doing:

execmon.bash  'nano hello.txt' 5

Open an editor and both the output and the text that we introduce will be redirected to the virtual terminal number 5. You can see your terminals:

ls /dev/pts

Each virtual terminal has an associated number.

Is work with the normal terminal, konsole and xterm, just create the file execmon.bash and put this:

#! / bin / bash
# execmon.bash
# Script to run a command in a terminal and display the output
# in the terminal used and an additional one.
param = $ #
if [$ param-eq 2]; Then
    echo $ 1 | tee a.out a.out && cat> / dev / pts / $ 2 && exec `cat` a.out | tee / dev / pts / $ 2 && rm a.out
else
    echo "Usage:"
    echo "execmon 'command' num '
    echo "-command is the command to run (you have to enter ')"
    echo "-num is the number of virtual console to output to the"
fi

Example:

execmon.bash 'ls-l' 5
execmon.bash 'nano Hello.txt' 5

Solution 3

This is hairy. The stdin file in proc you're trying to use is a symlink to the terminal device (probably /dev/pts/something). There are two processes that have that device open: the shell (your target) and the terminal emulator (e.g. gnome-terminal), and they use it like a socket to pass data in both directions. Presumably the latter is stealing the output and displaying it, so the shell never sees it. I don't think this technique will work.

What are you trying to accomplish? You can't run the process as a child using conventional tools like popen()? If it's a GUI terminal emulator, you could try to forge keyboard input via X events or the kernel's uinput API.

Solution 4

look at:

man 1 script

for example:

script -f /dev/tty1

Solution 5

open 2 terminals then type ttd on the terminal which you want to write on ttd will show you the address of the terminal move to the another terminal and type cat > (address of the 2nd terminal) and hit enter

Share:
15,778

Related videos on Youtube

user1364700
Author by

user1364700

Updated on June 04, 2022

Comments

  • user1364700
    user1364700 almost 2 years

    I need to write commands from one terminal to another terminal.

    I tried these:

    echo -e "ls\n" > /proc/pid/fd/0
    echo -e "ls\n" > /dev/pts/4
    

    Which just prints the ls as output and doesn't execute.

    I tried these:

    chmod 777 /dev/tty4 ;echo "ls" > /dev/tty4
    chmod 777 /dev/tty40 ;echo "ls" > /dev/tty40
    

    Which don't seem to do anything

    Any ideas?

    [note that I don't want to touch the second terminal to accomplish this. only the first one]

  • user1364700
    user1364700 about 12 years
    first of all thank you for your answer. can't i direct the output to the shell then? instead of te terminal emulator? how does it get the commands from te keyboard? cant i simulate it? popen is my less favorite option. if writing the commands to the shell won't work, i will try popen.
  • user1364700
    user1364700 about 12 years
    first of all thank you for your answer. im trying to get the command executed. why i can send stdin to a process but not to a shell?.. and what did you mean with sending keystrokes? i can inject keystrokes to another shell?
  • SztupY
    SztupY over 9 years
    I guess the asker tries to execute a command in another pty, not just put strings there
  • Ethaan
    Ethaan over 9 years
    This does not provide an answer to the question. To critique or request clarification from an author, leave a comment below their post.
  • Stephan A. Terre
    Stephan A. Terre about 9 years
    This works nicely, but only when you have appropriate permissions for the relevant tty.