Executar comando no terminal ativo remoto

10

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

Em outro terminal, digite este comando (C1):

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

Isso grava lse a nova linha em T1, mas não a executa. Por quê?

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

Como posso ecoar o comando em outro terminal e executá-lo?

possível resposta :

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

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

rvlander
fonte
Eu li isso, mas não é muito útil.
rvlander
1
Pode não ser "útil" como uma maneira de fazê-lo, mas responde à sua pergunta: você não pode. Você pode nos dizer o objetivo final que está tentando alcançar e ver se há outra maneira.
22412 Kevin
Ok, você não pode, mas por que o texto é exibido no outro terminal?
rvlander
porque você envia o texto para a interface do terminal, não para o shell.
rush

Respostas:

11

Existe um utilitário de linha de comando chamado ttyechoque pode enviar um comando para outro terminal (tty / pts) e executar o comando.

sudo ttyecho -n /dev/pts/5 ls

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

Veja também: ttyechocódigo fonte no github .

Outro comando tty interessante é selectorum comparador de padrões interativos 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

Chade
fonte
Infelizmente, o link para o ttyechocódigo fonte no github parece estar quebrado. No entanto, parece estar disponível em github.com/osospeed/ttyecho agora.
Wilson F
7

Quando você escreve uma gravação para /dev/pts/X( /proc/6350/fd/0, 1e 2é apenas um link simbólico para isso), o que acontece é exatamente a mesma coisa que acontece quando o processo 6350(ou um de seus filhos, adequadamente bifurcado) produz algo: ele grava no terminal.

Se você tentar ler a partir desse dispositivo ( cat < /dev/pts/X), coisas estranhas acontecerão. Você deve ver as coisas que digitar no shell original. (Possivelmente apenas após a primeira nova linha que você digitou - acho que o programa do terminal ( xtermou o que você estiver usando) faz algum buffer de linha, e o 6350shell que foi bloqueado readrecebe esse pedaço; então, o shell pode ou pode não, ganhe as leituras subsequentes, mas eu posso estar completamente errado nisso.)

A questão é: quando você lê ou escreve nesse dispositivo, não está conversando com o outro shell que o está usando. Você está falando com o emulador de terminal ( xtermpor 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ê deseja injetar comandos nesse 6530processo, 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'?

Esteira
fonte
1
Curiosamente, lendo os pts ( cat /dev/pts/xvocê não precisa <), recebo as letras alternadamente estritamente entre os terminais.
22412 Kevin
Não usar o redirecionamento provavelmente não muda muito. Recebo uma saída não previsível de qualquer maneira.
22412 Mat
Interessante, obrigado pelo link. Assim /proc/6350/fd/0é um simlink para o pai stdin do process 6350qual é um terminal. Eu acho que é o mesmo para aplicativos em janelas?
rvlander