Execute o comando no terminal ativo remoto

10

Suponha que você tenha um emulador de terminal (T1) aberto com um PID de 6350.

De outro terminal, digite este comando (C1):

echo "ls\n" > /proc/6350/fd/0

Isto escreve ls e a nova linha no T1 mas não o executa. Por quê?

Eu também tentei usar cat|bash com echo "ls\n" > /proc/catid/fd/0 , mas ainda não foi executado.

Como posso fazer o eco do comando em outro terminal e executar o comando?

resposta possível:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

Neste caso, você não pode mais escrever diretamente no terminal (tudo é exibido da mesma forma que o comando (C1) exibido neste terminal.

    
por rvlander 22.05.2012 / 14:47

2 respostas

10

Existe um utilitário de linha de comando chamado ttyecho que pode enviar um comando para outro terminal (tty / pts) e ter o comando executado.

sudo ttyecho -n /dev/pts/5 ls

Veja: Utilitário para enviar comandos ou dados para outros terminais (tty / pts)

Veja também: ttyecho código-fonte no github .

Outro comando tty interessante é selector , um combinador de padrões interativo em tempo real no console que atualiza o buffer de entrada tty.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

Veja: seletor - PESQUISA DINÂMICA EM CONSOLE

    
por 23.05.2012 / 10:19
6

Quando você emite uma gravação para /dev/pts/X ( /proc/6350/fd/0 , 1 e 2 é apenas um symlink para isso), o que acontece é exatamente a mesma coisa que acontece quando o processo 6350 (ou um dos seus filhos, adequadamente bifurcados) produzem algo: ele grava no terminal.

Se você tentar ler a partir desse dispositivo ( cat < /dev/pts/X ), coisas boas acontecerão. Você deve ver as coisas que você digita no shell original aparecer. (Muito possivelmente somente após a primeira nova linha que você digitou - eu estou supondo que o programa terminal ( xterm ou o que você estiver usando) faz algum buffer de linha, e o shell 6350 que foi bloqueado em read peça, então qualquer shell pode, ou não, ganhar as leituras subseqüentes, mas eu posso muito bem estar completamente errado nisso.)

A coisa é: quando você lê ou escreve nesse dispositivo, você não está falando com o outro shell que o está usando. Você está falando com o emulador de terminal ( xterm , por exemplo). Somente o emulador de terminal pode injetar dados nesse canal (o que o shell lê), e tudo o que o shell grava vai para o terminal. Anexar um segundo shell não muda isso.

Se você quiser injetar comandos nesse processo 6530 , ele terá que fazer isso através do terminal (seja um aplicativo X11 ou outra coisa).

Leitura recomendada: Qual é a diferença exata entre um 'terminal', um 'shell', um 'tty' e um 'console'?

    
por 22.05.2012 / 20:03