Двунаправленный HTTP-туннель через файл / канал - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть удаленный компьютер, в который я могу вставить оболочку, но не могу выполнить переадресацию портов, поэтому все должно проходить через стандартный ввод / вывод через процесс оболочки.На удаленном компьютере есть HTTP-сервер, к которому я хотел бы подключиться с помощью браузера на локальном компьютере.

Я попробовал следующее:

mkfifo /tmp/socattunnel
socat -d -d TCP-LISTEN:12345,crlf,reuseaddr,fork - </tmp/socattunnel | remote_shell -- socat - TCP:localhost:6006 2>/dev/null >/tmp/socattunnel

Идея заключается в том,чтобы запустить один экземпляр socat на моем локальном компьютере, прослушивая порт 12345, и один экземпляр, запущенный на удаленном компьютере, подключается к существующему HTTP-серверу, работающему на порту 6006. Локальный экземпляр читает из именованного канала и записывает в удаленную оболочку, котораяпишет обратно в канал, завершая цикл.

С этой настройкой я могу сделать curl http://localhost:12345 на моей локальной машине, и она работает нормально, но если я пытаюсь запустить его снова, я получаю curl: (52) Empty reply from server.Вот журнал socat:

socat -d -d TCP-LISTEN:12345,crlf,reuseaddr,fork - </tmp/socattunnel | remote_shell -- socat - TCP:localhost:6006 2>/dev/null >/tmp/socattunnel
2019/04/25 14:43:57 socat[46138] N listening on LEN=16 AF=2 0.0.0.0:12345
2019/04/25 14:44:01 socat[46138] N accepting connection from LEN=16 AF=2 127.0.0.1:57506 on LEN=16 AF=2 127.0.0.1:12345
2019/04/25 14:44:01 socat[46138] N forked off child process 46141
2019/04/25 14:44:01 socat[46138] N listening on LEN=16 AF=2 0.0.0.0:12345
2019/04/25 14:44:01 socat[46141] N reading from and writing to stdio
2019/04/25 14:44:01 socat[46141] N starting data transfer loop with FDs [6,6] and [0,1]
2019/04/25 14:44:02 socat[46141] N socket 1 (fd 6) is at EOF
2019/04/25 14:44:02 socat[46141] N exiting with status 0
2019/04/25 14:44:02 socat[46138] N childdied(): handling signal 20
2019/04/25 14:44:05 socat[46138] N accepting connection from LEN=16 AF=2 127.0.0.1:57507 on LEN=16 AF=2 127.0.0.1:12345
2019/04/25 14:44:05 socat[46138] N forked off child process 46173
2019/04/25 14:44:05 socat[46138] N listening on LEN=16 AF=2 0.0.0.0:12345
2019/04/25 14:44:05 socat[46173] N reading from and writing to stdio
2019/04/25 14:44:05 socat[46173] N starting data transfer loop with FDs [6,6] and [0,1]
2019/04/25 14:44:05 socat[46173] E write(1, 0x7fde27004e00, 74): Broken pipe
2019/04/25 14:44:05 socat[46173] N exit(1)
2019/04/25 14:44:05 socat[46138] N childdied(): handling signal 20

В частности: E write(1, 0x7fde27004e00, 74): Broken pipe у второго потомка.

Затем я попытался воспроизвести проблему, не переходя через удаленную оболочку, используя tee:

python3 -m http.server 6006 &
mkfifo /tmp/socattunnel
socat -d -d TCP-LISTEN:12345,crlf,reuseaddr,fork - </tmp/socattunnel | tee /dev/stderr | socat - TCP:localhost:6006 >/tmp/socattunnel

И это также сталкивается с той же проблемой.Есть ли альтернативный подход для создания двунаправленного HTTP-туннеля через файл / канал?

...