Ответы:
Я знаю, что это поздний ответ, но я только что нашел крутой способ сделать это. Это в основном ответ Хольгера Джаста, но в сохраненном конфигурационном файле:
Вы должны поместить это в свой ~/.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. Так же будет и Наутилус, если вы используете GNOME и хотите использовать графический интерфейс.
Host proxy.machine
строки в том же ~/.ssh/config
файле, 2) Укажите, могут ли эти команды быть вложенными (т. Е. Клиент подключается к прокси-узлу 1, который подключается к прокси-узлу 2, который подключается к. ..target) и 3) что nc %h %p
значит
Вы можете сделать это одной командой, но на прокси-машине должен быть установлен netcat (nc):
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[РЕДАКТИРОВАТЬ: перепутал порядок машин ...]
Теперь вы можете * сделать это как однострочник, нигде не требуя nc
:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
объяснение
pcreds
и tcreds
представьте свой прокси и целевые учетные данные, если требуется ( username
, username:password
и т. д.).
Это возможно из-за встроенной способности, подобной netcat, что устраняет необходимость 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
Помните, что локальный порт 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, поэтому askpass завершится неудачно).
Если у вас более одного файла, вы можете использовать tar следующим образом (непроверенный, обычно я использую netcat):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Другое простое решение для передачи исходного_файла из исходного_хоста в конечный_хост через proxy_host :
Войдите на proxy_server :
ssh login@proxy_host
С прокси-сервера перенесите исходный_файл из source_host в destination_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
Я надеюсь, что этот ответ может помочь вам.