48

У меня есть мой local.machine, proxy.machine и target.machine. local.machine не имеет прямого контакта с target.machine, но должен пройти через proxy.machine.

Я хочу скопировать файл из target.machine в local.machine. Это возможно сделать только одной командой из local.machine?

11 ответов11

59

Я знаю, что это поздний ответ, но я только что нашел крутой способ сделать это. Это в основном ответ Хольгера Джаста, но в сохраненном конфигурационном файле:

Вы должны поместить это в файл ~/.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 и хотите использовать графический интерфейс.

20

Вы можете сделать это одной командой, но на прокси-машине должен быть установлен netcat (nc):

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[РЕДАКТИРОВАТЬ: перепутал порядок машин ...]

17

Если вы не возражаете против использования rsync вместо scp, вы можете использовать следующую однострочную строку:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(вам понадобится доступ без пароля к прокси-машине)

13

Теперь вы можете * сделать это как однострочник, нигде не требуя 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 г.

8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

ОК, на самом деле две команды ...

6

Однострочник? Не с моей головы. Сначала вам нужно установить прокси, и вы не можете сделать это с помощью 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.

3

Похоже, что 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

2

Как насчет:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
1

Вы можете попробовать что-то вроде:

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 -'"
0

Другое простое решение для передачи исходного_файла от исходного_хоста к конечному_хосту через 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.

0

В случае, если вам нужно использовать открытые ключи, вам нужно что-то вроде этого.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .