ฉันมี local.machine, proxy.machine และ target.machine local.machine ไม่มีการติดต่อโดยตรงกับ target.machine แต่ต้องผ่าน proxy.machine
ฉันต้องการสแกนไฟล์จาก target.machine ถึง local.machine เป็นไปได้ไหมที่จะทำได้ด้วยคำสั่งเดียวจาก local.machine?
ฉันมี local.machine, proxy.machine และ target.machine local.machine ไม่มีการติดต่อโดยตรงกับ target.machine แต่ต้องผ่าน proxy.machine
ฉันต้องการสแกนไฟล์จาก target.machine ถึง local.machine เป็นไปได้ไหมที่จะทำได้ด้วยคำสั่งเดียวจาก local.machine?
คำตอบ:
ฉันรู้ว่านี่เป็นคำตอบที่ล่าช้า แต่ฉันเพิ่งค้นพบวิธีที่ยอดเยี่ยมในการทำสิ่งนี้ เป็นเพียงคำตอบของ 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
Host proxy.machine
บรรทัดใน~/.ssh/config
ไฟล์เดียวกัน2) พูดถึงว่าคำสั่งเหล่านี้สามารถซ้อนกันได้หรือไม่ (เช่นไคลเอนต์เชื่อมต่อกับพร็อกซีโฮสต์ 1 ซึ่งเชื่อมต่อกับพร็อกซีโฮสต์ 2 ซึ่งเชื่อมต่อ .. เป้าหมาย) และ 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
ในวิธีใดวิธีหนึ่งในการระบุพอร์ตพรอกซี
หากคุณไม่สนใจใช้ rsync แทน scp คุณสามารถใช้ one-liner ต่อไปนี้:
rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/
(คุณจะต้องเข้าถึงเครื่องพร็อกซี่แบบไม่ใช้รหัสผ่าน)
หนึ่งซับ? ไม่ปิดส่วนบนของหัวฉัน คุณต้องสร้างพร็อกซีก่อนและไม่สามารถทำได้ด้วยตัวเอง
เมื่อทำด้วยตนเองฉันจะเปิดเซสชันหน้าจอสำหรับอุโมงค์ของฉัน:
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
ปรากฏว่า 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 -'"
อีกวิธีง่ายๆในการถ่ายโอน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
ในกรณีที่คุณต้องใช้กุญแจสาธารณะคุณจะต้องมีสิ่งนี้
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
ส่งไฟล์ผ่านโฮสต์ระดับกลาง (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
ฉันหวังว่าคำตอบนี้จะช่วยคุณได้