ฉันกำลังอัปโหลดไฟล์ไปยังบัญชีเชลล์โดยใช้ scp เนื่องจากฉันต้องการการอนุญาตที่แตกต่างกันบนเซิร์ฟเวอร์มากกว่าบนคอมพิวเตอร์ของฉันฉันต้องการมีวิธีในการเปลี่ยนแปลงการอนุญาตอย่างง่ายดายเมื่ออัปโหลดโดยไม่จำเป็นต้องใช้ ssh กับบัญชีและเปลี่ยนแปลงด้วยตนเอง
ฉันกำลังอัปโหลดไฟล์ไปยังบัญชีเชลล์โดยใช้ scp เนื่องจากฉันต้องการการอนุญาตที่แตกต่างกันบนเซิร์ฟเวอร์มากกว่าบนคอมพิวเตอร์ของฉันฉันต้องการมีวิธีในการเปลี่ยนแปลงการอนุญาตอย่างง่ายดายเมื่ออัปโหลดโดยไม่จำเป็นต้องใช้ ssh กับบัญชีและเปลี่ยนแปลงด้วยตนเอง
คำตอบ:
หากคุณกำลังคัดลอกจากเครื่อง windows คุณสามารถใช้WinSCPเพื่อคัดลอกและมีตัวเลือกในการตั้งค่าการอนุญาตสำหรับไฟล์ที่คัดลอกหลังจากการอัปโหลด
ถ้าไม่ฉันคิดว่าทางเลือกเดียวของคุณคือเรียกใช้ chmod บนเซิร์ฟเวอร์หลังจากอัพโหลดซึ่งคุณสามารถทำได้จากระยะไกลด้วยคำสั่ง ssh:
scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
โซลูชันการทำงานที่ฉันต้องการใช้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ซึ่งอาจเพิ่มมูลค่าเช่นความสามารถในการรักษาเจ้าของกลุ่ม ฯลฯ
--perms
เช่นกัน explainshell.com/...
ฉันทำการทดลองด้วย scp สำหรับไฟล์ใหม่ที่อัปโหลดไปยังเซิร์ฟเวอร์เป้าหมายไฟล์นั้นมีสิทธิ์แบบเดียวกับบนเซิร์ฟเวอร์ต้นทาง หากไฟล์ที่มีอยู่ถูกเขียนทับบนเซิร์ฟเวอร์เป้าหมายการอนุญาตสำหรับไฟล์เหล่านั้นจะไม่เปลี่ยนแปลง
ฉันได้ทำการทดลองกับ CentOS 4.6 แล้ว
คุณสามารถทำได้โดยใช้ 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 ระยะไกลมีการเปลี่ยนแปลงสิทธิ์ในด้านระยะไกล
umask
เดียวกับสิทธิ์ย่อยเช่นสำหรับไฟล์ภายในเครื่องที่700
คุณไม่สามารถรับไฟล์ด้วย755
ในเซิร์ฟเวอร์ปลายทางหรือฉันผิด
--no-same-permissions
การtar
ใช้งานครั้งที่สองหากผู้ใช้ปลายทางเป็นผู้ใช้ root ให้ดูที่superuser.com/a/383801/89031
umask
ค่าไฟล์ทั้งหมดตามที่เขียนไปยังเซิร์ฟเวอร์ระยะไกล ไม่มีการควบคุมส่วนบุคคลสำหรับไฟล์ที่แตกต่างกัน ฉันมักจะใช้สิ่งนี้เนื่องจากฉันต้องการตัดสิทธิ์ที่ผ่อนคลายซึ่งตกลงบนแล็ปท็อปของฉันเมื่อคัดลอกไปยังการปรับใช้ระยะไกล
--no-same-permissions
ถูกต้องเช่นกันตามtar
man page ของ ฉันเปลี่ยนคำแนะนำในตัวอย่างแล้วจึงไม่มีความสับสน
ฉันเขียนสคริปต์เล็กน้อยสำหรับงานใน 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)
ฉันขอแนะนำให้ตั้งค่าบิตเหนียวบนโฟลเดอร์เพื่อให้ไฟล์ที่คุณอัปโหลดภายใต้โฟลเดอร์นั้นได้รับอนุญาตโดยอัตโนมัติ
chmod 1644 dir
"1" ที่ใช้ด้านบนตั้งค่าบิตเหนียว
ดังนั้นคุณจะต้องอัปโหลดหนึ่งรายการเท่านั้นและไม่จำเป็นต้องเรียกใช้คำสั่งอื่นในภายหลัง
สมมติว่าคุณกำลังอัปโหลดไปยังชุดข้อมูล UNIX ฉันคิดว่าการอนุญาตควรทำตามการตั้งค่า UMASK ของคุณ ฉันไม่จำส่วนบนสุดของหัวที่ dot-files ประมวลผลให้กับ SCP แต่ถ้าคุณตั้งค่า UMASK ของคุณในไฟล์ที่คุณสร้างขึ้นจะมีการกำหนดสิทธิ์ตามมัน มันอาจขึ้นอยู่กับว่าคุณใช้เชลล์อะไรในระบบรีโมต
ไม่ว่าคุณจะทำอะไรอย่าใช้ตัวเลือก -p เพราะมันจะตรงข้ามกับสิ่งที่คุณต้องการ