¿Se pueden crear archivos con permisos establecidos en la línea de comando?

37

Al crear directorios, mkdir -m <mode> <dir>permite crear uno o más directorios con el modo / permisos establecidos (atómicamente).

¿Hay un equivalente para crear archivos, en la línea de comando?

Algo parecido a:

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

¿El uso touchseguido de chmodmi única opción aquí?


Editar: Después de probar la sugerencia de Teppic a su uso install, lo corrió a través stracede ver lo cerca que atómica que era. La respuesta es, no muy:

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

Aún así, es un comando de shell único y uno que no conocía antes.

quornian
fuente

Respuestas:

47

Puede usar el installcomando (parte de los coreutils de GNU) con un archivo ficticio, p. Ej.

install -b -m 755 /dev/null newfile

La -bopción se respalda newfilesi ya existe. También puede usar este comando para establecer el propietario.

teppic
fuente
44
+1 por presentarme ainstall
quornian
Es un pequeño comando útil. Como su nombre indica, está realmente diseñado para instalar software compilado a partir del código fuente, para evitar tener que usar chmod, chown, etc. todo el tiempo.
teppic
¡Ojalá tomara stdin! OK, / proc / self / fd / 0 servirá para mi propósito.
proski
Tenga en cuenta que el modo 755 son los permisos predeterminados de los archivos creados con install, por -m 755lo que no es necesario.
Kusalananda
@Kusalananda Obviamente es sólo un ejemplo de cómo configurar un modo, ya que esa era la pregunta, no cómo configurar 755.
Teppic
22

touchsiempre crea el archivo si no existe, siempre sigue enlaces simbólicos y siempre hace que el archivo no sea ejecutable. Puede decidir los bits de lectura y escritura a través de la umask .

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

La creación de archivos atómicos "seguros" (en particular, con O_NOFOLLOW) no es posible con las herramientas de shell tradicionales. Puedes usar sysopenen perl. Si tiene la mktemputilidad inspirada en BSD , crea un archivo atómicamente con O_NOFOLLOW; tendrá que llamar chmoddespués si el modo predeterminado de 600 no es el correcto.

Gilles 'SO- deja de ser malvado'
fuente
Estaba en el proceso de escribir una explicación más detallada, pero los artículos de wikipedia cubren todo muy bien.
jordanm
Si solo touchtuviera la opción de crear archivos ejecutables, eso es realmente lo que busco. Entonces umaskpodría usarse para adaptar los detalles. Lamentablemente no hay forma con umasky touchpara crear ejecutables.
Quornian
@quornian No puedes crear un archivo no vacío atómicamente de todos modos. ¿Cuál es el punto de crear un archivo ejecutable vacío atómicamente? Uso touchseguido de chmod +x.
Gilles 'SO- deja de ser malvado'
44
Puede crear archivos ejecutables no vacíos atómicamente con ... ln o mv. Siempre puede crear el archivo con el contenido y los permisos correctos en un directorio creado con umask 077 y luego moverlo o insertarlo.
Stéphane Chazelas
-1

Tengo un script bash en mi directorio de inicio que /home/anthony/touchmod.shcontiene:

#!/bin/bash

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

Entonces, si necesito crear readme.txtcon 644 permisos, puedo escribir:

~/touchmod.sh 644 readme.txt
TeamugDotNet
fuente
3
Probablemente no entendiste la pregunta. Esto es exactamente lo que el interrogador intenta evitar.
ceving