Назад | Перейти на главную страницу

туннель с использованием autossh ведет себя иначе, чем та же команда с использованием ssh

Я пытаюсь настроить туннель с двойным 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"