Czy można tworzyć pliki z uprawnieniami ustawionymi w wierszu poleceń?

37

Podczas tworzenia katalogów mkdir -m <mode> <dir>przewiduje utworzenie jednego lub więcej katalogów z danym ustawionym trybem / uprawnieniami (atomowo).

Czy w wierszu polecenia istnieje odpowiednik tworzenia plików?

Coś podobnego do:

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

Czy użycie touchnastępuje po chmodmojej jedynej opcji tutaj?


Edycja: Po wypróbowaniu sugestii teppica, przejrzałem installją, straceaby zobaczyć, jak blisko jest atomu. Odpowiedź brzmi: niezbyt:

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

Mimo to jest to jedno polecenie powłoki, którego wcześniej nie znałem.

Kwornian
źródło

Odpowiedzi:

47

Możesz użyć installpolecenia (część jądra GNU) z plikiem zastępczym, np

install -b -m 755 /dev/null newfile

-bOpcja cofa się newfile, jeżeli już istnieje. Możesz użyć tego polecenia, aby ustawić również właściciela.

teppic
źródło
4
+1 za wprowadzenie mnie doinstall
kwornian
To przydatne, małe polecenie. Jak sama nazwa wskazuje, jest on naprawdę przeznaczony do instalowania oprogramowania skompilowanego z kodu źródłowego, aby oszczędzać konieczności korzystania z chmod, chown i tak dalej.
teppic
Gdyby tylko zajęło standardowe! OK, / proc / self / fd / 0 zrobi dla mojego celu.
proski
Należy pamiętać, że tryb 755 jest domyślnymi uprawnieniami do plików utworzonych przy użyciu install, więc -m 755nie jest potrzebny.
Kusalananda
@Kusalananda To oczywiście tylko przykład ustawiania trybu, ponieważ takie było pytanie, a nie jak ustawić 755.
teppic
22

touchzawsze tworzy plik, jeśli nie istnieje, zawsze podąża za dowiązaniami symbolicznymi i zawsze powoduje, że plik nie jest wykonywalny. Możesz decydować o czytaniu i zapisywaniu bitów przez umask .

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

„Bezpieczne” tworzenie plików atomowych (w szczególności za pomocą O_NOFOLLOW) nie jest możliwe w przypadku tradycyjnych narzędzi powłoki. Możesz używać sysopenw perlu. Jeśli masz mktempnarzędzie inspirowane BSD , tworzy on plik atomowo O_NOFOLLOW; będziesz musiał zadzwonić chmodpóźniej, jeśli domyślny tryb 600 nie jest odpowiedni.

Gilles „SO- przestań być zły”
źródło
Byłem w trakcie pisania bardziej szczegółowych wyjaśnień, ale artykuły w Wikipedii obejmują wszystko w porządku.
jordanm
Gdybym tylko touchmiał opcję tworzenia plików wykonywalnych, właśnie o to mi chodzi. Następnie umaskmożna go użyć do dostosowania szczegółów. Niestety nie ma sposobu, z umaski touchdo tworzenia plików wykonywalnych.
kwornian
@quornian I tak nie można stworzyć niepustego pliku atomowo. Po co tworzyć atomowo pusty plik wykonywalny? Użyj, toucha następnie chmod +x.
Gilles „SO- przestań być zły”
4
Możesz tworzyć niepuste pliki wykonywalne atomowo za pomocą ... ln lub mv. Zawsze możesz utworzyć plik z odpowiednią zawartością i uprawnieniami w katalogu utworzonym za pomocą umask 077 i przenieść go lub później.
Stéphane Chazelas,
-1

Mam skrypt bash w moim katalogu domowym /home/anthony/touchmod.shzawierający:

#!/bin/bash

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

Więc jeśli muszę utworzyć readme.txtz uprawnieniami 644, mogę wpisać:

~/touchmod.sh 644 readme.txt
TeamugDotNet
źródło
3
Prawdopodobnie nie zrozumiałeś pytania. Właśnie tego pytający próbuje uniknąć.
ceving