Невозможно захватить данные удаленного клиента с помощью nohup и socat

Невозможно захватить данные удаленного клиента с помощью nohup и socat

Мне нужно захватить подробный и отладочный вывод socatработы на удаленном сервере.

Я могу добиться вышеуказанного при запуске socatна переднем плане:

$ socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log

Однако,stdout.logЕсли указанное выше выполняется nohupв фоновом режиме, вывод не производится.:

$ nohup socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &

Вот stderr.logсразу после того, как я запустил nohup socatверсию выше:

nohup: ignoring input
2024/03/24 20:06:22 socat[28360] I socat by Gerhard Rieger and contributors - see www.dest-unreach.org
2024/03/24 20:06:22 socat[28360] I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)
2024/03/24 20:06:22 socat[28360] I This product includes software written by Tim Hudson ([email protected])
2024/03/24 20:06:22 socat[28360] I setting option "bind" to "0.0.0.0"
2024/03/24 20:06:22 socat[28360] I setting option "fork" to 1
2024/03/24 20:06:22 socat[28360] I setting option "so-reuseaddr" to 1
2024/03/24 20:06:22 socat[28360] I socket(2, 1, 6) -> 5
2024/03/24 20:06:22 socat[28360] W ioctl(5, IOCTL_VM_SOCKETS_GET_LOCAL_CID, ...): Inappropriate ioctl for device
2024/03/24 20:06:22 socat[28360] I starting accept loop
2024/03/24 20:06:22 socat[28360] N listening on AF=2 0.0.0.0:8080

Далее я подключаюсь к порту 8080из netcat,

$ nc localhost 8080

и вот что stderr.logтогда получается:

2024/03/24 20:06:59 socat[28360] I accept(5, {2, AF=2 127.0.0.1:37910}, 16) -> 6
2024/03/24 20:06:59 socat[28360] N accepting connection from AF=2 127.0.0.1:37910 on AF=2 127.0.0.1:8080
2024/03/24 20:06:59 socat[28360] I permitting connection from AF=2 127.0.0.1:37910
2024/03/24 20:06:59 socat[28360] N forked off child process 28563
2024/03/24 20:06:59 socat[28360] I close(6)
2024/03/24 20:06:59 socat[28360] I still listening
2024/03/24 20:06:59 socat[28360] N listening on AF=2 0.0.0.0:8080
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(4)
2024/03/24 20:06:59 socat[28563] I close(3)
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(5)
2024/03/24 20:06:59 socat[28563] N reading from and writing to stdio
2024/03/24 20:06:59 socat[28563] I resolved and opened all sock addresses
2024/03/24 20:06:59 socat[28563] N starting data transfer loop with FDs [6,6] and [0,1]
2024/03/24 20:06:59 socat[28563] E read(0, 0x60485184f000, 8192): Bad file descriptor
2024/03/24 20:06:59 socat[28563] N exit(1)
2024/03/24 20:06:59 socat[28563] I shutdown(6, 2)
2024/03/24 20:06:59 socat[28360] N childdied(): handling signal 17
2024/03/24 20:06:59 socat[28360] I childdied(signum=17)
2024/03/24 20:06:59 socat[28360] I childdied(17): cannot identify child 28563
2024/03/24 20:06:59 socat[28360] I waitpid(): child 28563 exited with status 1
2024/03/24 20:06:59 socat[28360] I waitpid(-1, {}, WNOHANG): No child processes
2024/03/24 20:06:59 socat[28360] I childdied() finished

Затем я набираю текст в терминале netcat и нажимаю ENTER.

Однако проблема в следующем:stdout.logНе только netcat завершает работу, я также не вижу введенный мной текст..

Помимо того, чтобы пролить свет на то, что здесь происходит, может ли кто-нибудь любезно подсказать, как захватить stderr и stdout nohup'ed socat? По сути, мне нужно захватить -vи -d -d -dвывод в stderr.logи любые и все данные, отправленные удаленным клиентом сокета в stdout.log.

решение1

Объяснение

Речь идет о stdin из socat.

Для команды, запущенной в фоновом режиме с помощью &, есть две основные возможности:

  • Если управление заданиями отключено в оболочке (это значение по умолчанию для скриптов), стандартный ввод команды будет перенаправлен (до выполнения каких-либо явных перенаправлений) в /dev/nullили эквивалентный файл.

  • Если в оболочке включено управление заданиями (это значение по умолчанию при интерактивном использовании), stdin команды — это то, что вы ожидаете, так что это может быть терминал. Если это терминал, команда в фоновом режиме не может украсть ввод из него; если она попытается, то получит SIGTTIN. Тем не менее, вы можете вывести команду на передний план с помощью fgизатемон может читать с терминала.

nohupсам по себе перенаправляет стандартные потоки от терминала, так что даже в последнем случае ваш процесс socatв фоновом режиме или любой из его дочерних процессов/потоков/что-либо еще немедленно получит условие EOF (или какую-либо ошибку) при попытке чтения со своего stdin.

Вы должны иметь возможность быстро передавать данные с помощью like echo message | nc localhost 8080, socatобработка этого конкретного соединения должна привести к получению сообщения перед завершением из-за EOF на его stdin.


Решение

Если вы не хотите, чтобы соединения прерывались из-за EOF на stdin socat, сообщите инструменту, чтобы он не читал с этого адреса. From man 1 socat:

-uИспользует однонаправленный режим. Первый адрес используется только для чтения, а второй адрес используется только для записи […].

-UИспользует однонаправленный режим в обратном направлении. Первый адрес используется только для записи, а второй адрес используется только для чтения.

В вашем случае -(имеется ввиду STDIO) это второй адрес, поэтому вам нужно -u:

nohup socat -u -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &

Связанный контент