ฉันต้องการใช้scp
เพื่ออัปโหลดไฟล์ แต่บางครั้งอาจไม่มีไดเรกทอรีเป้าหมาย
เป็นไปได้หรือไม่ที่จะสร้างโฟลเดอร์อัตโนมัติ ถ้าเป็นเช่นนั้นได้อย่างไร ถ้าไม่ฉันจะลองอีกวิธีได้อย่างไร
ฉันต้องการใช้scp
เพื่ออัปโหลดไฟล์ แต่บางครั้งอาจไม่มีไดเรกทอรีเป้าหมาย
เป็นไปได้หรือไม่ที่จะสร้างโฟลเดอร์อัตโนมัติ ถ้าเป็นเช่นนั้นได้อย่างไร ถ้าไม่ฉันจะลองอีกวิธีได้อย่างไร
คำตอบ:
นี่คือหนึ่งในหลาย ๆ สิ่งที่rsync
สามารถทำได้
หากคุณกำลังใช้รุ่นที่วางrsync
จำหน่ายในช่วงหลายปีที่ผ่านมา command ไวยากรณ์คำสั่งพื้นฐานจะคล้ายกับscp
: ²
$ rsync -r local-dir remote-machine:path
ที่จะคัดลอกlocal-source
และเนื้อหาไปยัง$HOME/path/local-dir
บนเครื่องระยะไกลสร้างไดเรกทอรีใด ๆ ที่จำเป็น³
rsync
มีข้อ จำกัด บางอย่างที่นี่ซึ่งอาจส่งผลต่อการทำงานในสถานการณ์เฉพาะของคุณ มันจะไม่สร้างไดเรกทอรีระยะไกลที่ขาดหายไปหลายระดับเช่น มันจะสร้างได้เพียงหนึ่งระดับที่หายไปบนรีโมท คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ง่ายๆโดยนำหน้าrsync
คำสั่งด้วยสิ่งนี้:
$ ssh remote-host 'mkdir -p foo/bar/qux'
มันจะสร้าง$HOME/foo/bar/qux
ต้นไม้ถ้ามันไม่มีอยู่จริง มันจะไม่บ่นหรือทำอะไรอย่างอื่นไม่ดีถ้ามันไม่อยู่แล้ว
rsync
บางครั้งมีพฤติกรรมที่น่าแปลกใจอื่น ๆ โดยทั่วไปคุณจะต้องให้มันเข้าใจว่าคุณตั้งใจจะทำสำเนาอะไรและการเดานั้นอาจไม่ตรงกับสมมติฐานของคุณ ลองและดู หากมันไม่ทำงานตามที่คุณคาดหวังและคุณไม่สามารถเห็นสาเหตุให้โพสต์รายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าไดเรกทอรีท้องถิ่นและระยะไกลของคุณและให้คำสั่งที่คุณลอง
เชิงอรรถ :
ก่อนที่rsync
2.6.0 (1 มกราคม 2004) ก็จำเป็นต้องใช้-e ssh
ธงที่จะทำให้มันทำตัวเหมือนscp
เพราะมันจะผิดนัดล้าสมัยโปรโตคอล RSH
scp
และrsync
แชร์ธงบางส่วน แต่มีการทับซ้อนกันเพียงเล็กน้อย
เมื่อใช้SSH
เป็นโปรโตคอลการถ่ายโอนให้rsync
ใช้ค่าเริ่มต้นเดียวกัน ดังนั้นเหมือนscp
จะถือว่ามีผู้ใช้ที่มีชื่อเดียวกันกับผู้ใช้ท้องถิ่นของคุณบนเครื่องระยะไกลตามค่าเริ่มต้น
rsync
หน้าเอกสารของการสืบค้นไม่พบวิธีใช้ ssh-key เพื่อเข้าสู่ระบบ ฉันไม่ต้องการใช้ชื่อผู้ใช้ / รหัสผ่านเพื่อเข้าสู่ระบบ
rsync
กับ และใช่คุณต้องการrsync
ด้านรีโมตด้วยเช่นscp
กัน สำหรับคีย์ SSH rsync
นั้นจริง ๆ แล้วใช้ SSH ภายใต้ค่าเริ่มต้น-e ssh
ดังนั้นหากคุณมีการตั้งค่าคีย์สำหรับใช้งานด้วยscp
ก็จะใช้งานได้rsync
เช่นกัน
-r
ไม่ได้สร้างความแตกต่าง สถานการณ์ที่คุณอธิบายจะใช้งานได้เฉพาะในกรณีที่คุณคัดลอกไดเรกทอรีและหากมีไดเรกทอรีเป้าหมายหลักอยู่ ดังนั้นrsync foo/ u@h:~/
จะสร้างไดเรกทอรีเป้าหมายfoo
แต่จะไม่สร้างไดเรกทอรีเป้าหมายrsync foo/ u@h:~/bar/
bar
อันนั้นจะสร้างbar/foo
ก็ต่อเมื่อbar/
มีอยู่ ไม่ว่าในกรณีใด OP กำลังอัปโหลดไฟล์และแม้ในกรณีที่ใช้งานได้มันจะใช้ได้กับไดเรกทอรีทั้งหมดเท่านั้น
rsync file host:/foo/file
ล้มเหลวหากfoo/
ไม่มีอยู่ แต่rsync file host:/foo/
สร้างไดเรกทอรีและตำแหน่งfile
ในนั้น แปลก. อย่างไรก็ตามคุณพูดถูกและสถานการณ์พื้นฐานก็ใช้ได้ฉันจะถอนการโหวตของฉัน
หากคุณกำลังคัดลอกกลุ่มไฟล์จริงๆ หากคุณกำลังคัดลอกไดเรกทอรีและเนื้อหาทั้งหมดด้านล่างใช่ ให้คำสั่งนี้:
$ scp -pr /source/directory user@host:the/target/directory
หากdirectory
ไม่อยู่ใน~/the/target
บนhost
มันจะถูกสร้างขึ้น อย่างไรก็ตามหาก~the/target
ไม่มีอยู่คุณอาจมีปัญหา - ฉันไม่สามารถจดจำผลลัพธ์ที่แน่นอนของคดีนี้ แต่ต้องเตรียมพร้อมสำหรับจุดประสงค์ที่scp
จะล้มเหลว
scp: /home/madmike/test_bin: No such file or directory
ทันทีที่ไดเรกทอรีเป้าหมายขาดตัวแบ่งนี้ในการตั้งค่าของฉัน ใช้ cygwin บนไคลเอนต์และ RHEL 6.9 บนเซิร์ฟเวอร์ การตั้งค่าของคุณคืออะไร?
เท่าที่ฉันรู้ตัวscp
เองไม่สามารถทำอย่างนั้นไม่ อย่างไรก็ตามคุณสามารถssh
ไปที่เครื่องเป้าหมายสร้างไดเรกทอรีแล้วคัดลอก สิ่งที่ต้องการ:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
โปรดทราบว่าหากคุณกำลังคัดลอกไดเรกทอรีทั้งหมดไม่จำเป็นต้องใช้ข้างต้น ตัวอย่างเช่นหากต้องการคัดลอกไดเรกทอรี~/foo
ไปยังโฮสต์ระยะไกลคุณสามารถใช้การ-r
ตั้งค่าสถานะ (เรียกซ้ำ):
scp ~/foo/ user@host:~/
ที่จะสร้างไดเรกทอรีเป้าหมาย~/foo
บนโฮสต์ระยะไกล อย่างไรก็ตามไม่สามารถสร้างไดเรกทอรีหลักได้ scp ~/foo user@host:~/bar/foo
จะล้มเหลวเว้นแต่ว่ามีไดเรกทอรีเป้าหมายbar
อยู่ ไม่ว่าในกรณีใดการ-r
ตั้งค่าสถานะจะไม่ช่วยสร้างไดเรกทอรีเป้าหมายหากคุณคัดลอกแต่ละไฟล์
ใช่คุณสามารถ. ตามหน้า man ของ scp:
SCP
.....
-r ซ้ำไดเรกทอรีทั้งหมด โปรดทราบว่า scp ติดตามลิงค์ syma bolic ที่พบในการแวะผ่านต้นไม้
....
scp -r foo/ u@h:~/bar
จะสร้างbar/foo
หากรีโมทbar/
มีอยู่ แต่จะล้มเหลวหากไม่มี
foo
/bar
แน่นอนว่ามีการเปลี่ยนชื่อซึ่งอาจไม่ใช่สิ่งที่ OP ต้องการ หากสิ่งที่คุณต้องการคือโครงสร้างต้นไม้ใหม่ที่สร้างขึ้นในเครื่องปลายทางแล้วscp
จะไม่ทำงานหากสิ่งที่คุณต้องการคือการทำซ้ำโครงสร้างต้นไม้จากสาขาที่แน่นอนในต้นไม้แล้วโครงสร้างนั้นจะถูกสร้างขึ้น
scp -r file host:~/bar/
bar/
ฉันใช้ฟังก์ชั่นต่อไปนี้ก่อนถ่ายโอนสbtrfs
แนปชอตผ่านssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
เพียงเรียกใช้ฟังก์ชันในสคริปต์ด้วย:
check_remote_dir /my/remote/path
คุณสามารถโยงคำสั่งด้วยคำสั่ง mkdir จากนั้นอ้างอิงไปยังโฟลเดอร์ที่คุณสร้างขึ้น:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
เมื่อ จำกัด เฉพาะ scp หรือ sftp ที่ไม่มี ssh (โดย rssh) เป็นไปได้ที่จะสร้างไดเรกทอรีโดยการคัดลอกแผนผังไดเรกทอรีว่างด้วย rsync แล้วคัดลอกไฟล์
นั่นคือวิธีที่ฉันวางกุญแจสาธารณะ ssh ไปยังรีโมทโฮสต์เมื่อ ssh-copy-id ไม่ทำงานและไม่มีไดเรกทอรี. ssh อยู่:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
เป็นไปได้ที่จะรวมคำสั่งนี้เป็นหนึ่ง rsync เพิ่มอีกหนึ่งรวมถึงตัวกรองอยู่ตรงกลางถ้าชื่อไฟล์เป้าหมายเหมือนกัน