Como posso usar o sudo para verificar se existe um arquivo?

13

Quero verificar se existe um arquivo como esse

[ -f /path/to/file/ ]

No entanto, estou executando este comando como um usuário comum e o arquivo pertence à raiz. Como posso usar o sudo para fazer isso.

sudo [ -f /path/to/file/ ] não funciona.

ckliborn
fonte
2
Funciona no meu sistema. Quais são os sintomas? Tem certeza de que deseja usar -f, não -e?
b0fh

Respostas:

11

O que você está descrevendo deve funcionar bem - desde que você esteja usando caminhos absolutos e -f("O arquivo existe e é um arquivo comum") é realmente o teste que você deseja executar.

Eu vejo um rastro /no que você postou na sua pergunta - Você está testando para um diretório? Deve ser -d, ou simplesmente -e("Existe algo com esse nome - independentemente do tipo")

Observe também que, a menos que algo ao longo do caminho não seja legível test( [), deve ser capaz de informar se um arquivo pertencente ao root existe ou não (por exemplo [ -f /root/.ssh/known_hosts ], provavelmente falhará, porque o diretório /root/.ssh não é (ou pelo menos deveria 't ser ) legível por um usuário normal. [ -f /etc/crontab ]deve suceder).

voretaq7
fonte
4
Existe um possível problema: se o sudocomando falhar (senha incorreta, não permitida em / etc / sudoers, etc), dará o mesmo resultado como se o arquivo não existisse.
Gordon Davisson
1
@Gordon - true: A minha resposta é baseada na sudoparte de trabalho :)
voretaq7
13
if sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

página de manual de teste

Para concluir, no lado oposto, se você deseja verificar a partir da raiz se um arquivo ou diretório é legível para um determinado usuário, você pode usar

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi
Luca Borrione
fonte
A resposta de Luca Borrione funcionou perfeitamente para mim. Eu precisava testar a existência de arquivos que estavam dentro de diretórios legíveis apenas pela raiz.
Wallheater
1

Adicionando às outras respostas, a distinção entre a falha de autenticação de teste ou sudo pode ser feita pela primeira execução sudo true. A maioria das implementações de sudo que conheço não exigirá nova autenticação dentro de um curto período.

Por exemplo:

if sudo true; then
    if sudo test -f "/path/to/file"; then
        echo "FILE EXISTS"
    else
        echo "FILE DOESN'T EXIST"
    fi
else
    echo "SUDO AUTHENTICATION FAILED"
fi
Robrecht Dewaele
fonte