Können Dateien mit in der Befehlszeile festgelegten Berechtigungen erstellt werden?

37

mkdir -m <mode> <dir>Bietet beim Erstellen von Verzeichnissen die Möglichkeit, ein oder mehrere Verzeichnisse mit den angegebenen Modi / Berechtigungen (atomar) zu erstellen.

Gibt es eine Entsprechung zum Erstellen von Dateien in der Befehlszeile?

Etwas Ähnliches wie:

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

Wird hier die Option "Mein" touchgefolgt von " chmodMein" verwendet?


Edit: Nachdem ich den Vorschlag von teppic ausprobiert hatte, durchlief installich ihn, um stracezu sehen, wie nah es an atomarem war. Die Antwort ist nicht sehr:

$ 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
...

Trotzdem handelt es sich um einen einzelnen Shell-Befehl, den ich vorher nicht kannte.

quornisch
quelle

Antworten:

47

Sie können den installBefehl (Teil von GNU coreutils) mit einer Dummy-Datei verwenden, z

install -b -m 755 /dev/null newfile

Die -bOption sichert, newfilewenn sie bereits vorhanden ist. Mit diesem Befehl können Sie auch den Eigentümer festlegen.

teppisch
quelle
4
+1 für die Vorstellung voninstall
quornian
Es ist ein nützlicher kleiner Befehl. Wie der Name schon sagt, wurde es speziell für die Installation von Software entwickelt, die aus dem Quellcode kompiliert wurde, damit Sie nicht ständig chmod, chown usw. verwenden müssen.
Teppic
Wenn es nur Standard wäre! OK, / proc / self / fd / 0 wird für meinen Zweck tun.
Proski
Beachten Sie, dass der Modus 755 die Standardberechtigungen für Dateien sind, die mit erstellt wurden install, und daher -m 755nicht benötigt werden.
Kusalananda
@ Kusalananda Es ist offensichtlich nur ein Beispiel, wie man einen Modus einstellt, da dies die Frage war und nicht, wie man
755
22

touchErstellt die Datei immer, wenn sie nicht vorhanden ist, folgt immer symbolischen Verknüpfungen und macht die Datei immer nicht ausführbar. Sie können die Lese- und Schreibbits über die umask festlegen .

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

Die "sichere" Erstellung atomarer Dateien (insbesondere mit O_NOFOLLOW) ist mit herkömmlichen Shell-Tools nicht möglich. Sie können sysopenin Perl verwenden. Wenn Sie das BSD-inspirierte mktempDienstprogramm haben, erstellt es eine Datei atomar mit O_NOFOLLOW; Sie müssen chmoddanach anrufen, wenn der Standardmodus von 600 nicht der richtige ist.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich war gerade dabei, eine detailliertere Erklärung zu verfassen, aber der Wikipedia-Artikel deckt alles gut ab.
Jordanien
Wenn touchich nur die Möglichkeit hätte, ausführbare Dateien zu erstellen, dann bin ich genau danach. Dann umaskkönnten die Details zugeschnitten werden. Leider gibt es keine Möglichkeit mit umaskund touchausführbare Dateien zu erstellen.
Quornian
@quornian Sie können eine nicht leere Datei ohnehin nicht atomar erstellen. Was bringt es, eine leere ausführbare Datei atomar zu erstellen? Verwenden Sie touchgefolgt von chmod +x.
Gilles 'SO- hör auf böse zu sein'
4
Sie können nicht leere, ausführbare Dateien atomar mit ... ln oder mv erstellen. Sie können die Datei immer mit dem richtigen Inhalt und den richtigen Berechtigungen in einem mit umask 077 erstellten Verzeichnis erstellen und anschließend verschieben oder in dieses Verzeichnis verschieben.
Stéphane Chazelas
-1

Ich habe ein Bash-Skript in meinem Home-Verzeichnis, /home/anthony/touchmod.shdas Folgendes enthält:

#!/bin/bash

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

Wenn ich also readme.txtmit 644 Berechtigungen erstellen muss, kann ich Folgendes eingeben:

~/touchmod.sh 644 readme.txt
TeamugDotNet
quelle
3
Sie haben die Frage wahrscheinlich nicht verstanden. Genau das versucht der Fragesteller zu vermeiden.
ceving