Я пытаюсь настроить туннель с двойным ssh между двумя хостами, чтобы я мог проксировать трафик через него.
Используя обычную команду SSH, я получил следующие результаты:
ssh -t -L2000:localhost:2000 user@host1 ssh -D 2000 differentuser@host2
Я понимаю эту команду: «перенаправить мой локальный порт 2000 на порт 2000 на первом удаленном хосте, а затем обработать локальный порт 2000 на первом удаленном хосте как прокси-сервер SOCKS на второй удаленный хост». Я скопировал соответствующие открытые ключи на каждый хост, поэтому каждый шаг не требует пароля.
Это работает нормально, пока одно из соединений не разорвется. Затем я попытался обойти это с помощью autossh, например:
autossh -t -L2000:localhost:2000 user@host1 autossh -D 2000 differentuser@host2
Но он продолжал отображать:
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 2000
Однако я получил приглашение оболочки от второго хоста, но туннель не работал. Затем я попытался использовать разные порты между первым и вторым хостами, например:
autossh -t -L2000:localhost:2001 user@host1 autossh -D 2001 differentuser@host2
Это не привело к ошибкам, но получившийся туннель по-прежнему не работал. Выполнение шагов вручную, например:
autossh -L2000:localhost:2000 user@host1
а затем на хосте 1:
autossh -D 2000 differentuser@host2
работает отлично. Однако я бы хотел сделать все это с помощью одной команды, чтобы я мог ее написать.
Может ли кто-нибудь помочь мне заставить autossh работать так же, как обычный ssh?
Спасибо!
Очень хороший вопрос. Я только что провел небольшое тестирование, и похоже, ssh
и autossh
по-разному трактуйте последнюю «командную» часть командной строки. Например:
$ ssh 0 ls -ld /tmp
tom@0's password:
drwxrwxrwt 16 root root 4096 2011-06-05 11:17 /tmp
$ autossh 0 ls -ld /tmp
d@'s password:
autossh
анализирует последнюю команду и интерпретирует флаги, а не оставляет их в покое, как ssh
делает. В этом случае он интерпретирует -l
как флаг для указания удаленного пользователя. В вашем случае это интерпретация -D
как вариант к первому autossh
, а не второй.
Вы можете обойти это, заключив командную часть в кавычки. В вашем примере:
autossh -t -L2000:localhost:2000 user@host1 "autossh -D 2000 differentuser@host2"