2012-04-29 23 views
11

Necesito escribir comandos de un terminal a otro.linux - escribir comandos desde un terminal a otro

he probado todas estas:

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

Lo cual imprime el ls como salida y no se ejecuta.

he probado todas estas:

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

que no parecen hacer nada

¿Alguna idea?

[tenga en cuenta que no quiero tocar el segundo terminal para lograr esto. solo el primero]

+0

¿Cuáles son usted * realmente * tratando de hacer? Puede ser que tu lógica para probar que esto está en primer lugar sea defectuosa; podría haber una solución más fácil para obtener el mismo resultado. Además, los terminales se ejecutan en procesos separados, por lo que necesitaría alguna forma de [comunicación entre procesos] (http://en.wikipedia.org/wiki/Inter-process_communication) para lograr que hablen entre sí. –

Respuesta

0

Esta es la manera incorrecta de hacerlo - puede que aparezca en el terminal , pero no se ejecuta.

Tendrá que hacer algo como decirle a un shell que lea desde una tubería con nombre, o desde netcat/socat. O podría intentar inyectar las teclas como root o usar xtest (también a veces hay otro camino debajo de X que olvido).

+0

en primer lugar gracias por su respuesta. Estoy tratando de ejecutar el comando. ¿Por qué puedo enviar stdin a un proceso pero no a un shell? ¿Y a qué te refieres con enviar pulsaciones de teclas? Puedo inyectar teclas a otro shell? – user1364700

2

Esto es peludo. El archivo stdin en proceso que está tratando de usar es un enlace simbólico al dispositivo terminal (probablemente/dev/pts/something). Hay dos procesos que tienen ese dispositivo abierto: el shell (su objetivo) y el emulador de terminal (por ejemplo, gnome-terminal), y lo usan como un socket para pasar datos en ambas direcciones. Presumiblemente, este último está robando la salida y mostrándola, para que el caparazón nunca la vea. No creo que esta técnica funcione.

¿Qué estás tratando de lograr? No puede ejecutar el proceso como un niño usando herramientas convencionales como popen()? Si se trata de un emulador de terminal GUI, puede tratar de forjar la entrada del teclado a través de eventos X o la API uinput del kernel.

+0

en primer lugar gracias por su respuesta. ¿No puedo dirigir la salida al shell entonces? en lugar de emulador de terminal te? ¿cómo obtiene los comandos del teclado? no puedo simularlo? popen es mi opción menos favorita. si escribir los comandos al shell no funcionará, intentaré con popen. – user1364700

3

Es posible mostrar la salida de un comando en múltiples terminales simultáneamente con el siguiente script, y funciona con todos los programas de consola, incluidos los editores. Por ejemplo haciendo:

execmon.bash 'nano hello.txt' 5 

Abrir un editor y tanto la salida y el texto que se introduce será redirigido al número de terminal virtual 5. Se puede ver sus terminales:

ls /dev/pts 

Cada terminal virtual tiene un número asociado.

Trabaja con la terminal normal, konsole y xterm, solo crea el archivo execmon.bash y poner esto:

#!/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 

Ejemplo:

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

está bien, y por esta razón también rechazaste mi respuesta. Solo trato de ayudar –

+1

@VoislavSauca Creo que el voto negativo de tu respuesta fue porque no era correcta. –

+0

Ok, actualizo la respuesta. –

8

Python código:

#!/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) 
+1

Esto funciona bien, pero solo cuando tiene los permisos apropiados para el tty relevante. –

1

abiertos 2 terminales continuación TTD del tipo en el terminal que desea escribir en TTD se mostrarle la dirección de la terminal mover a la otra terminal y escribir cat> (dirección de la 2da terminal) y pulsa enter

+0

¿te importa elaborar + mostrar enlaces de lo que tienes? – Roylee

-1

comando> dev/pts/# donde # es el nombre de la otra terminal

+0

Supongo que el asker intenta ejecutar un comando en otro pty, no solo poner cadenas allí – SztupY

1

vistazo a:

man 1 script 

por ejemplo:

script -f /dev/tty1 
+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. – Ethaan

Cuestiones relacionadas