เปลี่ยนสิทธิ์เมื่ออัปโหลดด้วย scp


44

ฉันกำลังอัปโหลดไฟล์ไปยังบัญชีเชลล์โดยใช้ scp เนื่องจากฉันต้องการการอนุญาตที่แตกต่างกันบนเซิร์ฟเวอร์มากกว่าบนคอมพิวเตอร์ของฉันฉันต้องการมีวิธีในการเปลี่ยนแปลงการอนุญาตอย่างง่ายดายเมื่ออัปโหลดโดยไม่จำเป็นต้องใช้ ssh กับบัญชีและเปลี่ยนแปลงด้วยตนเอง

คำตอบ:


29

หากคุณกำลังคัดลอกจากเครื่อง windows คุณสามารถใช้WinSCPเพื่อคัดลอกและมีตัวเลือกในการตั้งค่าการอนุญาตสำหรับไฟล์ที่คัดลอกหลังจากการอัปโหลด

ถ้าไม่ฉันคิดว่าทางเลือกเดียวของคุณคือเรียกใช้ chmod บนเซิร์ฟเวอร์หลังจากอัพโหลดซึ่งคุณสามารถทำได้จากระยะไกลด้วยคำสั่ง ssh:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file

ฉันก็คิดถึงเรื่องนั้นเช่นกันแล้วการอัปโหลดไดเรกทอรีล่ะ?
Florian Mayer

หืมฉันทำได้ chmod -R แล้ว ไม่ใช่ความคิดที่แย่ฉันเดา
Florian Mayer

1
ขวา. scp -r จากนั้น ssh chmod -R
zigdon

