คำสั่ง SCP ที่มีไฟล์และไดเรกทอรีที่เลือกไว้สำหรับการดาวน์โหลดจะขอรหัสผ่านสำหรับแต่ละไฟล์หรือไดเรกทอรีใหม่


9

ในระบบ Fedora 20 ของฉันฉันใช้ scp บ่อยครั้งและนี่เป็นครั้งที่สองที่ฉันพบสิ่งนี้เมื่อฉันเรียกใช้คำสั่งนี้:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

มันถามรหัสผ่านสำหรับแต่ละไฟล์ / ไดเรกทอรีที่ถ่ายโอน

user@host's password: "password here"

คำถาม:

เกิดอะไรขึ้นที่นี่

เป็นเรื่องปกติหรือไม่ฉันคิดว่านี่เป็นพฤติกรรมที่แปลกประหลาดมาก?

คำตอบ:


13

เชลล์ในเครื่องของคุณ (อาจทุบตี) กำลังขยายตัว

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

เป็น:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

แต่คุณสามารถทำได้:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

หรือถ้าคุณรู้ว่าเชลล์ล็อกอินของผู้ใช้บนรีโมตปลายทางเป็น bash คุณสามารถใช้การขยายรั้งได้เช่นกัน:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

เพื่อให้รีโมตเชลล์แยกสตริงเป็นอาร์กิวเมนต์แทนที่จะเป็นโลคัลเชลล์


5

ใช่มันเป็นเรื่องปกติ สิ่งที่เกิดขึ้นคือเปลือกของคุณขยายเครื่องหมายปีกกาก่อนที่จะเรียกใช้คำสั่งดังนั้นสิ่งที่คุณกำลังเรียกใช้คือ

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

โดยทั่วไปแล้วscpจะเห็นคำขอเชื่อมต่อหลายรายการดังนั้นจึงเปิดการเชื่อมต่อใหม่สำหรับแต่ละคำขอ ทางเดียววิธีที่ง่ายที่สุด(การใช้เครื่องหมายคำพูดตามที่ @geirha นั้นง่ายกว่าสำหรับการดำเนินการครั้งเดียว) เพื่อแก้ปัญหานี้คือการตั้งค่ารหัสผ่านssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

หลังจากเรียกใช้คำสั่งทั้งสองครั้งเดียว (และตอบรับพร้อมท์ตามต้องการ) คุณจะสามารถssh/ scpไม่ใช้รหัสผ่านสำหรับการเชื่อมต่อ ssh ในอนาคตทั้งหมด นี่คือ i) จริงปลอดภัยมากขึ้นและ ii) มากสะดวกมากขึ้น


+1, วิธีที่ดี (แน่นอนต้องทำ ssh-keygen & ssh-copy-id เพียงครั้งเดียว) ฉันจะบอกว่ามันมีความปลอดภัยมากขึ้น ... เฉพาะในกรณีที่คุณตรวจสอบให้แน่ใจว่าชิ้นส่วนส่วนตัวนั้น "ไม่สามารถเข้าถึงได้" โดยทุกคนยกเว้นผู้ใช้รายนั้น ... ซึ่งไม่ง่ายเสมอไป
Olivier Dulac

@OlivierDulac คุณหมายถึงอะไร id.rsaจะมี600สิทธิ์โดยค่าเริ่มต้นและsshจะไม่ได้ทำงานถ้ามันไม่ได้ ซึ่งหมายความว่าปลอดภัยจากทุกคน แต่rootไม่มีสิ่งใดปลอดภัยrootแน่นอนไม่ใช่รหัสผ่าน
terdon

ฉันแค่หมายถึงการเพิ่มความคิดเห็นนี้เพื่อให้คนตั้งค่าการเข้าถึงรหัสผ่านคำนึงถึง (และ grok) ความจริงที่ว่าคีย์ส่วนตัวจะต้องอยู่ในสภาพแวดล้อมที่ปลอดภัยและไม่สามารถอ่าน / ไม่แชร์ / ฯลฯ (กล่าวคือเป็นวิธีที่นุ่มนวลในการชี้ให้เห็นสิ่งนี้เนื่องจากคนที่ถามอาจไม่ทราบถึงผลกระทบทั้งหมดที่การแบ่งปัน / การอนุญาตให้เข้าถึงคีย์ส่วนตัวสามารถทำได้)
Olivier Dulac

@ OlivierDulac อายุติธรรมพอ ฉันไม่คิดว่ามันน่าพูดถึงเพราะ 1) มันเกิดขึ้นโดยอัตโนมัติเมื่อใช้งานssh-keygenและ 2) ssh / scp จะบ่นและขอรหัสผ่านหากคนอื่นสามารถอ่านไฟล์ได้ อย่างน้อยบน Linux ต่อไป
terdon

4

scp ไม่ฉลาดมาก: เมื่อกำหนดอาร์กิวเมนต์บรรทัดคำสั่งหลายไฟล์ซึ่งเป็นไฟล์จากรีโมตโฮสต์เดียวกันจะเป็นการเปิดการเชื่อมต่อใหม่สำหรับแต่ละอาร์กิวเมนต์

คุณสามารถใช้rsyncแทนscpวิธีนี้ได้อย่างชาญฉลาดกว่า (และวิธีอื่น ๆ )

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

อีกวิธีหนึ่งคือการส่งผ่านอาร์กิวเมนต์เดียวเพื่อscpที่อธิบายหลายไฟล์

แนวทางที่แตกต่างคือการตั้งค่าระบบของคุณเพื่อให้คุณไม่ต้องตรวจสอบสิทธิ์ตลอดเวลา ควรตั้งค่าการรับรองความถูกต้องของคีย์ซึ่งเป็นสถานการณ์ส่วนใหญ่ที่สะดวกและปลอดภัยยิ่งขึ้น หรือนอกจากนี้ให้ตั้งค่าการแชร์การเชื่อมต่อเพื่อให้คุณต้องตรวจสอบสิทธิ์หนึ่งครั้งต่อเซสชัน ไม่ว่าในกรณีใดก็ตามให้ตั้งค่านามแฝงเพื่อให้คุณไม่ต้องระบุชื่อผู้ใช้และพอร์ตทุกครั้ง ใน~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

เรียกใช้ssh -Nf nickเพื่อเปิดการเชื่อมต่อจากนั้นการเชื่อมต่อที่ตามมาทั้งหมดnickจะ piggyback ในการเชื่อมต่อที่มีอยู่ ตอนนี้คุณสามารถวิ่งได้แล้ว

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.