Scp ผ่านพรอกซีด้วยคำสั่งเดียวจากเครื่องโลคอล?


54

ฉันมี local.machine, proxy.machine และ target.machine local.machine ไม่มีการติดต่อโดยตรงกับ target.machine แต่ต้องผ่าน proxy.machine

ฉันต้องการสแกนไฟล์จาก target.machine ถึง local.machine เป็นไปได้ไหมที่จะทำได้ด้วยคำสั่งเดียวจาก local.machine?

คำตอบ:


64

ฉันรู้ว่านี่เป็นคำตอบที่ล่าช้า แต่ฉันเพิ่งค้นพบวิธีที่ยอดเยี่ยมในการทำสิ่งนี้ เป็นเพียงคำตอบของ Holger Just แต่ในไฟล์ config ที่บันทึกไว้:

คุณต้องใส่มันลงใน~/.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 config Nautilus จะเป็นเช่นนั้นถ้าคุณใช้ GNOME และต้องการใช้ GUI


5
เพียงแค่บันทึกย่อ หากคุณกำลังใช้ไฟล์ข้อมูลสำรองทางเลือกผ่านตัวเลือกบรรทัดคำสั่ง -i สำหรับ ssh คุณต้องระบุตัวเลือกนั้นสำหรับทั้งการกำหนดค่า ProxyCommand และบรรทัดคำสั่ง ssh
BillMan

7
3 สิ่งที่อาจช่วยได้ 1) มันจะช่วยถ้าคุณแสดงHost proxy.machineบรรทัดใน~/.ssh/configไฟล์เดียวกัน2) พูดถึงว่าคำสั่งเหล่านี้สามารถซ้อนกันได้หรือไม่ (เช่นไคลเอนต์เชื่อมต่อกับพร็อกซีโฮสต์ 1 ซึ่งเชื่อมต่อกับพร็อกซีโฮสต์ 2 ซึ่งเชื่อมต่อ .. เป้าหมาย) และ 3) ความnc %h %pหมายคืออะไร
puk

เราจะคัดลอกจากเครื่องท้องถิ่นไปยังเครื่องเป้าหมายด้วยพรอกซีได้อย่างไร
Mulagala

19

คุณสามารถทำได้ในหนึ่งคำสั่ง แต่คุณต้องติดตั้ง netcat (nc) บนเครื่องพร็อกซี:

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

[แก้ไข: ผสมคำสั่งของเครื่องจักร ... ]


ลองดี แต่ฉันควรเพิ่มชื่อผู้ใช้สำหรับพร็อกซีและการเข้าสู่ระบบที่ไหน?
grm

Jzst หน้าชื่อเครื่องด้วย @ ฉันแก้ไขคำตอบของฉันเพื่อสะท้อนสิ่งนั้น
Holger เพียง

19

ตอนนี้คุณสามารถ * ทำสิ่งนี้เป็นหนึ่งซับโดยไม่ต้องใช้ 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


1
ตรวจสอบแล้วว่าใช้งานได้ดีจริง ๆ และไม่ปล่อยให้กระบวนการ NC เก่าค้างบนเครื่องพร็อกซี
LaXDragon

1
ฉันจะระบุพอร์ตของพรอกซีได้อย่างไร
Marged

1
@ กำหนดมากฉันไม่อยู่ในฐานะที่จะลองที่นี่ในขณะนี้ แต่ฉันคิดว่าคุณควรจะรวมไว้-p <portnum>ก่อนหน้านี้-Wในวิธีใดวิธีหนึ่งในการระบุพอร์ตพรอกซี
CupawnTae

1
ฉันใช้เวลาสักครู่เพื่อคิดออกว่าตัวเลือก -i (ถ้าคุณต้องการ) เข้าไปในเครื่องหมายคำพูด พร็อกซี ssh ไม่ได้ตามค่าเริ่มต้นใช้ไพรเวตคีย์เดียวกันกับที่ระบุโดยตัวเลือก -i ใด ๆ ที่ให้กับ scp โดยตรง ฉันเดาว่ามันชัดเจนเมื่อคุณคิดถึงมัน
Keeely

18

หากคุณไม่สนใจใช้ rsync แทน scp คุณสามารถใช้ one-liner ต่อไปนี้:

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

(คุณจะต้องเข้าถึงเครื่องพร็อกซี่แบบไม่ใช้รหัสผ่าน)


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

ตกลงจริง ๆ แล้วสองคำสั่ง ...


1
ฉันจะระบุพอร์ตของพร็อกซีของฉันได้อย่างไร ในกรณีของฉัน8080
Marged

@ -p <portnumber>คำสั่งเพิ่มไปยังคำสั่ง ssh ของคุณ
weeheavy

6

หนึ่งซับ? ไม่ปิดส่วนบนของหัวฉัน คุณต้องสร้างพร็อกซีก่อนและไม่สามารถทำได้ด้วยตัวเอง

เมื่อทำด้วยตนเองฉันจะเปิดเซสชันหน้าจอสำหรับอุโมงค์ของฉัน:

screen -S tunnel

หน้าจอใช้เพื่อให้อุโมงค์อยู่ในเปลือกพื้นหลัง ใช้เทคนิคใด ๆ ที่คุณต้องการให้อุโมงค์เปิดในพื้นหลัง (คำตอบของ @ weeheavy น่าจะง่ายที่สุด) เมื่ออยู่ในหน้าจอฉันจะเริ่มต้นอุโมงค์ของฉันอย่างนั้น

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

หากต้องการทำลายสิ่งนั้นโดยทั่วไปจะกล่าวว่า "บนเครื่องของฉันให้เปิดพอร์ต 2222 และ connetion ใด ๆ ที่กดปุ่ม 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


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


พี่ชายทำงานทันที :)
Elouan Keryell-Even

2

เกี่ยวกับ:

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

หรืออาจเป็นชื่อผู้ใช้: รหัสผ่านที่นี่?
rogerdpack

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

1

อีกวิธีง่ายๆในการถ่ายโอนsource_fileจากsource_hostไปยัง destination_hostผ่านproxy_host :

ล็อกอินบนproxy_server :

ssh login@proxy_host

จากพร็อกซีเซิร์ฟเวอร์ให้ถ่ายโอนsource_fileจาก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

0

ฉันติดตามบทความนี้และพบคำตอบที่เหมาะกับฉัน (เพราะคำตอบข้างต้นไม่ได้ผลสำหรับฉัน)

วิธีการscpส่งไฟล์ผ่านโฮสต์ระดับกลาง (aka jump host) 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

ฉันหวังว่าคำตอบนี้จะช่วยคุณได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.