วิธีใช้ไวด์การ์ด (*) เมื่อทำการคัดลอกด้วย scp?


144

เหตุใดฉันจึงไม่สามารถคัดลอกด้วย scp เมื่อฉันใช้*อักขระในเส้นทางได้

scp SERVERNAME:/DIR/* .

SCP ต้องการรูปแบบใดเพื่อให้อนุญาต*ในเส้นทาง

UPDATE: ปัญหาไม่ได้อยู่ที่ฝั่งเซิร์ฟเวอร์ pscp พยายามใช้งาน SCPv1 และนั่นคือสาเหตุที่ข้อความแสดงข้อผิดพลาด:

commandline scp และข้อความแสดงข้อผิดพลาดเกี่ยวกับไฟล์ชื่อ *


ตรวจสอบสิ่งนี้มันใช้งานได้สำหรับฉัน: https://superuser.com/a/1390405/445746
AmitM

คำตอบ:


126

คุณต้องผ่านการหลบหนีที่แท้จริงscpเพื่อหลีกเลี่ยงเครื่องรีโมตที่ทำงาน*แบบกลม (โปรดสังเกตว่ามีการอ้างอิงเป็นสองเท่า):

scp 'SERVERNAME:/DIR/\*' .

41
คุณต้องมีเครื่องหมายคำพูดหรือแบ็กสแลชต่อหน้าดาวไม่ใช่ทั้งคู่ และ scp ไม่ได้เป็นส่วนขยายมันเชลล์คือ
Patrick

3
คุณเคยลองไหม ฉันเพิ่งทำมันทำงานตรงตามที่ฉันอธิบาย (การอ้างอิงและการหลบหนีทำให้เกิดความล้มเหลว) User1274964 ยังยืนยันพฤติกรรมในคำตอบของเขา touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick

2
@ แพทริคคำถามที่เกี่ยวกับการใช้เครื่องหมายดอกจันที่แท้จริงคือการหลีกเลี่ยงการทำให้กลมกลืนไปด้วยกันไม่ใช่เกี่ยวกับวิธีการทำให้กลมบนรีโมท
Chris Down

2
ที่จริงคำถามคือเกี่ยวกับการได้รับpscpในด้านลูกค้าเพื่อให้การเรียกดูแบบระยะไกล
Patrick

1
ใช่คุณไม่จำเป็นต้องหลบหนีเครื่องหมายดอกจันหากคุณใช้เครื่องหมายคำพูดเดี่ยว
นำ

52

ฉันพบว่าคำแนะนำของ Patrick นั้นถูกต้องแม้ว่าคำตอบของ Chris จะทำให้ฉันไปถูกทาง ใช้เครื่องหมายคำพูดแล้วคุณไม่จำเป็นต้องใช้แบ็กสแลชก่อนเครื่องหมายดอกจัน

scp 'SERVERNAME:/tmp/file_num\*' .

scp: /tmp/file_num*.csv: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

scp 'SERVERNAME:/tmp/file_num*' .

judgments_for_job_171642.csv 100% 32KB 32.0KB / s 00:00
judgments_for_job_172394.csv 100% 548KB 182.6KB / s 00:03


4
ถูกต้องเพราะนี่หมายความว่าคุณต้องการที่จะมองดูไกล ๆ คำถามคือเกี่ยวกับวิธีการหยุด globbing บนระยะไกล (เพื่อให้ได้ตัวอักษร*) ไม่ใช่เกี่ยวกับวิธีการ glob บนรีโมทเท่านั้น
Chris Down

3
@ChrisDown ไม่ผู้ใช้ต้องการให้ไวด์การ์ดไม่ขยายในโฮสต์และต้องการให้ขยายบนรีโมตเพื่ออนุญาตให้จับคู่หลายไฟล์ในนั้น ไม่มีไฟล์ที่ส่งคืนมีตัวอักษร '*' อยู่ในนั้น คุณหมายถึง " หยุด globbing on host " หรือไม่
Tim Bird

1

หมายเหตุ:โซลูชั่นที่นำเสนอด้านล่างผ่านการทดสอบและเป็นที่รู้จักในการทำงานอย่างถูกต้อง

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

ต่อไปนี้เป็นสคริปต์ที่ใช้เครื่องหมายคำพูดคู่สำหรับกรณีการใช้งานของชื่อไฟล์คำสั่ง glob - command_ configure_ .tar.gz *โดยใช้เส้นทางนามแฝงพร้อมตัวแปร:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

หลังจากที่ราคาคู่ปิดเป้าหมายไดเรกทอรีท้องถิ่นที่สร้างขึ้นโดยเพียงแค่การสกัด dir บ้านของผู้ใช้ที่ระบุจาก/ etc / passwd

คำสั่ง scp นั้นจะถูกนำหน้าด้วยsshpassและ-o StrictHostKeyChecking=noเพื่อทำให้scpคำสั่งนั้นสมบูรณ์โดยอัตโนมัติ ดูซับซ้อน แต่ดีกว่าเส้นทางเข้ารหัสยากซึ่งคาดว่าจะเปลี่ยนแปลงได้ตลอดเวลา

Anyhoo ตัวอย่างการใช้เครื่องหมายคำพูดคู่ที่ตัวแปรในเส้นทางที่คุณกำลังวนซ้ำต้องได้รับอนุญาตให้ขยาย HTH

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