scp จากรีโมตเซิร์ฟเวอร์หนึ่งไปยังรีโมตเซิร์ฟเวอร์อื่น


15

ฉันมีหนึ่งใหญ่ไฟล์บนเซิร์ฟเวอร์oneและฉันต้องการที่จะคัดลอกไปยังเซิร์ฟเวอร์โดยใช้two scpฉันมีการตั้งค่าคีย์อย่างถูกต้องและฉันสามารถ ssh / scp ไปยังเซิร์ฟเวอร์ทั้งสองจากเดสก์ท็อปของฉัน

ไฟล์ที่ฉันต้องการคัดลอกนั้นใหญ่กว่าพื้นที่ว่างบนฮาร์ดดิสก์ของเวิร์กสเตชันของฉันดังนั้นฉันจึงต้องการ:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

แต่ฉันได้:

ssh: Could not resolve hostname one: Name or service not known

เราไม่มี DNS ที่นี่ (อย่าถามฉันว่าทำไม) ดังนั้นฉันจึงมีสิ่งนี้ใน ~ / .ssh / config:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

ถ้าฉันลองด้วยไฟล์ที่มีขนาดเล็กกว่าและถ่ายโอนจากoneไปยังเวิร์กสเตชันของฉันและไปยังtwoก็ใช้งานได้:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

เมื่อใช้ที่อยู่ IP โดยตรงตามที่แนะนำในความคิดเห็นฉันได้รับ:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

ไม่ใช่ปัญหา:

ขนาดไม่ใช่ปัญหาที่นี่ - เป็นเพียง "ทริกเกอร์" สำหรับปัญหานี้เนื่องจากไม่มีวิธีการจัดเก็บbigfile.tar.gzบนเวิร์กสเตชันของฉัน ปัญหาเกิดขึ้นโดยไม่คำนึงถึงขนาดของไฟล์

คำถาม:

ทำไมคำสั่ง:

scp oneremote:file secondremote:file

โยนข้อผิดพลาดโดยไม่คำนึงว่าใช้.ssh/configนามแฝงหรือใช้ที่อยู่ IP โดยตรงหรือไม่

แก้ไขแล้ว - เรียงลำดับ - ยังคงมองหาคำอธิบาย - ฉันแบ่งไฟล์ย่อยเป็นไฟล์ขนาดเล็กลงแล้วถ่ายโอนทีละไฟล์ผ่านเวิร์กสเตชันของฉัน ฉันยังสงสัยว่าทำไมมันไม่ทำงาน ดังนั้นฉันจะยังคงซาบซึ้งกับคำอธิบายบางอย่างที่ผิด ..

พบสาเหตุที่ทำให้มันล้มเหลว:ดูเหมือนว่าฉันเป็นคนโง่ ฉันคิดว่าคำสั่ง

scp one:file two:file

กำลังสร้างการเชื่อมต่อที่สองไปยังเซิร์ฟเวอร์แต่ละเครื่องจากนั้นรับข้อมูลจากหนึ่งและส่งไปยังสองทันทีและทำหน้าที่เหมือนรีเลย์

นี้ไม่ชัดเจนกรณีเพราะง่าย-vตัวเลือกเปิดเผยว่าในความเป็นจริงเพียงแค่เชื่อมต่อกับหนึ่งและจากที่หนึ่งก็พยายามที่จะเชื่อมต่อกับทั้งสอง ซึ่งเห็นได้ชัดว่าเป็นไปไม่ได้เนื่องจากเซิร์ฟเวอร์หนึ่งไม่ควรจะเชื่อมต่อกับทั้งสอง


คุณลองเปลี่ยนคำสั่ง scp เพื่อใช้ที่อยู่ IP แทนเช่น "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz jspurny @ ip_address_server_two: /opt/bigfile.tar.gz"

@tchester: ฉันไม่ได้ในขณะนี้ แต่จะให้เป็นเพียงแค่ข้อผิดพลาดที่แตกต่างกัน (ดูคำถามแก้ไข)
ม.ค. Spurny

เกี่ยวข้องกันอย่างไร unix.stackexchange.com/questions/14187/…
slm

@slm ไม่ฉันไม่มีปัญหากับขนาด
Jan Spurny

