วิธีตั้งค่าการอนุญาตไฟล์เฉพาะเมื่อเปลี่ยนเส้นทางเอาต์พุต


12

นี่อาจเป็นสิ่งที่ซ้ำกัน แต่การค้นหาทั้งหมดของฉันมีคำถามเกี่ยวกับการอนุญาตที่ผิดพลาด

ฉันใช้คำสั่งใน bash shell ฉันต้องการเปลี่ยนเส้นทางเอาต์พุตเพื่อผนวกไปยังไฟล์ที่อาจไม่มีอยู่ในการรันครั้งแรก ฉันต้องการตั้งค่าโหมดการอนุญาตเฉพาะไฟล์หากการเปลี่ยนเส้นทางผลลัพธ์ต้องสร้างไฟล์นี้ มีวิธีทำเช่นนี้ด้วยคำสั่งเดียว?

ตัวอย่างเช่นฉันอาจลอง

foo >> /tmp/foo.log 0644

ที่0644มีสิทธิ์ที่ฉันต้องการfoo.logจะจบลงด้วย คำสั่งที่สุดที่ผมเคยทดลองกับในทุบตีจบลงด้วยการตีความเป็นอาร์กิวเมนต์เพิ่มเติมเพื่อ0644foo

ฉันรู้สึกว่านี่จะเป็นคำสั่งที่สองในchmodการอนุญาตก่อนหรือหลังการเขียนลงไป

ฉันใช้ GNU bash 4.2.25 และ Ubuntu 12.04 ถ้านั่นสร้างความแตกต่างได้ - เราต้องการคำตอบทั่วไป

คำตอบ:


5

ไม่มีวิธีที่จะทำในขณะที่วางเท่าที่ฉันรู้สคริปต์ง่าย ๆ อาจเป็นทางออกที่ดีที่สุด

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

ขอบคุณ Slowki นั่นเป็นลางสังหรณ์ของฉันเช่นกัน ฉันจะเปิดทิ้งไว้สักสองสามวันด้วยความหวังว่าจะดึงดูดผู้นำศาสนาให้มาสอนเรา
Patrick M

3
ปัญหาของวิธีนี้คือมันสร้างหน้าต่างเวลาสั้น ๆ เมื่อสิทธิ์ของไฟล์ผิด ฉันจะไม่ใช้มันหากเป้าหมายคือเพื่อปกป้องข้อมูลที่ละเอียดอ่อน
proski

1
คำตอบนี้ใช้ได้ผลเท่าที่ @proski ถูกต้องumaskคำตอบนั้นดีกว่าและควรยอมรับหนึ่งในนั้น
สกอตต์

15

ฉันรู้ว่ามันเป็นคำถามเก่า แต่ฉันต้องการเพิ่มสองเซ็นต์ของฉัน

ผมมีความคิดเดียวกันและมาพร้อมกับวิธีการแก้ปัญหาที่คล้ายกับBowlesCR ปัญหาเกี่ยวกับวิธีแก้ปัญหาของเขาคือคำสั่งของฉัน ( foo) จะไม่ทำงานหากฉันเปลี่ยน umask ก่อนที่จะเรียกใช้ดังนั้นนี่คือปัญหาของฉัน:

foo | ( umask 0033; cat >> /tmp/foo.log; )

ที่นี่umaskจะมีผลกับการเปลี่ยนเส้นทางไปยังfoo.logใน subshell เท่านั้น ทุกอย่างอื่นยังคงไม่ได้รับผลกระทบ

ค่อนข้างซับซ้อน แต่ก็ใช้งานได้


ดีมากและมีประสิทธิภาพ :) ไม่สามารถใช้กับการเปลี่ยนเส้นทาง stderr ที่ด้านบนของ stdout redir
Orsiris de Jong

5

หากไม่มีการเขียนสคริปต์ที่แท้จริงคุณสามารถเชื่อมโยงเล็กน้อย

touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log

