Dosyalar komut satırında ayarlanan izinlerle oluşturulabilir mi?


37

Dizinleri mkdir -m <mode> <dir>oluştururken, verilen mod / izinler kümesiyle (atomik olarak) bir veya daha fazla dizin oluşturulmasını sağlar.

Komut satırında dosya oluşturmak için bir eşdeğer var mı?

Benzer bir şey:

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

touchBunu kullanmak chmodbenim için tek seçeneğim mi?


Düzenleme: kullanımına teppic önerisini dışarı denedikten sonra install, bunu aktı stracene kadar yakın atomik görmek için. Cevap çok değil:

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

Yine de, tek bir kabuk komutu ve daha önce bilmediğim bir komut.

Yanıtlar:


47

Sen kullanabilirsiniz installbir kukla dosyası, mesela ile komutu (GNU coreutils parçası)

install -b -m 755 /dev/null newfile

-bSeçenek yedekler newfilezaten varsa. Sahibini ayarlamak için de bu komutu kullanabilirsiniz.


4
Beni tanıtmak için +1install
quornian

Bu yararlı bir küçük komut. Adından da anlaşılacağı gibi, her zaman chmod, chown vb. Kullanmak zorunda kalmamak için kaynak kodundan derlenmiş bir yazılım yüklemek için tasarlanmıştır.
Teppic

Keşke o stdin aldı! Tamam, / proc / self / fd / 0 amacım için yapacak.
proski

Mod 755 ile oluşturulan dosyaların varsayılan izinleri olduğunu Not installyüzden -m 755gerekli değildir.
Kusalananda

22

touchher zaman mevcut değilse dosyayı oluşturur, her zaman sembolik bağları izler ve dosyayı her zaman çalıştırılamaz hale getirir. Umask yoluyla okuma ve yazma bitlerine karar verebilirsiniz .

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

O_NOFOLLOWGeleneksel kabuk araçlarıyla “güvenli” atomik dosya oluşturma (özellikle ile ) mümkün değildir. sysopenPerl'de kullanabilirsiniz . BSD'den esinlenen mktempyardımcı programınız varsa, atomik olarak O_NOFOLLOW; chmod600 varsayılan modu doğru değilse, daha sonra aramanız gerekir .


Daha ayrıntılı bir açıklama yazma sürecindeydim, ancak wikipedia makaleleri her şeyin yolunda gitmesine neden oluyor.
jordanm

Yalnızca touchçalıştırılabilir dosyalar oluşturma seçeneğine sahip olsaydım, gerçekten peşimde olan budur. Daha sonra umaskayrıntıları uyarlamak için kullanılabilir. Maalesef çalıştırılabilir dosyalar oluşturmanın umaskve bunun yolu yoktur touch.
Qornian

@quornian Yine de atomik olarak boş olmayan bir dosya oluşturamazsınız. Atomik olarak boş bir çalıştırılabilir dosya oluşturmanın amacı nedir? Kullanın touchardından chmod +x.
Gilles 'SO- kötülük' dur

4
Boş olmayan, çalıştırılabilir dosyaları atomik olarak ... ln veya mv ile oluşturabilirsiniz. Her zaman doğru içerik ve izinlere sahip dosyayı umask 077 ile oluşturulan bir dizinde oluşturabilir ve sonra taşıyabilir ya da kaldırabilirsiniz.
Stéphane Chazelas

-1

Giriş dizinimde aşağıdakileri /home/anthony/touchmod.shiçeren bir bash betiği var :

#!/bin/bash

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

Öyleyse readme.txt644 izin ile oluşturmam gerekiyorsa şunu yazabilirim:

~/touchmod.sh 644 readme.txt

3
Muhtemelen soruyu anlamadın. Bu, tam olarak sorgulayıcının kaçınmaya çalıştığı şeydir.
ceving
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.