Em um script de shell, como faço para testar de maneira fácil e não invasiva o acesso de gravação a um arquivo sem realmente tentar modificá-lo?
Eu poderia analisar a saída de stat
, mas isso parece realmente complexo e talvez quebradiço, embora não tenha certeza de quanto a saída de estatísticas difere nas implementações e no tempo.
Eu poderia acrescentar ao final do arquivo e ver se isso foi bem-sucedido, mas isso é potencialmente perigoso, por duas razões em que consigo pensar:
- Agora tenho que remover a adição e, caso algum outro processo seja gravado no arquivo, isso imediatamente se tornará não trivial, pois minha linha não é mais a última.
- Qualquer processo de leitura do arquivo pode ter requisitos arbitrários no conteúdo desse arquivo, e eu posso simplesmente ter quebrado esse aplicativo.
fonte
man test
ouman [
type -a
test
usaeuidaccess
que simplesmente verifica os bits de permissão . Não existem outros fatores (por exemplo, SELinux) que poderiam proibir o acesso de gravação?&&
e||
têm a mesma precedência. Eles são avaliados da esquerda para a direita.Outra abordagem:
Isso tentará abrir o arquivo para anexar e, se tiver êxito, execute não nenhum comando (ou seja, execute um comando nulo ) com saída para o arquivo.
Cuidado, pois isso cria um arquivo vazio, se não existir.
O
-w
operador dotest
comando pode apenas fazer umastat
e tentar descobrir se parece que você deve ter acesso. Minha alternativa (acima) é mais confiável do que atest
abordagem em algumas condições especiais, porque força a verificação de acesso a ser feita pelo kernel e não pelo shell. Por exemplo,stat
poderá retornar um valor de modo enganoso.fonte
touch
um arquivo que eu possuía, mas não tinha acesso de gravação, e foi bem-sucedido. Acho quechmod
é o arquivo echmod
o devolvemos. Portanto,touch
parece ser absolutamente inútil como resposta à pergunta.vim
tem esse comportamento de alterar rapidamente as permissões quando forçado a gravar em arquivos somente leitura. Eu verifiquei comstrace
,touch
'sopen
falha comEACCES
, mas a chamada subsequente parautimensat
bem-sucedido, que é por isso que eu acho quetouch
em todo o saídas com sucesso.utimensat(2)
diz: “ Requisitos de permissão: 1. acesso de gravação (ou) 2. o ID do usuário efetivo do chamador deve corresponder ao proprietário do arquivo,….”>> file
não é portátil (por exemplo, executa o NULLCMD no zsh), use emtrue >> file
vez disso. E se o arquivo é um pipes nomeados, ele tem efeitos colaterais desagradáveis.G-man está certo:
[ -w ]
nem sempre dirá a verdade. Aqui para lidar com arquivos inexistentes e com a permissão negada da shell:Atualizar : Parece assustador, não é? Bem, é sim. Hmm ... como expressá-lo ... NÃO USE ISSO, a menos que você saiba perfeitamente que está nas condições que ele solicita para funcionar como esperado. Veja o comentário de Stephane.
O que concluir então? Mesmo
[ -w ]
que não diga a verdade, é o único comando que se destina a fazer o trabalho. Se isso não acontecer, culparemos, escreveremos relatórios de bugs e funcionará no futuro. Melhor verificar as condições sob as quais ele trabalha e usa[ -w ]
; escreva código especial para casos especiais. As soluções alternativas têm suas próprias condições.é o melhor a priori .
fonte
test -w
na maioria das implementações, o usoaccess(2)
deve ser suficiente para testar permissões.