Оболочки труб - порядок вещей
Так как netcat
на моей коробке не поддерживает -e
, netcat
Страница man дает мне этот обходной путь:
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
Я не понимаю, как это работает. Я думаю, что когда вы пытаетесь cat /tmp/f
что это будет блокировать, пока что-то не написано /tmp/f
и если он заблокирован, как выполняется остальная часть команды?
1 ответ
Все команды в конвейере запускаются одновременно и выполняются одновременно - команда 2 не ожидает выхода команды 1. Вместо этого конвейеры полагаются на блокировку операций чтения до тех пор, пока предыдущая команда не выдаст какой-либо вывод.
Например, вывод (stdout) cat /tmp/f
непосредственно1 подключен к входу /bin/sh -i
; всякий раз, когда sh пытается читать с его стандартного ввода, он блокируется, пока cat не выдаст какой-либо вывод.
1 (почти напрямую; stdout cat и std sh привязаны к двум концам объекта 'pipe'.)