Ответы:
Я знаю, что это поздний ответ, но я только что нашел крутой способ сделать это. Это в основном ответ Хольгера Джаста, но в сохраненном конфигурационном файле:
Вы должны поместить это в свой ~/.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
Я надеюсь, что этот ответ может помочь вам.