1
ฉันยังประสบความสำเร็จในการทำสิ่งเดียวกันกับ plink และ pscp (จากแพคเกจ
โป๊ว

22

โซลูชันการทำงานที่ฉันต้องการใช้rsyncแทน:

แทนที่:

scp /path/to/file server:/server/path/to/file

ด้วย:

rsync --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file

สิ่งนี้จะป้องกันไม่ให้คุณตรวจสอบสิทธิ์สองครั้ง นอกจากนี้ยังมีตัวเลือกอื่น ๆ อีกมากมายที่มีrsyncซึ่งอาจเพิ่มมูลค่าเช่นความสามารถในการรักษาเจ้าของกลุ่ม ฯลฯ


สิ่งนี้ไม่ทำงาน
soham

1
พบสาเหตุ คุณต้องใช้--permsเช่นกัน explainshell.com/...
Soham

5
คุณสามารถแสดงแบบเต็มคำสั่งที่ถูกต้องคำสั่งย่อย ไม่ว่าจะเป็นความคิดเห็นหรือโดยการแก้ไขคำตอบ
Mawg

6

ฉันทำการทดลองด้วย scp สำหรับไฟล์ใหม่ที่อัปโหลดไปยังเซิร์ฟเวอร์เป้าหมายไฟล์นั้นมีสิทธิ์แบบเดียวกับบนเซิร์ฟเวอร์ต้นทาง หากไฟล์ที่มีอยู่ถูกเขียนทับบนเซิร์ฟเวอร์เป้าหมายการอนุญาตสำหรับไฟล์เหล่านั้นจะไม่เปลี่ยนแปลง

ฉันได้ทำการทดลองกับ CentOS 4.6 แล้ว


3
นี่ควรเป็นความคิดเห็นแทนคำตอบ
Jaime Hablutzel

2
Agred (แต่มันช่วยได้จริงๆ ;-)
Mawg

นี่คือสิ่งที่ฉันพยายามจะทำในครั้งเดียวผ่านสคริปต์ Rsync ไม่ได้อยู่ในเซิร์ฟเวอร์ปลายทางเสมอไปและฉันอยากให้สคริปต์ที่ฉันให้ออกมานั้นไม่ใช้เสรีภาพด้วย apt / yum และอื่น ๆ เพื่อติดตั้ง rsync ดูเหมือนว่าฉันอาจต้องใช้วิธี scp + chmod หรือ rm + scp เพื่อให้แน่ใจว่าสิทธิ์ถูกต้อง : - /
zaTricky

5

คุณสามารถทำได้โดยใช้ tar, ssh, & umask ดังนี้:

บนโฮสต์ 1:

[saml@host1 testdir]$ pwd
/tmp/testdir

[saml@host1 testdir]$ ls -l
total 12
-rw-r--r--  1 saml saml 21 May 19 00:21 file1
-rw-r--r--  1 saml saml 48 May 19 00:21 file2
-rw-r--r--  1 saml saml 28 May 19 00:21 file3

[saml@host1 testdir]$ tar cvf - . | (ssh host2 "umask 0277; cd /tmp/testdir;tar xvf -")
./
./file1
./file2
./file3
./
./file1
./file2
./file3

บน host2:

[samr@host2 testdir]$ pwd
/tmp/testdir

[samr@host2 testdir]$ ls -l
total 12
-r-------- 1 samr web 21 May 19 00:21 file1
-r-------- 1 samr web 48 May 19 00:21 file2
-r-------- 1 samr web 28 May 19 00:21 file3

คุณสามารถวางสวิตช์ -v เพื่อ tar ซึ่งฉันได้รวมไว้ที่นี่เพียงเพื่อให้คุณสามารถดูไฟล์ที่ถูก tarred บน host1 และส่งผ่าน STDOUT (aka. -) จากนั้นทำการยกเลิกการ tarred บน host2

หมายเหตุ:ทำไมจึงใช้งานได้ พฤติกรรมเริ่มต้นของ Tar คือการคลายไฟล์โดยใช้ umask ของผู้ใช้ระยะไกล ในตัวอย่างข้างต้นฉันได้รวมumaskคำสั่งเพื่อกำหนดอย่างชัดเจนเป็นสิ่งที่แตกต่างซึ่งแสดงให้เห็นว่า tar ระยะไกลมีการเปลี่ยนแปลงสิทธิ์ในด้านระยะไกล


1
อย่างที่ฉันเห็นด้วยคำสั่งนี้คุณสามารถใช้สิทธิ์ที่น้อยลงในการถ่ายโอนไฟล์ได้เช่นumaskเดียวกับสิทธิ์ย่อยเช่นสำหรับไฟล์ภายในเครื่องที่700คุณไม่สามารถรับไฟล์ด้วย755ในเซิร์ฟเวอร์ปลายทางหรือฉันผิด
Jaime Hablutzel

1
นอกจากนี้คุณต้องการ--no-same-permissionsการtarใช้งานครั้งที่สองหากผู้ใช้ปลายทางเป็นผู้ใช้ root ให้ดูที่superuser.com/a/383801/89031
Jaime Hablutzel

@jaime - ถูกต้องนี่จะอนุญาตให้คุณตั้งumaskค่าไฟล์ทั้งหมดตามที่เขียนไปยังเซิร์ฟเวอร์ระยะไกล ไม่มีการควบคุมส่วนบุคคลสำหรับไฟล์ที่แตกต่างกัน ฉันมักจะใช้สิ่งนี้เนื่องจากฉันต้องการตัดสิทธิ์ที่ผ่อนคลายซึ่งตกลงบนแล็ปท็อปของฉันเมื่อคัดลอกไปยังการปรับใช้ระยะไกล
slm

@jaime - --no-same-permissionsถูกต้องเช่นกันตามtarman page ของ ฉันเปลี่ยนคำแนะนำในตัวอย่างแล้วจึงไม่มีความสับสน
slm

3

ฉันเขียนสคริปต์เล็กน้อยสำหรับงานใน Python คุณสามารถทำpython script.py -p o + r บางไฟล์บางไฟล์ / dir / on / the / server /

import subprocess
import sys
from optparse import OptionParser


DEFAULT_SERVER = 'your.server.com'

parser = OptionParser()

parser.add_option("-p", "--permissions", action="store", 
                     type="str", dest="perm", metavar="PERM",
                     help="chmod files to PERM", default=None)
parser.add_option("-s", "--server", action="store", 
                     type="str", dest="serv", metavar="SERVER",
                     help="scp to SERVER", default=DEFAULT_SERVER)

options, args = parser.parse_args()
files = args[:-1]
direct = args[-1]

proc = subprocess.Popen(['scp'] + files + ['%s:%s' % (options.serv, direct)],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.wait() != 0:
    print >>sys.stderr, "Uploading failed!"
    sys.exit(1)

if options.perm is not None:
    arg_dict = dict(dir=direct, perm=options.perm, files=' '.join(files))
    proc = subprocess.Popen(['ssh', options.serv, 'cd %(dir)s;'
                             'chmod -R %(perm)s %(files)s' % arg_dict],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

3
คุณคิดว่าจะโพสต์โค้ดของคุณที่Code Reviewหรือไม่ อาจมีคำแนะนำที่ดีสำหรับวิธีการปรับปรุง
tshepang

1
ว้าวฉันไม่เคยได้ยินเกี่ยวกับไซต์ SO ใหม่, ทบทวนรหัส, ty @Tshepang!
AnneTheAgile

2
@ AnneTheAgile มันไม่ใช่เรื่องใหม่ มันอายุมากกว่า 3 ปี :)
tshepang

1

ฉันขอแนะนำให้ตั้งค่าบิตเหนียวบนโฟลเดอร์เพื่อให้ไฟล์ที่คุณอัปโหลดภายใต้โฟลเดอร์นั้นได้รับอนุญาตโดยอัตโนมัติ

chmod 1644 dir

"1" ที่ใช้ด้านบนตั้งค่าบิตเหนียว

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


มีคนอธิบายได้ไหมว่ามันจะได้ผลอย่างไร
Mawg

0

สมมติว่าคุณกำลังอัปโหลดไปยังชุดข้อมูล UNIX ฉันคิดว่าการอนุญาตควรทำตามการตั้งค่า UMASK ของคุณ ฉันไม่จำส่วนบนสุดของหัวที่ dot-files ประมวลผลให้กับ SCP แต่ถ้าคุณตั้งค่า UMASK ของคุณในไฟล์ที่คุณสร้างขึ้นจะมีการกำหนดสิทธิ์ตามมัน มันอาจขึ้นอยู่กับว่าคุณใช้เชลล์อะไรในระบบรีโมต

ไม่ว่าคุณจะทำอะไรอย่าใช้ตัวเลือก -p เพราะมันจะตรงข้ามกับสิ่งที่คุณต้องการ


Nope -p ไม่ใช่สิ่งที่ฉันต้องการเพราะฉันต้องการการอนุญาตที่แตกต่างกันบนเซิร์ฟเวอร์ (ใช่มันเป็น UNIX) มากกว่าเครื่องของฉัน แน่นอนฉันสามารถ chmod พวกเขาใช้ -p แล้ว chmod พวกเขากลับมาแม้ว่าฉันจะต้องเก็บสิทธิ์แล้ว
Florian Mayer

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