Os arquivos podem ser criados com permissões definidas na linha de comando?

34

Ao criar diretórios, mkdir -m <mode> <dir> fornece a criação de um ou mais diretórios com o modo / permissões fornecido definido (atomicamente).

Existe um equivalente para criar arquivos, na linha de comando?

Algo parecido com:

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

Está usando touch seguido por uma chmod minha única opção aqui?

Editar: Depois de tentar a sugestão do teppic de usar install , passei por strace para ver o quão próximo do atômico estava. A resposta é não muito:

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

Ainda assim, é um único comando de shell e um que eu não conhecia antes.

    
por quornian 05.09.2012 / 03:05

3 respostas

45

Você pode usar o comando install (parte do GNU coreutils) com um arquivo fictício, por exemplo

$ install -b -m 755 /dev/null newfile

A opção -b faz o backup de 'newfile', se já existir. Você pode usar este comando para definir o proprietário também.

    
por 05.09.2012 / 03:37
21

touch sempre cria o arquivo se ele não existir, sempre segue os links simbólicos e sempre torna o arquivo não executável. Você pode decidir ler e escrever bits através da umask .

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

A criação de arquivos atômicos "seguros" (em particular, com O_NOFOLLOW ) não é possível com as ferramentas tradicionais do shell. Você pode usar sysopen em perl. Se você tiver o utilitário mktemp inspirado pelo BSD, ele criará um arquivo atomicamente com O_NOFOLLOW ; você terá que chamar chmod depois se o modo padrão de 600 não for o correto.

    
por 05.09.2012 / 03:14
-1

Eu tenho um script bash no meu diretório inicial /home/anthony/touchmod.sh contendo:

#!/bin/bash

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

Então, se eu precisar criar readme.txt com 644 permissões, posso digitar:

~/touchmod.sh 644 readme.txt
    
por 31.05.2015 / 17:15