Come posso usare sudo per verificare se esiste un file?


13

Voglio verificare se esiste un file in questo modo

[ -f /path/to/file/ ]

Tuttavia sto eseguendo questo comando come utente normale e il file è di proprietà di root. Come posso usare sudo per ottenere questo risultato.

sudo [ -f /path/to/file/ ] non funziona.


2
Funziona sul mio sistema. Quali sono i sintomi? Sei sicuro di voler usare -f, non -e?
dal

Risposte:


11

Quello che stai descrivendo dovrebbe funzionare bene - fintanto che stai usando percorsi assoluti e -f("Il file esiste ed è un file normale") è davvero il test che vuoi eseguire.

Vedo un trailing /in quello che hai pubblicato nella tua domanda - Stai testando una directory? Dovrebbe essere -d, o semplicemente -e("Esiste qualcosa con quel nome - indipendentemente dal tipo")

Si noti inoltre che a meno che qualcosa lungo il percorso non sia leggibile test( [) dovrebbe essere in grado di dirti se esiste o meno un file di proprietà di root (ad es. [ -f /root/.ssh/known_hosts ]Probabilmente fallirà, perché la directory /root/.ssh non è (o almeno non dovrebbe essere leggibile da un utente normale. [ -f /etc/crontab ]dovrebbe avere successo).


4
C'è un possibile problema: se il sudocomando fallisce (password errata, non consentita in / etc / sudoers, ecc.), Si otterrà lo stesso risultato come se il file non esistesse.
Gordon Davisson,

1
@Gordon - true: la mia risposta è basata sulla sudoporzione funzionante :)
voretaq7

13
if sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

pagina man di prova

Per completare le cose, sul lato opposto, se si desidera verificare dalla radice se un file o una directory è leggibile per un determinato utente, è possibile utilizzare

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

La risposta di Luca Borrione ha funzionato perfettamente per me. Avevo bisogno di testare l'esistenza di file che erano in profondità nelle directory leggibili solo da root.
wallheater il

1

Aggiungendo alle altre risposte, la distinzione tra il test o l'autenticazione sudo non riuscita potrebbe essere eseguita eseguendo prima sudo true. La maggior parte delle implementazioni sudo che conosco non richiedono una nuova autenticazione entro un breve periodo.

Per esempio:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.