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.



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


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'?


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.