วิธีทำสำเนา scp ไฟล์ที่ซ่อนอยู่?


63

ฉันมักจะใช้ SCP เพื่อคัดลอกไฟล์ไปรอบ ๆ โดยเฉพาะไฟล์ที่เกี่ยวข้องกับเว็บ ปัญหาคือเมื่อใดก็ตามที่ฉันทำเช่นนี้ฉันไม่สามารถรับคำสั่งให้คัดลอกไฟล์ที่ซ่อน (เช่น. htaccess)

ฉันมักจะเรียกสิ่งนี้:

scp -rp src/ user@server:dest/

สิ่งนี้ไม่ได้คัดลอกไฟล์ที่ซ่อนอยู่ ฉันไม่ต้องการที่จะเรียกสิ่งนี้อีก (โดยทำสิ่งที่ชอบscp -rp src/.* ...- และนั่นมีความแปลก.และ..ความหมายอยู่แล้ว

ฉันไม่เห็นอะไรเลยในscpman page เกี่ยวกับ "รวมไฟล์ที่ซ่อนอยู่"

ฉันจะทำสิ่งนี้ได้อย่างไร


ฉันคิดว่ามันsrc/.*ก็อปปี้src/..(ไดเรคทอรีหลัก) ด้วยใช่มั้ย
Ken Sharp

คำตอบ:


67

นั่นควรจะตรงกับไฟล์ที่ซ่อนอยู่อย่างแน่นอน / ในตอนท้ายของแหล่งที่มาว่า "ทุกไฟล์ภายใต้ไดเรกทอรีนี้" อย่างไรก็ตามการทดสอบและการวิจัยช่วยให้คุณเข้าใจ นี่คือพฤติกรรมที่โง่

" คำตอบ " คือการเพิ่มจุดต่อท้ายแหล่งที่มา:

scp -rp src/. user@server:dest/

จริงคำตอบคือการใช้ rsync


เคล็ดลับดีฉันยังไม่ได้ตระหนักถึงเรื่องนี้
cstamas

21
rsync -avz -e ssh --progress src / user @ server: ปลายทาง /
MikeyB

2
ฉันทำซ้ำพฤติกรรมนั้นไม่ได้ scp -r source/ host:source2คัดลอกไฟล์จุด ทำงานใน OpenSSH 5.1 ตั้งแต่ปี 2007
Mikel

3
โปรดทราบว่าการเพิ่ม a .ท้ายจะไม่ทำงานอีกต่อไป (2019) เนื่องจากปัญหาด้านความปลอดภัย นี่คือคำอธิบายที่นี่: superuser.com/questions/1403473/scp-error-unexpected-filename
Stéphane

25

คุณสามารถลอง rsync เหมาะกว่าสำหรับงานนี้:

rsync -av src / ผู้ใช้ @ เซิร์ฟเวอร์: ปลายทาง /

(และหน้าคู่มือของมันคือมูลค่าการอ่าน)


2
ฉันมักจะใช้ตัวเลือก --progress สำหรับ rsync ฉันไม่สามารถอยู่ได้โดยปราศจากมัน = D
Hofa

1
@Hofa ฉันมักจะใช้ -P เพราะมันสั้นกว่านั้นรวมถึง --progress และยังรวมถึง - ส่วนที่สามารถทำให้เข้าใจได้ถ้าฉันสนใจในความคืบหน้าของมัน ;-)
cstamas

9

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

scp -rp src user@server:dest/

สิ่งนี้จะสร้างไดเรกทอรี 'src' ภายใต้ 'ปลายทาง' บนเครื่องระยะไกลโดยมีไฟล์ที่ซ่อนอยู่ทั้งหมดรวมอยู่ด้วย อาจไม่ใช่สิ่งที่คุณต้องการ แต่มันจะคัดลอกไฟล์ที่ซ่อนอยู่ใน src


3

ต่อไปนี้จะแก้ปัญหานี้ได้รับการทดสอบอย่างเต็มที่ในสภาพแวดล้อมการรวมอย่างต่อเนื่องของเรา

scp -rp src/. user@server:dest/
example scp -rp /usr/src/code/. content001@172.11.11.11:/usr/dest/code/

หวังว่ามันจะช่วย


หลังจากอัปเดต scp เมื่อเร็ว ๆ นี้ผลลัพธ์จะscp: error: unexpected filename: . ปรากฏขึ้น อย่าลืมทดสอบว่ามันใช้งานได้กับการแจกจ่ายของคุณหรือไม่เพื่อนชาว Google Googler :)
Moritz Friedrich

1

หากต้องการคัดลอกเฉพาะไฟล์ที่ซ่อนอยู่ให้ใช้คำสั่งนี้

scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/

เกมที่เกิดขึ้นจริงคือ/.[!.]*แท็กที่อ้างถึงไฟล์ที่ขึ้นต้นด้วย.(ซ่อนอยู่)


0

วิธีแก้ไขปัญหา scp ด้านบนไม่ทำงานสำหรับฉัน อย่างไรก็ตามฉันพบว่ารายการต่อไปนี้ทำงานบน cygwin: ไดเรกทอรี scp -r / * โฮสต์: ไดเรกทอรี '*' จับคู่ไฟล์ที่มองเห็นได้ทั้งหมดและข้ามไฟล์ที่มองไม่เห็น


0

หากการเข้าสู่ระบบรหัสผ่านถูกปิดใช้งานบนเครื่องระยะไกลและวิธีเดียวในการเข้าสู่ระบบคือการใช้รหัสสาธารณะคุณสามารถใช้สิ่งนี้:

$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress user1@remote.host:/remote/source/directory/ /local/destination/directory/

มันคัดลอกไฟล์ที่ซ่อนอยู่ด้วย

นอกจากนี้โปรดทราบว่า "user1" จะต้องมีสิทธิ์ในการอ่านไฟล์เหล่านั้นตัวอย่างเช่นคุณไม่สามารถคัดลอกโฟลเดอร์ ssh ของผู้ใช้รายอื่นด้วยวิธีนี้


0

ในฐานะที่scpสนับสนุนการแสดงออกปกตินี้จะทำเคล็ดลับสำหรับคุณ:

scp -rp src/(*|.*) user@server:dest/


0

การควบคุมการแก้ไขแบบกระจายจัดการกับไฟล์ที่ซ่อนอยู่

เพราะ CVE-2018-20685 ช่องโหว่ที่/.เคล็ดลับไม่สามารถนำมาใช้scpกับ อย่างไรก็ตามการควบคุมการแก้ไขแบบกระจายเช่นgitหรือ Hg Mecurial จะจัดการไฟล์ที่ซ่อนเช่นไฟล์อื่น ๆ นี่คือคำสั่งสำหรับHg Mercurialรายการโปรดของฉัน:

server:$ sudo apt install mercurial
client:$ sudo apt install mercurial
client:$ hg init src
client:$ cd src/
client:$ hg addr
client:$ hg com -m "first commit"
client:$ cd
client:$ hg clone src ssh://user@server/dest/

การเปลี่ยนแปลงครั้งต่อไปจะต้องมีการยืนยันอีกครั้งclient:$ hg com -m "commit message"จากนั้นจึงผลักโดยใช้client:$ hg pushคำสั่ง เรียนรู้เพิ่มเติมเกี่ยวกับการผลักดันการเปลี่ยนแปลงจากแผ่นโกงปรอทปรอทนี้

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