Відповіді:
Я знаю, що це пізня відповідь, але я просто знайшов класний спосіб зробити це. Це в основному відповідь Холгера Юста, але в збереженому конфігураційному файлі:
Потрібно помістити це у свій ~/.ssh/config
файл на local.machine, (створивши файл, якщо його не існує)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Після збереження файла ви можете просто використовувати
ssh target.machine
у будь-який час, коли ви хочете підключитися. Scp також буде працювати, оскільки він також поважає файл налаштування ssh. Так буде і Nautilus, якщо ви використовуєте GNOME і хочете використовувати GUI.
Host proxy.machine
рядки в одному ~/.ssh/config
файлі; 2) згадайте, чи можуть ці команди вбудовуватися (наприклад, клієнт підключається до хоста 1 проксі, який підключається до хоста проксі 2, який підключається. .. ціль) і 3) що nc %h %p
означає
Ви можете це зробити в одній команді, але вам потрібно встановити netcat (nc) на проксі-сервері:
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDIT: змішаний порядок машин ...]
Тепер ви можете це зробити * як однолінійний, нікуди не вимагаючи nc
:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Пояснення
pcreds
і tcreds
представляють свої проксі і цільові облікові дані , якщо це необхідно ( username
, username:password
і т.д.).
Це можливо через вбудовану мережеподібну здатність, усуваючи вимогу nc
щодо проміжного хоста. Використовуючи ssh -W host:port
налаштування тунелю до вказаного хосту та порту та підключає його до stdin / stdout, а потім scp
працює над тунелем.
В %h
і %p
в ProxyCommand
заміняються вказані цільовий хост і порт.
Для ще більшої зручності ви можете налаштувати проксі у вашій конфігурації ssh:
Host target.machine
ProxyCommand ssh pcreds@proxy.machine -W %h:%p
і відтоді просто робити
scp tcreds@target.machine:file .
* з часу OpenSSH 5.4 - випущено в березні 2010 року
-p <portnum>
перед -W
будь-яким методом, щоб вказати проксі-порт
Однолінійний? Не з голови. Спершу вам потрібно встановити проксі, і ви не можете цього зробити з scp самостійно.
Роблячи це вручну, я відкриваю сеанс екрана для свого тунелю:
screen -S tunnel
Екран використовується для збереження тунелю у фоновій оболонці. Використовуйте будь-яку техніку, яку ви хочете, щоб тунель був відкритим на задньому плані (відповідь @ weeheavy, мабуть, найпростіша). Опинившись на екрані, я запускаю тунель так
ssh -L 2222:target.machine:22 [user@]proxy.machine
Щоб зламати це, це в основному говорить "На моїй локальній машині відкритий порт 2222 та будь-яке з'єднання, що потрапляє у localhost: 2222, проксі через proxy.machine до target.machine: 22"
Як тільки ви встановите ssh-з'єднання та тунель, відключіться від екранного сеансу за допомогою "Ca d". Щоб повернутися до цього екранного сеансу, введітьscreen -raAd tunnel
Після повернення в оригінальну оболонку буде виглядати ваша команда scp
scp -P 2222 localhost:your/file/on/target.machine local/path
Пам'ятайте, що localhost порт 2222 - це справді лише тунель, що йде до target.machine.
Здається, що scp підтримує параметр "-o" так само, як і ssh, хоча я не впевнений, як передати ім'я користувача / пароль проксі:
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path
Якщо ви nc: invalid option -- X
побачите https://stackoverflow.com/a/23616021/32453
Як щодо:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Ви можете спробувати щось на кшталт:
ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file
Але це не спрацює, якщо ваш proxy.machine повинен запитати у вас пароль (що SSH не знаходиться в TTY, тому пропуск не вдасться).
Якщо у вас є більше одного файлу, ви можете використовувати так, як цей (неперевірений, я зазвичай використовую netcat таким чином):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Інша просте рішення для передачі ісходний_файл від source_host до destination_host ЧЕРЕЗ proxy_host :
Увійдіть на proxy_server :
ssh login@proxy_host
З проксі-сервера перенесіть source_file з source_host до призначення_host (ви можете ввести це як один рядок, опустивши \
або, як два рядки, як показано нижче):
scp login@source_host:/path_to_source_file \
login@destination_host:/path_to_destination_directory
Для цього потрібно, щоб вхід у source_host до proxy_host використовував rsa_key.
Якщо вам потрібно використовувати відкриті ключі, вам знадобиться щось подібне.
Host target-machine
User target-user
HostName target.example.com
IdentityFile /path/to/file.pem
ProxyCommand ssh bastion -W %h:%p
Host bastion
User bastion-user
HostName bastion.example.com
IdentityFile /path/to/file.pem
Я слідував за цією статтею і знайшов відповідь, яка працює для мене. (Тому, що відповіді вище для мене не працюють).
Як scp
додати файл через проміжний хост (він же стрибковий хост)
http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html
А моя відповідь така:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
Приклад:
scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
Сподіваюся, ця відповідь могла б вам допомогти.