Ответы:
С вашего локального компьютера вы можете создать туннель SSH через промежуточный хост к конечному хосту:
ssh user@intermediate -L 2000:final:22 -N
Это откроет порт 2000 на вашем локальном хосте, который будет подключаться напрямую к конечному серверу на порту 22 через туннелирование через промежуточный хост. Теперь в другом приглашении соединитесь с sftp через порт 2000 для туннелирования до конечного сервера, отметив, что указанный здесь пользователь предназначен для конечного хоста:
sftp -P 2000 user@localhost
Похоже, это относится к superuser.com или serverfault.com .
Вы можете использовать опцию 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 ...
exec
необходимо? (Это прекрасно работает без этой части.)
Вы можете направить данные в процесс ssh, запущенный на вашем компьютере, а затем запустить команду на промежуточном компьютере, которая читает stdin и отправляет ее в sftp по мере необходимости.
Это может быть сделано в oneliner на вашем локальном компьютере, хотя цитирование аргументов ssh потребует осторожности. Я сейчас на моем телефоне, поэтому, к сожалению, не могу напечатать детали. Возможно, кто-то еще может завершить этот ответ в качестве упражнения!
Я предполагаю, что финальный хост защищен огнем, и я могу только догадываться о методах, которые вы могли бы использовать, чтобы обойти его.
Например - выставьте ssh с вашего локального компьютера, затем ssh на первый хост, затем ssh на второй и sftp с последнего хоста на ваш компьютер.
допустим, А и В - первый и второй хосты. И файл для копирования это foo
Вместо sftp вы можете использовать следующее
кот фу | ssh A "кот -> фу"
Теперь вы можете последовательно соединить их 2
кот фу | ssh A "кот - | ssh B \" кот -> фу \ ""