Hoje eu estava lendo a nc
página do manual e me deparei com este 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 canal nomeado e a saída decat /tmp/f
foi canalizada para/bin/sh
/bin/sh
está sendo executado interativamente 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 pipe nomeado novamente.
quando executado, conectando-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 dessa forma?
Esse comando está aproveitando o redirecionamento de IO e o modo interativo sh, que é ativado por padrão quando anexado 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 anexado a um TTY, mas como não é a opção -i adicionada. Isso significa que ele continuará recebendo entrada para novos comandos. A saída desses comandos é direcionada para o stdin de nc e a saída de nc (que são os comandos vindos da rede) é redirecionada para o FIFO.
O FIFO está sendo usado essencialmente como um pipe nomeado para completar o anel de redirecionamento.
Você pode pensar nisso de forma mais simples, como sh e nc estão redirecionando um ao outro em um loop. O resto do comando é apenas fofo.