เมื่อฉันพบคำอธิบายของข้อผิดพลาดฉันต้องการเพิ่ม / ยอมรับมันเป็นคำตอบของฉันเอง แต่ดูเหมือนว่าฉันไม่ยุติธรรมเล็กน้อยเพราะจริง ๆ แล้วมันไม่ได้แก้ปัญหา คุณคิดว่าฉันควรเรียบเรียงคำถามใหม่เป็น: วิธีคัดลอกไฟล์จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์สองโดยใช้เวิร์กสเตชันของฉันเป็นรีเลย์ได้อย่างไร หรือฉันควรจะเพิ่มคำอธิบายของฉันไม่สามารถใช้ - ตัวเลือก verboseเป็นคำตอบและยอมรับมันได้หรือไม่
Jan Spurny

คำตอบ:


6

ท่อง่าย ๆ

ลองสิ่งนี้:

ssh one 'cat file' | ssh two 'cat > file'

คนแรกควรส่งเนื้อหาไฟล์ไปยังเครื่องของคุณในขณะที่คนที่สองควรส่งไฟล์นั้นไปยังเครื่องที่สอง ฉันจะคำนวณเช็คซัมที่ปลายทั้งสองหลังการถ่ายโอนเพื่อให้แน่ใจว่าไม่มีอะไรหลงทางหรืออ่านไม่ออกระหว่างทาง

อุโมงค์ที่ซับซ้อน

สำหรับแอพพลิเคชั่นที่ซับซ้อนมากขึ้นคุณสามารถใช้ ssh tunnels ตัวอย่างเช่นคุณสามารถลองสิ่งนี้:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

จากนั้นคุณสามารถเปิดการเชื่อมต่อบนoneไปยังเครื่องlocalhostพอร์ต5001และมันจะถูกส่งต่อไปสองครั้งและจบลงเช่นการเชื่อมต่อในtwoการพอร์ตlocalhost 22นี่คือพอร์ต ssh เพื่อให้คุณสามารถใช้สิ่งนี้สำหรับ SCP อื่นหรือ rsync หรืออะไรก็ตาม คุณสามารถเริ่มrsyncเซิร์ฟเวอร์twoและส่งต่อพอร์ต 873 แทน 22 หรือคุณสามารถใช้ncทั้งสองด้านเพื่อถ่ายโอนข้อมูลดิบโดยใช้หมายเลขพอร์ตโดยพลการ

ประโยชน์หลักระหว่างวิธีการข้างต้นคือคุณมีการเชื่อมต่อแบบสองทิศทาง tcp ระหว่างเครื่องสองเครื่องแทนที่จะเป็นแบบท่อทิศทางเดียวเท่านั้น ด้วยวิธีนี้ทั้งสองฝ่ายสามารถแลกเปลี่ยนข้อมูลซึ่งมีความสำคัญอย่างยิ่งในrsyncกรณีนี้


1
ขอบคุณ! นี่ไม่ได้ทำสิ่งที่ฉันต้องการแต่สิ่งที่ฉันต้องการจริง ๆซึ่งดีมาก
Jan Spurny

16

เครดิตทั้งหมดสำหรับคำตอบนี้ไปที่/superuser//a/602436/142948

คุณต้องการ-3ตัวเลือกสำหรับ SCP:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: สำเนาระหว่างโฮสต์ระยะไกลสองเครื่องจะถูกถ่ายโอนผ่านโลคัลโฮสต์ หากไม่มีตัวเลือกนี้ข้อมูลจะถูกคัดลอกโดยตรงระหว่างโฮสต์ระยะไกลสองแห่ง

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

ไม่เช่นนั้นนามแฝงที่สอง "สอง" จะถูกแก้ไขในโฮสต์ "หนึ่ง"ซึ่งอาจไม่มีอยู่


น่าเสียดายที่ตัวเลือกนี้ดูเหมือนจะค่อนข้างใหม่และแพร่กระจายไปยัง distros ทั้งหมด
whereswalden

2

เนื่องจากคุณมีผู้ใช้เข้าถึงเซิร์ฟเวอร์ต้นทาง (หนึ่ง) ทำไมไม่เข้าสู่ระบบและเรียกใช้คำสั่ง scp ของคุณบนเซิร์ฟเวอร์นั้นโดยตรง ... หากคุณกังวลว่ามันจะใช้เวลานานเกินไปให้เริ่มคำสั่งภายในscreenแล้วแยกออกจากหน้าจอด้วยCtrl+a dและ ปล่อยให้มันวิ่ง

