Должен ли я sftp к промежуточному серверу?

11

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

user74094
источник

Ответы:

28

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

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

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

sftp -P 2000 user@localhost

Похоже, это относится к superuser.com или serverfault.com .

WhiteFang34
источник
Спасибо, я попробую это; и ты прав это не тот форум; извиняюсь.
После ввода пароля пользователя @ localhost я получил сообщение: получено слишком длинное сообщение 1131376238
user74094
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 ...

Гордон Дэвиссон
источник
Спасибо Гордон. Он принимает оба пароля и останавливается с сообщением: полученное сообщение слишком длинное 1131376238
user74094
Похоже, что-то в соединении - возможно, сценарий входа в систему на одном из хостов, может быть, nc - пишет какой-то дополнительный текст поверх соединения, что сбивает с толку sftp (см. Этот FAQ на snailbook.com ). 1131376238 является десятичной кодировкой символов ascii «Conn», поэтому это, вероятно, сообщение типа «Соединение с ...», «Соединение с ...» или, возможно, «Соединение не удалось». Попробуйте использовать ssh вместо sftp, посмотрите, печатается ли сообщение визуально, и, возможно, вы сможете определить, откуда оно пришло.
Гордон Дэвиссон
SSH работал нормально. Я должен также упомянуть, что я часто сталкиваюсь с этим вопросом: подлинность хоста 'xxxxx (<no hostip for proxy command>)' не может быть установлена. Отпечаток ключа RSA: 37: 40: d4: c7: и т. Д. Вы уверены, что хотите продолжить подключение (да / нет)? да
user74094
Гордон, очень полезно! Я добавляю это в мой текстовый файл командной строки. Благодаря тонну!
Трэвис Лелеу
Это execнеобходимо? (Это прекрасно работает без этой части.)
equaeghe
3

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

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

jl6
источник
0

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

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


источник
0

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

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

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

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

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


источник
Мне нравится, поэтому я попробовал. Он взял пароль для A, а затем выдал сообщение: Ошибка проверки ключа хоста.
user74094