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

37

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

Existe um equivalente para criar arquivos na linha de comando?

Algo semelhante a:

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

Está usando touchseguido por uma chmodminha única opção aqui?


Edit: Depois de experimentar a sugestão de teppic para uso install, eu corri-lo através stracede ver o quão perto atômica que era. 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 shell e um que eu não conhecia antes.

quorniano
fonte

Respostas:

47

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

install -b -m 755 /dev/null newfile

A -bopção faz backup, newfilese já existir. Você pode usar este comando para definir o proprietário também.

teppic
fonte
4
+1 por me apresentarinstall
quornian
É um pequeno comando útil. Como o próprio nome sugere, ele é realmente projetado para instalar software compilado a partir do código fonte, para evitar ter que usar chmod, chown e assim por diante o tempo todo.
teppic
Se ao menos levasse stdin! OK, / proc / self / fd / 0 servirá para o meu propósito.
proski
Observe que o modo 755 são as permissões padrão dos arquivos criados com install, portanto, -m 755não é necessário.
Kusalananda
@Kusalananda É óbvio que é apenas um exemplo de como definir um modo, uma vez que era a questão, não como definir 755.
teppic
22

touchsempre cria o arquivo se ele não existir, sempre segue links simbólicos e sempre torna o arquivo não executável. Você pode decidir os bits de leitura e gravação através do umask .

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

A criação atômica de arquivos "seguros" (em particular com O_NOFOLLOW) não é possível com as ferramentas tradicionais de shell. Você pode usar sysopenem perl. Se você possui o mktemputilitário inspirado no BSD , ele cria um arquivo atomicamente com O_NOFOLLOW; você precisará ligar chmoddepois se o modo padrão 600 não for o correto.

Gilles 'SO- parar de ser mau'
fonte
Eu estava escrevendo uma explicação mais detalhada, mas os artigos da Wikipedia cobrem tudo muito bem.
Jordanm 5/12 /
Se ao menos touchtivesse a opção de criar arquivos executáveis, é isso que realmente procuro. Então umaskpoderia ser usado para personalizar os detalhes. Infelizmente não há nenhuma maneira com umaske touchpara criar arquivos executáveis.
quornian
@ Quornian Você não pode criar um arquivo não-vazio atomicamente de qualquer maneira. Qual é o sentido de criar um arquivo executável vazio atomicamente? Use touchseguido por chmod +x.
Gilles 'SO- stop be evil'
4
Você pode criar arquivos executáveis ​​não vazios atomicamente com ... ln ou mv. Você sempre pode criar o arquivo com o conteúdo e as permissões corretos em um diretório criado com umask 077 e movê-lo ou nele posteriormente.
Stéphane Chazelas
-1

Eu tenho um script bash no meu diretório pessoal que /home/anthony/touchmod.shcontém:

#!/bin/bash

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

Portanto, se eu precisar criar readme.txtcom 644 permissões, digite:

~/touchmod.sh 644 readme.txt
TeamugDotNet
fonte
3
Você provavelmente não entendeu a pergunta. É exatamente isso que o questionador tenta evitar.
ceving 24/08/16