Сегодня я читал nc
man-страницу и наткнулся на эту команду. Я знаю, что:
mkfifo /tmp/f
создает именованный канал в/tmp/ф.cat /tmp/f
печатает все, что записано в этот именованный канал, а выводcat /tmp/f
передается по каналу/bin/sh
/bin/sh
работает в интерактивном режиме, а stderr перенаправляется в stdout.- `затем вывод передается в nc, который прослушивает порт 1234
- и вывод в конечном итоге снова перенаправляется в именованный канал.
при запуске подключение к удаленному серверу на этом порту, т.е. 1234, открывает приглашение оболочки, и клиент может выполнять произвольные команды. Но как это работает таким образом?
решение1
Такая команда использует преимущества перенаправления ввода-вывода и интерактивного режима sh, который включен по умолчанию при подключении к TTY.
Обратите внимание, что cat остается открытым в FIFO. Это ваша первая подсказка. Когда sh запускается, все, что он делает, это направляет свой stdout и strerr в TTY. Вместо этого sh не подключен к TTY. Обычно sh автоматически переходит в интерактивный режим при подключении к TTY, но поскольку это не так, добавляется опция -i. Это означает, что он продолжит принимать входные данные для новых команд. Вывод этих команд направляется в stdin nc, а вывод nc (который представляет собой команды, поступающие по сети) перенаправляется в FIFO.
По сути, FIFO используется как именованный канал для замыкания кольца перенаправления.
Вы можете думать об этом проще, как о sh и nc, которые перенаправляют друг друга в цикле. Остальная часть команды — просто пустая трата времени.