Como redirecionar para stdin de um shell bash em execução?

7

Teoricamente, se eu souber o pid do bash shell que está rodando, eu posso rodar um gato cujo stdout é redirecionado para o stdin daquele shell. Parece ser como se eu digitasse algo naquela casca. Infelizmente, haverá stream vindo do cat, MAS NÃO fará com que o shell funcione corretamente (o comando inserido do cat não será executado pelo bash).

Abra um terminal:

ps -ef | grep bash
ymf       4906  4887  0 16:19 pts/0    00:00:00 /bin/bash

Em outro terminal:

cat 1> /proc/4906/fd/0
echo 'hello!'

Por quê?

    
por Determinant 21.03.2012 / 10:18

3 respostas

7

Estou cansado do limite "apenas um parágrafo" nos comentários =)

Se você iniciar um shell sh e obter o pid $pid , poderá localizar os descritores de arquivo conforme descreve. Um exemplo:

$ ls -l /proc/29201/fd
total 0
lrwx------ 1 eroen users 64 Mar 22 15:52 0 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 1 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 2 -> /dev/pts/2
lrwx------ 1 eroen users 64 Mar 22 15:52 255 -> /dev/pts/2

Você notará que 1 , 2 e 3 são todos links simbólicos para o mesmo tty (um chardev). Em outras palavras, a entrada para o processo é lida no mesmo nó de dispositivo em que as saídas são gravadas.

Quando você tenta escrever (em um processo diferente) no mesmo tty (como /proc/$pid/fd/0 ou /dev/pts/? , você realiza exatamente a mesma coisa que o processo em si quando grava dados em sua saída; os dados mostram na janela do terminal.

Realmente mudar onde o ponto fd [0-2] depois de iniciar um processo é bastante complicado, mas não impossível. Reptyr é um aplicativo gratuito de código aberto que modifica um processo existente, por isso é fd [0-2] apontar para um diferente tty (assim como algumas outras coisas). Isso é realizado através da estrutura ptrace . O post também menciona outros softwares que fazem a mesma coisa, e que isso pode ser feito através de gdb .

Dependendo do que você realmente deseja realizar, você pode descobrir que o Reptyr ou algum outro software faz o que você precisa. Caso contrário, você pode olhar / copiar / modificar o código-fonte e descobrir como eles fazem o truque.

Adendo: Este contém alguns diagramas ilustrativos, em particular, o terceiro esquema a partir do topo.

    
por 22.03.2012 / 15:50
5

Ir para o terminal A qualquer tipo tty

você receberá algo como "/ dev / pts / 0"

Agora, vá para o terminal B e digite exec 0</dev/pts/0 (ou qualquer que seja o comando tty)

Retorne ao terminal A e os comandos que você digitar serão executados no terminal B.

    
por 22.03.2012 / 03:00
1

How to redirect to stdin of a running bash shell?

usando C ( link . eu não testei):

char* cmd="ls\n";
int fd = open (ptsname, O_RDWR);

while (*cmd)
{
    ioctl(fd, TIOCSTI, cmd++);
}

usando o Perl ( link . funciona perfeitamente, mas apenas para o shell atual):

require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;
    
por 10.11.2014 / 20:57