Scp melalui proxy dengan satu perintah dari mesin lokal?

54

Saya memiliki local.machine saya, proxy.machine dan target.machine. local.machine tidak memiliki kontak langsung dengan target.machine, tetapi harus melalui proxy.machine.

Saya ingin scp file dari target.machine ke local.machine. Apakah ini mungkin dilakukan hanya dengan satu perintah dari local.machine?

grm
sumber

Jawaban:

64

Saya tahu ini adalah jawaban yang terlambat, tetapi saya baru tahu cara keren untuk melakukan ini. Ini pada dasarnya adalah jawaban Holger Just, tetapi dalam file konfigurasi yang disimpan:

Anda harus meletakkan ini di ~/.ssh/configfile Anda di local.machine, (membuat file jika tidak ada)

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

Setelah menyimpan file, Anda bisa menggunakannya

ssh target.machine

kapan saja Anda ingin terhubung. Scp juga akan berfungsi karena ia juga menghormati file konfigurasi ssh. Begitu juga Nautilus, jika Anda menggunakan GNOME dan ingin menggunakan GUI.

pengguna24925
sumber
5
Hanya catatan singkat. Jika Anda menggunakan file identitas alternatif melalui opsi -i command line untuk ssh, Anda perlu menentukan opsi itu untuk konfigurasi ProxyCommand dan baris perintah ssh.
BillMan
7
3 hal yang mungkin membantu, 1) akan membantu jika Anda juga menunjukkan Host proxy.machinebaris dalam ~/.ssh/configfile yang sama , 2) Sebutkan apakah perintah ini dapat disarangkan (mis. Klien terhubung ke proxy host 1 yang menghubungkan ke proxy host 2 yang terhubung ke. ..target) dan 3) apa nc %h %partinya
puk
Bagaimana kita bisa menyalin dari mesin lokal ke mesin target dengan proxy?
Mulagala
19

Anda dapat melakukannya dalam satu perintah, tetapi Anda perlu netcat (nc) diinstal pada mesin proxy:

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

[EDIT: campur aduk urutan mesin ...]

Holger Just
sumber
Usaha yang bagus, tetapi di mana saya harus menambahkan nama pengguna untuk proxy dan untuk login?
GRM
Pertama sebelum nama mesin, dengan @. Saya mengedit jawaban saya untuk mencerminkan hal itu.
Holger Just
19

Anda sekarang dapat * melakukan ini sebagai satu-liner, tanpa memerlukan nc tempat:

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

Penjelasan

pcredsdan tcredsmewakili proxy dan sasaran kredensial Anda jika diperlukan ( username, username:password, dll).

Ini dimungkinkan karena built-in seperti netcat-like, menghilangkan persyaratan untuk nchost perantara. Menggunakan ssh -W host:portset up tunnel ke host dan port yang ditentukan dan menghubungkannya ke stdin / stdout, dan kemudian scpberjalan di atas tunnel.

The %hdan %pdi ProxyCommanddiganti dengan host target dan port yang Anda tentukan.

Untuk kenyamanan lebih, Anda dapat mengonfigurasi proxy di konfigurasi ssh Anda:

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

dan sejak saat itu lakukan saja

scp [email protected]:file .

* sejak OpenSSH 5.4 - dirilis Maret 2010

CupawnTae
sumber
1
Diverifikasi ini memang bekerja dengan baik, dan tidak meninggalkan proses NC basi berbaring di mesin proxy.
LaXDragon
1
Di mana saya dapat menentukan port proxy?
Marged
1
@Dibuat Saya tidak dalam posisi untuk mencobanya di sini saat ini, tapi saya pikir Anda harus dapat memasukkan -p <portnum>sebelum -Wdalam metode mana pun untuk menentukan port proxy
CupawnTae
1
Butuh beberapa saat untuk mengetahui bahwa opsi -i (jika Anda membutuhkannya) masuk ke dalam tanda kutip. Secara default, proxy ssh tidak menggunakan kunci privat yang sama yang ditentukan oleh opsi -i yang disediakan langsung ke scp. Saya kira itu sudah jelas ketika Anda memikirkannya.
Keeely
18

