Відповіді:
На своїй локальній машині ви можете створити тунель am SSH через проміжний хост до кінцевого хоста:
ssh user@intermediate -L 2000:final:22 -N
Це відкриє порт 2000 на вашому localhost, який підключиться безпосередньо до кінцевого сервера на порту 22 шляхом тунелювання через проміжний хост. Тепер в іншому підказці підключіться до sftp на порт 2000, який потрібно тунелювати до кінцевого сервера, зазначивши, що вказаний тут користувач призначений для остаточного хоста:
sftp -P 2000 user@localhost
Схоже, це належить на superuser.com або serverfault.com, хоча.
Ви можете використовувати опцію ProxyCommand SFTP, щоб прозоро тунелювати 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, і він автоматично викликатиме тунель. Єдина непрозора частина полягає в тому, що він запропонує два паролі (intermediatehost, за яким слідує finalhost), але якщо ви хочете, ви можете їх усунути також із SSH keypairs ...
exec
потрібне? (Тут чудово працює без цієї частини.)
Ви можете передавати дані в ssh-процес, що працює на вашій машині, а потім запустити команду на проміжному апараті, яка читає stdin і надсилає їх в sftp, якщо це доречно.
Це можна зробити в онлайні на вашій локальній машині, хоча цитування аргументів до ssh вимагатиме обережності. Я зараз на своєму телефоні, тому, на жаль, не можу ввести деталі. Можливо, хтось ще може виконати цю відповідь як вправу!
Я припускаю, що кінцевий хост розгортається, і я можу лише здогадуватися про методи, які ви могли використовувати, щоб обійти його.
Наприклад - відкрийте ssh з вашої локальної машини, потім ssh на перший хост, потім ssh на другий і sftp від кінцевого хоста до вашої машини.
скажемо, що A і B - це перший і другий господарі. Файл, який потрібно скопіювати, є foo
Замість sftp ви можете використовувати наступне
котячий фу | ssh "кішка -> фу"
Тепер ви можете разом зробити це з 2-х ланцюжків
котячий фу | ssh "кішка - | ssh B \" кішка -> foo \ ""