Задать вопрос

ProxyCommand в SSH

Добрый вечер. Застрял на опции ProxyCommand SSH. Не могу понять как именно она работает.
Итак, аргументом этой опции мы указываем определенную команду. Прошу объяснить, где именно эта команда вызывается, на клиенте, или на сервере. Что ей подается на stdin, и куда направляется ее stdout. В общем как можно подробнее.
  • Вопрос задан
  • 8598 просмотров
Подписаться 6 Сложный 1 комментарий
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
ssh получает данные, полученные командой «из порта» (поступают из stdout команды). В свою очередь, ssh пишет в stdin команды

Всё верно.
Например corkscrew используется как ProxyCommand для подключения по ssh из-за http-прокси.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ParkeTg
@ParkeTg Автор вопроса
Итак, я все же решил проверить, что там творится с пайпами ( говорить «трубами» язык не поворачивается ).
Запускаем ssh, без указания опции ProxyCommand:

ssh root@0.0.0.0

В соседней владке терминала смотрим, пытаемся отгрепать все открытые процессом пайпы:

lsof | grep -E "^ssh.*FIFO"

И ничего, пустота. Не удивительно, мы ведь ничего не пишем в stdin. Давайте попробуем что-то пописать:

pv /dev/zero | ssh root@0.0.0.0 "cat > /dev/null"

Прогресс-бар зашевелился, переходим в соседнюю вкладку, и снова пытаемся отгрепать

lsof | grep -E "^ssh.*FIFO" 

В ответ получаем:
ssh       23782       svon    0r     FIFO           0,8       0t0   2401849 pipe
ssh       23782       svon    4r     FIFO           0,8       0t0   2401849 pipe

Так, отлично, ssh читает из stdout (0r), и еще откуда-то(4r). На этом этапе еще интересно посмотреть, какие TCP подключения использует ssh. Отгрепаем по TCP:

lsof | grep -E "^ssh.*TCP" 

На выходе получим:
ssh  24344  svon  3u  IPv4  2432025  0t0  TCP  arch:59472->super-vps.hell:ssh (EST.)

Далее, запускаем ssh в связке с netcat (ProxyCommand )

ssh -o "ProxyCommand nc %h %p" root@0.0.0.0

Идем в соседнюю вкладку и опять грепаем, но только уже и netcat тоже:

lsof | grep -E "(^ssh|^nc).*FIFO" 

И, что у нас на выходе?
ssh       24899       svon    4w     FIFO           0,8       0t0   2449781 pipe
ssh       24899       svon    5r     FIFO           0,8       0t0   2449782 pipe
nc        24900       svon    0r     FIFO           0,8       0t0   2449781 pipe
nc        24900       svon    1w     FIFO           0,8       0t0   2449782 pipe


А вот что. И если мы внимательно посмотрим на номера нод, то мы заметим.
Что 4w (ssh ?) пишет в 0r (netcat stdin), а 5r (ssh ?) читает из 1w (netcat stdout).
Забыли посмотреть подключения. Исправляем:

lsof | grep -E "(^ssh|^nc).*IPv4" 

И имеем в итоге:
nc  24900  svon  3u  IPv4  2449789  0t0  TCP arch:59476->super-vps.hell:ssh (EST.)
 

Видим, что из наших 2-х программ, подключение только одно, принадледжит оно неткету.

Если посмотреть лог запуска ssh (с опциями -vvv), можно увидеть, что все прекрасно шифруется, и вообще, во всем мире — мир.

Опираясь на факты, которые я привел выше, осмелюсь быть уверенным, что все работает именно по предполагаемой мной схеме (еще выше).

Что нам это позволяет? Вообще, много чего, но мне интересно было пробросить ssh туннель, через тор на свою VPS. Зачем? Хотя бы потому, что это прикольно. Спасибо что читаете, жду дополнений.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы