11

Я не могу напрямую подключиться к конкретному хосту. Чтобы переместить файл с моей домашней машины на хост, я должен переместить файл на промежуточный хост; SSH в промежуточный хост; и sftp файл до конечного пункта назначения. Можно ли избежать такого безумия?

5 ответов5

28

С вашего локального компьютера вы можете создать туннель SSH через промежуточный хост к конечному хосту:

ssh user@intermediate -L 2000:final:22 -N

Это откроет порт 2000 на вашем локальном хосте, который будет подключаться напрямую к конечному серверу на порту 22 через туннелирование через промежуточный хост. Теперь в другом приглашении соединитесь с sftp через порт 2000 для туннелирования до конечного сервера, отметив, что указанный здесь пользователь для конечного хоста:

sftp -P 2000 user@localhost

Похоже, что это принадлежит superuser.com или serverfault.com, хотя.

14

Вы можете использовать опцию SFTP ProxyCommand для прозрачного туннелирования соединения SFTP через соединение SSH (немного похоже на ответ WhiteFang34, но через stdin & stdout соединения SSH, а не через перенаправленный локальный порт TCP):

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost

(Предполагается, что на промежуточном хосте установлен netcat как /usr /bin /nc - в противном случае вам может понадобиться найти / установить какой-то эквивалентный способ шлюза stdin & stdout в сеанс TCP.)

Что действительно здорово в этой опции, так это то, что вы можете добавить ее в файл ~/.ssh/config, что делает его прозрачным:

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null

С этой записью вы можете использовать sftp, scp и ssh для finalhost, и он автоматически вызовет туннель. Единственная непрозрачная часть состоит в том, что он запрашивает два пароля (промежуточный хост и конечный хост), но если вы хотите, вы можете устранить это также с помощью пар ключей SSH ...

3

Вы можете передать данные в процесс ssh, запущенный на вашем компьютере, а затем запустить на промежуточном компьютере команду, которая читает stdin и отправляет ее в sftp по мере необходимости.

Это можно сделать в oneliner на вашем локальном компьютере, хотя цитирование аргументов ssh потребует осторожности. Я сейчас на моем телефоне, поэтому, к сожалению, не могу напечатать детали. Возможно, кто-то еще может завершить этот ответ в качестве упражнения!

0

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

Например - выставьте ssh с вашего локального компьютера, затем ssh на первый хост, затем ssh на второй и sftp с последнего хоста на ваш компьютер.

0

допустим, А и В - первый и второй хосты. И файл для копирования это foo

Вместо sftp вы можете использовать следующее

кот фу | ssh A "кот -> фу"

Теперь вы можете последовательно соединить их 2

кот фу | ssh A "кот - | ssh B \" кот -> фу \""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .