สามารถสร้างไฟล์โดยกำหนดสิทธิ์ในบรรทัดคำสั่งได้หรือไม่


37

เมื่อสร้างไดเรกทอรีmkdir -m <mode> <dir>ให้สำหรับการสร้างหนึ่งหรือหลายไดเรกทอรีด้วยชุดโหมด / การอนุญาตที่กำหนด (ตามปกติ)

มีการสร้างไฟล์ที่เทียบเท่าในบรรทัดคำสั่งหรือไม่

คล้ายกับ:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);

ใช้touchตามด้วยchmodตัวเลือกเดียวของฉันที่นี่?


แก้ไข:หลังจากลองใช้คำแนะนำของ teppic เพื่อใช้installฉันก็วิ่งผ่านstraceเพื่อดูว่ามันใกล้กับอะตอมมากแค่ไหน คำตอบคือไม่มาก:

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...

ถึงกระนั้นมันเป็นคำสั่งเชลล์เดี่ยวและเป็นคำสั่งเดียวที่ฉันไม่เคยรู้จัก

คำตอบ:


47

คุณสามารถใช้installคำสั่ง (ส่วนหนึ่งของ coreutils GNU) กับไฟล์จำลองเช่น

install -b -m 755 /dev/null newfile

-bตัวเลือกสำรองnewfileถ้ามีอยู่แล้ว คุณสามารถใช้คำสั่งนี้เพื่อตั้งเจ้าของได้เช่นกัน


4
+1 สำหรับแนะนำฉันให้รู้จักกับinstall
quornian

มันเป็นคำสั่งเล็ก ๆ ที่มีประโยชน์ ตามชื่อของมันแนะนำว่ามันถูกออกแบบมาสำหรับการติดตั้งซอฟต์แวร์ที่คอมไพล์จากซอร์สโค้ดเพื่อประหยัดไม่ต้องใช้ chmod, chown และอื่น ๆ ตลอดเวลา
teppic

ถ้าเพียงใช้ stdin! ตกลง / proc / self / fd / 0 จะทำเพื่อจุดประสงค์ของฉัน
proski

โปรดทราบว่าโหมด 755 เป็นสิทธิ์เริ่มต้นของไฟล์ที่สร้างด้วยinstallดังนั้นจึง-m 755ไม่จำเป็น
Kusalananda

22

touchสร้างไฟล์ทุกครั้งหากไม่มีอยู่ตามลิงค์สัญลักษณ์เสมอและทำให้ไฟล์ไม่สามารถเรียกใช้งานได้ คุณสามารถตัดสินใจได้อ่านและเขียนบิตผ่านumask

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

การสร้างไฟล์ปรมาณู“ ปลอดภัย” (โดยเฉพาะพร้อมO_NOFOLLOW) ไม่สามารถทำได้ด้วยเครื่องมือเชลล์แบบดั้งเดิม คุณสามารถใช้sysopenใน Perl หากคุณมีmktempยูทิลิตี้ที่ได้รับแรงบันดาลใจจาก BSD มันจะสร้างไฟล์แบบอะตอมมิกด้วยO_NOFOLLOW; คุณจะต้องโทรchmodหลังจากนั้นหากโหมดเริ่มต้นที่ 600 ไม่ใช่โหมดที่ถูกต้อง


ฉันกำลังเขียนคำอธิบายเพิ่มเติมโดยละเอียด แต่บทความวิกิพีเดียครอบคลุมทุกอย่างดี
จอร์แดน

ถ้าtouchมีเพียงตัวเลือกในการสร้างไฟล์ที่เรียกใช้งานได้นั่นเป็นสิ่งที่ฉันต้องการจริงๆ จากนั้นumaskสามารถนำไปปรับแต่งรายละเอียด น่าเศร้าที่มีวิธีการที่ไม่มีumaskและtouchเพื่อสร้าง executables
quornian

@quornian คุณไม่สามารถสร้างไฟล์ที่ไม่ว่างได้ตามปกติ จุดประสงค์ของการสร้างไฟล์เรียกทำงานที่ว่างเปล่าแบบอะตอมคืออะไร การใช้งานตามมาด้วยtouch chmod +x
Gilles 'หยุดความชั่วร้าย'

4
คุณสามารถสร้างไฟล์เรียกทำงานแบบไม่ว่างเปล่าโดยใช้อะตอมมิกด้วย ... ln หรือ mv คุณสามารถสร้างไฟล์ที่มีเนื้อหาและสิทธิ์ที่ถูกต้องในไดเรกทอรีที่สร้างด้วย umask 077 และย้ายไฟล์หรือหลังจากนั้น
Stéphane Chazelas

-1

ฉันมีสคริปต์ทุบตีในไดเรกทอรีบ้านของฉัน/home/anthony/touchmod.shที่มี:

#!/bin/bash

touch "$2"
chmod "$1" "$2"

ดังนั้นหากฉันต้องการสร้างreadme.txtด้วยสิทธิ์ 644 ฉันสามารถพิมพ์:

~/touchmod.sh 644 readme.txt

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