Вот мое предпочтительное решение этой проблемы [как дано для дублирующего вопроса , который я задал]. Настройте обратный туннель ssh после создания сеанса ssh. Это легко сделать с помощью двух функций bash: на локальном хосте необходимо определить grabfrom (), а на удаленном хосте - grab (). Вы можете добавить любые другие используемые вами ssh-переменные (например, -X или -Y) по своему усмотрению.
function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };
Использование:
localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>
Положительные:
- Работает без специального программного обеспечения на любом хосте, кроме OpenSSH
- Работает, когда локальный хост находится за маршрутизатором NAT
- Может быть реализована в виде пары двухстрочных функций из одной строки
Отрицательные:
- Используется фиксированный номер порта, поэтому:
- не будет работать с несколькими подключениями к удаленному хосту
- может конфликтовать с процессом, использующим этот порт на удаленном хосте
- Требуется локальный хост принимать ssh-соединения
- Требуется специальная команда для начала сеанса
- Неявно обрабатывает аутентификацию на локальном хосте
- Он не позволяет указать каталог назначения на локальном хосте
- Если вы перешли с нескольких локальных хостов на один и тот же удаленный хост, ssh не понравится изменение ключей
Будущая работа:
Это все еще довольно глупо. Очевидно, что можно было бы решить проблему аутентификации путем соответствующей настройки ключей ssh, и еще проще разрешить спецификацию удаленного каталога, добавив параметр в grab ()
Более сложным является рассмотрение других негативов. Было бы неплохо выбрать динамический порт, но, насколько я могу судить, не существует элегантного способа передачи этого порта в оболочку на удаленном хосте; Насколько я могу судить, OpenSSH не позволяет вам устанавливать произвольные переменные окружения на удаленном хосте, а bash не может принимать переменные окружения из аргумента командной строки. Даже если вы можете выбрать динамический порт, нет способа гарантировать, что он не будет использоваться на удаленном хосте без предварительного подключения.