Scp над прокси с одной командой с локальной машины?

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

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

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

    Вы должны поместить это в свой файл ~/.ssh/config на local.machine (создание файла, если он не существует)

     Host target.machine User targetuser HostName target.machine ProxyCommand ssh [email protected] nc %h %p 2> /dev/null 

    После сохранения файла вы можете просто использовать

     ssh target.machine 

    В любое время, когда вы хотите подключиться. Scp также будет работать так же, как и файл конфигурации ssh. Так будет Nautilus, если вы используете GNOME и хотите использовать графический интерфейс.

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

     ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected] 

    [EDIT: перепутал порядок машин …]

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

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

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

     $ ssh -f -N -L <localport>:<target.machine:port> [email protected] $ scp [email protected]:/remote/file -P <localport> . 

    Хорошо, на самом деле две команды …

    Однострочный? Не с головы. Сначала вам нужно установить прокси-сервер, и вы не можете сделать это с помощью scp.

    Когда вы делаете это вручную, я открываю сеанс экрана для моего туннеля:

    screen -S tunnel

    Экран используется для сохранения туннеля в фоновом режиме. Используйте любой метод, который вы хотите сохранить туннель открытым в фоновом режиме (ответ @ weeheavy, вероятно, самый простой). Однажды в сеансе экрана я запускаю свой туннель так

    ssh -L 2222:target.machine:22 [[email protected]]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 port 2222 – это просто туннель, идущий к target.machine.

    Более свежие версии ssh имеют встроенную способность netcat и не требуют nc на промежуточном хосте. Использование ssh -W host:port устанавливает туннель к указанному хосту и порту и подключает его к stdin / stdout.

    Это позволяет вам прокси-серверу с помощью одной команды:

     scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file . 

    Или с использованием конфигурации

     Host target.machine ProxyCommand ssh [email protected] -W %h:%p 

    И с этого момента просто выполните scp [email protected]:file .

    Где pcreds и tcreds представляют ваши прокси и целевые учетные данные, если требуется ( username , username:password и т. Д.).

    Появляется, что scp поддерживает параметр «-o», как и ssh, хотя я не уверен, как передать ему имя пользователя / пароль прокси:

     scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" [email protected]_host:remote_path local_path 

    Если вы получите nc: invalid option -- X см. https://stackoverflow.com/a/23616021/32453

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

     ssh [email protected] "ssh [email protected] 'cat > file'" < file 

    Но это не сработает, если ваш proxy.machine должен запросить у вас пароль (что SSH не находится в TTY, поэтому askpass сработает).

    Если у вас несколько файлов, вы можете использовать tar как это (непроверенный, я обычно использую netcat таким образом):

     tar cf - file1 file2 folder1/ | ssh [email protected] "ssh [email protected] 'tar xvf -'" 

    Как насчет:

     scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location 

    Еще одно простое решение для передачи source_file из source_host в destination_host через proxy_host :

    Войдите в систему на proxy_server :

     ssh [email protected]_host 

    На прокси-сервере перенесите исходный_файл из source_host в destination_host (вы можете ввести его как одну строку, опустив \ или две строки, как показано ниже):

     scp [email protected]_host:/path_to_source_file \ [email protected]_host:/path_to_destination_directory 

    Это требует, чтобы логин на source_host на proxy_host использовал rsa_key.

    Давайте будем гением компьютера.