คล้ายกับคำตอบของ Slowkiอย่างมีประสิทธิภาพแต่ย่อตัวเป็นหนึ่งซับ

สิ่งเดียวที่ฉันคิดได้คือการซ่อมแซมด้วย umask ดีที่สุดที่จะทำใน subshell ดังนั้นจึงไม่ก่อให้เกิดมลพิษต่อสภาพแวดล้อมปัจจุบัน:

(umask 0033 && foo >> /tmp/foo.log)

แม้ว่าจะมีปัญหาสองประการ

  1. Umask ไม่สามารถยกระดับสิทธิ์เหนือระดับที่ระบุในcreat()syscall (0666 ดูเหมือนจะเป็นสิ่งที่ Bash ใช้)
  2. สิ่งนี้จะไม่เปลี่ยนการอนุญาตในไฟล์ที่มีอยู่ (เพราะumaskใช้กับการสร้างไฟล์เท่านั้น)

ฉันยังใหม่พอที่จะ * ระวังว่า umask ยังคงเป็นเวทมนตร์สำหรับฉัน ขอบคุณสำหรับเคล็ดลับฉันจะแน่ใจว่าได้อ่านมัน
Patrick M

อืม ... ยังอนุญาตให้กระบวนการที่ไม่มีสิทธิพิเศษเปิดไฟล์และอ่านเนื้อหาในภายหลัง
Feuermurmel

(1) ขอแสดงความยินดีในการหาที่น่าสนใจcatการใช้งานของ (แม้ว่าจะไม่เป็นไปตามรูปแบบมาตรฐานของการใช้งานที่ไร้ประโยชน์  cat) (2) ฉันคิดว่าคุณตั้งใจจะบอกว่าค่าดีฟอลต์ของ bash เป็นโหมด  0666เมื่อสร้างไฟล์ดังนั้นฉันจึงแก้ไขคำตอบของคุณ (ดูที่นี้ ,  นี้   ... (ต่อ)
สกอตต์

(ต่อ) และ  สิ่งนี้ ) และคำถามที่กล่าวถึงโหมด 0644 โดยเฉพาะดังนั้นumaskค่าของ 22, 23 หรือ 32 ก็ใช้ได้เช่นกันในบริบทนี้ (คุณไม่จำเป็นต้องใช้ศูนย์นำหน้าเมื่อ โหมดและ  umaskค่าที่ระบุไว้เป็นตัวเลขจะถูกตีความเป็นเลขฐานแปดเสมอ)  22 เป็นเรื่องปกติมากกว่าปกติใช้
สกอตต์

@Feermurmel: อะไรนะ คำถามนั้นเรียกอย่างชัดเจนว่าโหมด 644 เราต้องสมมติว่า OP รู้ว่า 644 หมายถึงโลกที่สามารถอ่านได้และตั้งใจจะเปิดเผยข้อมูลของเขา
สกอตต์

1

เมื่อการเปลี่ยนเส้นทางตั้งค่าการอนุญาตที่ไม่ถูกต้องเช่น:

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

ผมเชื่อว่าคุณสามารถใช้สิ่งที่ต้องการให้ xynomorf และอยู่ที่ความกังวล stderr จาก Orsiris เดอยองที่มีการปรับเปลี่ยนเล็กน้อยเพื่อใช้ทดแทนกระบวนการทุบตี

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

โดยปกติใช้umask 0077เพื่อรับโหมด600 และห้ามไม่ให้ผู้ใช้รายอื่นเห็นเนื้อหา


0

หากคุณต้องการเปลี่ยนเส้นทางไปยังสคริปต์ซึ่งแตกต่างจากumaskการทดแทนกระบวนการและinstallคุณยังสามารถตั้งค่าบิตเรียกใช้งาน:

install -m 755 <(echo commands go here) newscript

<()วางเอาต์พุตลงในไฟล์ชั่วคราวดูที่การทดแทนกระบวนการ

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