क्या कमांड लाइन पर सेट की गई अनुमतियों के साथ फाइलें बनाई जा सकती हैं?


37

डायरेक्टरी बनाते समय, mkdir -m <mode> <dir>दिए गए मोड / अनुमतियों (एटोमिकली) के साथ एक या एक से अधिक डायरेक्ट्री बनाने का प्रावधान करता है।

क्या कमांड लाइन पर फाइलें बनाने के लिए एक समान है?

कुछ समान:

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

क्या यहाँ मेरे एकमात्र विकल्प का उपयोग touchकिया जा रहा है chmod?


संपादित करें: उपयोग करने के लिए टेपेपिक के सुझाव की कोशिश करने के बाद 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डमी फ़ाइल के साथ कमांड (GNU कोरुटिल्स का हिस्सा) का उपयोग कर सकते हैं , जैसे

install -b -m 755 /dev/null newfile

-bविकल्प बैक अप ले लेता newfileहै, तो यह पहले से ही मौजूद है। आप इस आदेश का उपयोग स्वामी को भी सेट करने के लिए कर सकते हैं।


4
+1 करने के लिए मुझे शुरू करने के लिएinstall
quornian

यह एक उपयोगी छोटी आज्ञा है। जैसा कि इसके नाम से पता चलता है कि यह वास्तव में स्रोत कोड से संकलित सॉफ़्टवेयर को स्थापित करने के लिए डिज़ाइन किया गया है, ताकि चामोड, चाउन का उपयोग किया जा सके और हर समय आगे बढ़ सके।
टेकपिक

यदि केवल यह स्टड लिया! ठीक है, / proc / self / fd / 0 मेरे उद्देश्य के लिए करेगा।
५२ पर प्रोस्की

ध्यान दें कि मोड 755 के साथ बनाई गई फ़ाइलों की डिफ़ॉल्ट अनुमति है install, इसलिए -m 755इसकी आवश्यकता नहीं है।
Kusalananda

@ कुसलानंद जाहिर तौर पर यह एक उदाहरण है कि एक मोड कैसे सेट किया जाए, क्योंकि यह सवाल था, न कि 755 कैसे सेट करें।
टेपेसिक

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पर्ल में उपयोग कर सकते हैं । यदि आपके पास बीएसडी-प्रेरित mktempउपयोगिता है, तो यह एक फाइल को परमाणु के साथ बनाता है O_NOFOLLOW; chmodयदि बाद में 600 का डिफ़ॉल्ट मोड सही नहीं है तो आपको बाद में कॉल करना होगा।


मैं और अधिक विस्तृत विवरण लिखने की प्रक्रिया में था, लेकिन विकिपीडिया के लेखों में सब कुछ ठीक है।
जोर्डनम

यदि केवल touchनिष्पादन योग्य फ़ाइलों को बनाने का विकल्प था, तो वास्तव में मैं इसके बाद क्या कर रहा हूं। तब umaskविवरण दर्जी के लिए इस्तेमाल किया जा सकता है। अफसोस की बात है कि निष्पादनयोग्य बनाने umaskऔर touchबनाने का कोई तरीका नहीं है ।
quornian

@quornian आप वैसे भी गैर-रिक्त फ़ाइल नहीं बना सकते। परमाणु रूप से खाली निष्पादन योग्य फ़ाइल बनाने का क्या मतलब है? touchइसके बाद उपयोग करें chmod +x
गिल्स एसओ- बुराई को रोकना '

4
आप गैर-रिक्त, निष्पादन योग्य फ़ाइलों को परमाणु ... ln या mv के साथ बना सकते हैं। आप हमेशा ओम्स्क 077 के साथ बनाई गई निर्देशिका में सही सामग्री और अनुमतियों के साथ फ़ाइल बना सकते हैं और इसे स्थानांतरित कर सकते हैं या बाद में इसे लेन कर सकते हैं।
स्टीफन चेज़लस

-1

मेरी होम निर्देशिका में एक बैश स्क्रिप्ट है /home/anthony/touchmod.sh:

#!/bin/bash

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

इसलिए अगर मुझे readme.txt644 अनुमति के साथ बनाने की आवश्यकता है, तो मैं टाइप कर सकता हूं:

~/touchmod.sh 644 readme.txt

3
आप संभवतः प्रश्न को नहीं समझ पाए हैं। यह वही है जो प्रश्नकर्ता से बचने की कोशिश करता है।
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.