Jika Anda tidak keberatan menggunakan rsync daripada scp, Anda dapat menggunakan satu-baris berikut:

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

(Anda akan memerlukan akses tanpa kata sandi ke mesin proxy)

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

Oke, sebenarnya dua perintah ...

berat
sumber
1
Bagaimana cara menentukan port proxy saya? Dalam kasus saya8080
Marged
@ Dimasukkan tambahkan -p <portnumber>ke perintah ssh Anda
weeheavy
6

Satu kalimat? Bukan dari atas kepalaku. Anda harus membuat proxy terlebih dahulu dan Anda tidak dapat melakukannya dengan scp dengan sendirinya.

Ketika melakukannya secara manual, saya membuka sesi layar untuk terowongan saya:

screen -S tunnel

Layar digunakan untuk menjaga terowongan tetap berada di shell latar belakang. Gunakan teknik apa pun yang Anda inginkan agar terowongan tetap terbuka di latar belakang (jawaban @ weeheavy mungkin yang paling sederhana). Sekali dalam sesi layar saya memulai terowongan saya seperti itu

ssh -L 2222:target.machine:22 [user@]proxy.machine

Untuk memecahnya, yang pada dasarnya mengatakan "Pada mesin lokal saya, buka port 2222 dan koneksi yang mengenai localhost: 2222 diproksikan melalui proxy.machine ke target.machine: 22"

Setelah koneksi ssh dan terowongan terbentuk, lepaskan dari sesi layar dengan "Ca d". Untuk kembali ke sesi layar itu, ketikscreen -raAd tunnel

Setelah Anda kembali ke shell asli, perintah scp Anda akan terlihat seperti

scp -P 2222 localhost:your/file/on/target.machine local/path

Ingatlah bahwa localhost port 2222 sebenarnya hanyalah sebuah terowongan yang akan menuju target.machine.

ikan paus
sumber
3

Muncul bahwa scp mendukung opsi "-o" sama seperti ssh, meskipun saya tidak yakin bagaimana cara melewatinya nama pengguna / kata sandi proxy:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Jika Anda nc: invalid option -- Xmelihat https://stackoverflow.com/a/23616021/32453

rogerdpack
sumber
dope bro, langsung bekerja :)
Elouan Keryell-Even
2

Bagaimana tentang:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
eggroll77
sumber
atau mungkin nama pengguna: kata sandi di sini?
rogerdpack
1

Anda dapat mencoba sesuatu seperti:

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

Tapi itu tidak akan berfungsi jika proxy.machine Anda perlu meminta kata sandi Anda (SSH itu tidak ada dalam TTY, jadi askpass akan gagal).

Jika Anda memiliki lebih dari satu file, Anda dapat menggunakan tar seperti ini (belum diuji, saya biasanya menggunakan netcat seperti itu):

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

Solusi sederhana lain untuk mentransfer source_file dari source_host ke destination_host melalui proxy_host :

Masuk di proxy_server :

ssh login@proxy_host

Dari server proxy, transfer source_file dari source_host ke destination_host (Anda dapat mengetik ini sebagai satu baris, menghilangkan \, atau dua baris, seperti yang ditunjukkan di bawah ini):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Ini mensyaratkan bahwa login di source_host ke proxy_host menggunakan rsa_key.

lomai
sumber
0

Jika Anda perlu menggunakan kunci publik, Anda akan membutuhkan sesuatu seperti ini.

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
Leo
sumber
0

Saya mengikuti artikel ini dan menemukan jawaban yang cocok untuk saya. (Karena jawaban di atas tidak bekerja untuk saya).

Bagaimana caranya scp cara file melalui host perantara (alias host melompat) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

Dan jawaban saya adalah sebagai berikut:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Contoh:

scp -oProxyCommand="ssh -W %h:%p [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

Saya harap jawaban ini dapat membantu Anda.

Wise Lin
sumber