Hoje eu estava lendo a nc
página de manual e me deparei com esse comando. Eu sei que:
mkfifo /tmp/f
está criando um pipe nomeado em/tmp/f.cat /tmp/f
está imprimindo tudo o que está escrito naquele pipe nomeado e a saída decat /tmp/f
foi canalizada para/bin/sh
/bin/sh
está sendo executado de forma interativa e stderr é redirecionado para stdout.- `a saída é então canalizada para nc que está escutando na porta 1234
- e a saída é finalmente redirecionada para o canal nomeado novamente.
quando executado, conectar-se ao servidor remoto nessa porta, ou seja, 1234, abre um prompt de shell e o cliente pode executar comandos arbitrários. Mas como funciona assim?
Responder1
Esse comando aproveita o redirecionamento de IO e o modo interativo sh, que fica ativado por padrão quando conectado a um TTY.
Observe que o gato permanece aberto em um FIFO. Essa é a sua primeira pista. Quando sh é executado, tudo o que ele faz é direcionar seu stdout e strerr para o TTY. Em vez disso, sh não está anexado a um TTY. Normalmente sh entra automaticamente no modo interativo quando conectado a um TTY, mas como não é, a opção -i é adicionada. Isso significa que ele continuará recebendo informações para novos comandos. A saída desses comandos é direcionada para o stdin do nc e a saída do nc (que são os comandos vindos da rede) é redirecionada para o FIFO.
O FIFO está sendo usado essencialmente como um canal nomeado para completar o anel de redirecionamento.
Você pode pensar nisso de forma mais simples, como sh e nc estão redirecionando um para o outro em um loop. O resto do comando é apenas superficial.