อย่างไรก็ตามหากคุณต้องทำสิ่งนี้จากเวิร์กสเตชันของคุณและคีย์ SSH จากแหล่งข้อมูลไปยังเซิร์ฟเวอร์ปลายทางทำงานเป็นปกติแล้วส่งscpคำสั่งเป็นพารามิเตอร์ของsshคำสั่งเช่น:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

ขอบคุณที่จะใช้งานได้แน่นอนยกเว้นเซิร์ฟเวอร์เหล่านั้นทั้งสองได้ปิดการใช้งาน PasswordAuthentication และฉันไม่สามารถเพิ่มคีย์จากที่หนึ่งไปยังอีก - พวกเขาไม่ควรที่จะเชื่อมต่อซึ่งกันและกัน
Jan Spurny

0

การค้นหาข้อความแสดงข้อผิดพลาด: "การยืนยันคีย์โฮสต์ล้มเหลว" ดูเหมือนจะเป็นสิ่งที่ตรงไปตรงมาที่สุดที่จะทำที่นี่ ผมพบว่า Q & A นี้บน askubuntu หัวข้อ: ปัญหาการเชื่อมต่อ SSH กับ“การตรวจสอบที่สำคัญโฮสต์ล้มเหลว ...” ข้อผิดพลาด

หนึ่งในคำตอบของคำถาม & คำแนะนำนี้ชี้ให้เห็นว่าปัญหาโกหกด้วยรายการที่ขัดแย้งกันใน~/.ssh/known_hostsไฟล์ของคุณ คุณสามารถลบรายการที่มีปัญหาออกจากไฟล์นั้นโดยใช้โปรแกรมแก้ไขข้อความใด ๆ หรือคุณสามารถใช้คำสั่งนี้เพื่อลบรายการ:

$ ssh-keygen -R hostname

ไหนhostnameจะเป็นได้ทั้งที่อยู่ IP หรือชื่อของเซิร์ฟเวอร์ที่คุณกำลังพยายามที่จะเชื่อมต่อจาก ทั้งหมดข้างต้นจะเป็นเจ้าภาพที่สองโดยวิธี


ฉันไม่แน่ใจว่าฉันเข้าใจ ฉันสามารถ ssh oneและtwoเซิร์ฟเวอร์จากเวิร์กสเตชันของฉันโดยไม่มีปัญหาใด ๆ .. ปัญหาเริ่มต้นเมื่อฉันเรียกใช้scp one:file two:fileจากเวิร์กสเตชัน และมีไม่มีknown_hostsไฟล์ทั้งในหนึ่งหรือสอง ฉันเพียงแค่พยายามที่จะลบคีย์สำหรับสอง (แม้สำหรับหนึ่งเพื่อให้แน่ใจว่า) บนเวิร์กสเตชันของฉัน แต่ไม่มีอะไรเปลี่ยนแปลง (ยกเว้นคุณแน่ใจหรือว่า Y / N propt)
Jan Spurny

@ JanSpurny - การอ้างอิงถึงเวิร์กสเตชันของคุณทำให้ฉันสับสนเล็กน้อยใน Q นี้อย่างน้อยสำหรับฉัน เมื่อคุณพูดว่าคุณหมายถึงแล็ปท็อป / เดสก์ท็อปของคุณ ดังนั้นคุณจะทำอะไรแบบนี้เมื่อคุณบอกว่ามัน "ทำงาน": scp workstation:file one:fileและworkstation:file two:file? เห็นได้ชัดว่าคุณไม่จำเป็นต้องพูดว่า "เวิร์กสเตชัน: ไฟล์" ฉันแค่พูดอย่างชัดเจนเพื่อประโยชน์ของการสนทนา
slm

สิ่งที่ฉันพูดถึงก็คือฉันรันคำสั่งทั้งหมดจากเวิร์กสเตชันของฉัน ดังนั้นมันจึงเป็นมากขึ้นเช่น: และworkstation$ scp one:file file workstation$ scp file two:fileอย่างไรก็ตามฉันคิดว่าฉันแก้ไขมันแล้ว ฉันจะเพิ่มมันเป็นคำตอบของฉันเอง
Jan Spurny

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