Bisakah file dibuat dengan izin yang ditetapkan pada baris perintah?

37

Saat membuat direktori, mkdir -m <mode> <dir>sediakan untuk membuat satu atau lebih direktori dengan mode / izin yang ditetapkan (secara atomis).

Apakah ada yang setara untuk membuat file, di baris perintah?

Sesuatu yang mirip dengan:

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

Apakah menggunakan touchdiikuti oleh satu chmod-satunya pilihan saya di sini?


Sunting: Setelah mencoba saran Teppic untuk digunakan install, saya menjalankannya straceuntuk melihat seberapa dekat dengan atom itu. Jawabannya adalah, tidak terlalu:

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

Namun, ini adalah perintah shell tunggal dan yang saya tidak tahu sebelumnya.

quornian
sumber

Jawaban:

47

Anda bisa menggunakan installperintah (bagian dari GNU coreutils) dengan file dummy, mis

install -b -m 755 /dev/null newfile

The -bpilihan punggung newfilejika sudah ada. Anda dapat menggunakan perintah ini untuk mengatur pemilik juga.

hangat
sumber
4
+1 untuk memperkenalkan saya keinstall
quornian
Ini adalah perintah kecil yang berguna. Seperti namanya itu benar-benar dirancang untuk menginstal perangkat lunak yang dikompilasi dari kode sumber, untuk menghemat harus menggunakan chmod, chown, dan sebagainya sepanjang waktu.
teppic
Kalau saja butuh stdin! OK, / proc / self / fd / 0 akan lakukan untuk tujuan saya.
proski
Perhatikan bahwa mode 755 adalah izin default dari file yang dibuat install, jadi -m 755tidak diperlukan.
Kusalananda
@ Kusalananda Ini jelas hanya sebuah contoh bagaimana mengatur mode, karena itu pertanyaannya, bukan bagaimana mengatur 755.
teppic
22

touchselalu membuat file jika tidak ada, selalu mengikuti tautan simbolik, dan selalu membuat file tidak dapat dieksekusi. Anda dapat memutuskan bit baca dan tulis melalui umask .

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

Pembuatan file atom "Aman" (khususnya, dengan O_NOFOLLOW) tidak dimungkinkan dengan alat shell tradisional. Anda bisa menggunakannya sysopendalam perl. Jika Anda memiliki mktemputilitas yang terinspirasi BSD , itu membuat file secara atomis dengan O_NOFOLLOW; Anda harus menelepon chmodsetelah itu jika mode standar 600 bukan yang benar.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya sedang dalam proses menulis penjelasan yang lebih rinci, tetapi artikel wikipedia mencakup semuanya dengan baik.
jordanm
Jika hanya touchmemiliki pilihan untuk membuat file yang dapat dieksekusi, itu yang saya cari. Kemudian umaskbisa digunakan untuk menyesuaikan detail. Sayangnya tidak ada cara dengan umaskdan touchuntuk membuat executables.
quornian
@quornian Anda tidak dapat membuat file yang tidak kosong secara atomis. Apa gunanya membuat file executable kosong secara atom? Gunakan touchdiikuti oleh chmod +x.
Gilles 'SO- stop being evil'
4
Anda dapat membuat file non-kosong, file yang dapat dieksekusi secara atomis dengan ... ln atau mv. Anda selalu dapat membuat file dengan konten yang tepat dan izin dalam direktori yang dibuat dengan umask 077 dan memindahkannya atau kemudian setelah itu.
Stéphane Chazelas
-1

Saya memiliki skrip bash di direktori home saya yang /home/anthony/touchmod.shberisi:

#!/bin/bash

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

Jadi jika saya harus membuat readme.txtdengan 644 izin saya bisa mengetik:

~/touchmod.sh 644 readme.txt
TeamugDotNet
sumber
3
Anda mungkin tidak mengerti pertanyaan itu. Inilah yang ingin dihindari oleh si penanya.
ceving