Comment puis-je utiliser sudo pour vérifier si un fichier existe?

13

Je veux vérifier si un fichier existe comme ça

[ -f /path/to/file/ ]

Cependant, j'exécute cette commande en tant qu'utilisateur normal et le fichier appartient à root. Comment puis-je utiliser sudo pour y parvenir.

sudo [ -f /path/to/file/ ] ne marche pas.

ckliborn
la source
2
Cela fonctionne sur mon système. Quels sont les symptômes ? Voulez-vous vraiment utiliser -f, pas -e?
b0fh

Réponses:

11

Ce que vous décrivez devrait fonctionner correctement - tant que vous utilisez des chemins absolus et -f("Le fichier existe et est un fichier normal") est vraiment le test que vous souhaitez effectuer.

Je vois un suivi /dans ce que vous avez posté dans votre question - testez-vous un répertoire? Cela devrait être -d, ou simplement -e("Quelque chose existe avec ce nom - quel que soit le type")

Notez également que si quelque chose le long du chemin n'est pas lisible test( [) devrait être en mesure de vous dire si un fichier appartenant à root existe ou non (par exemple , [ -f /root/.ssh/known_hosts ]échouera probablement, car le répertoire de /root/.ssh est pas (ou du moins shouldn ne sera pas ) lisible par un utilisateur normal. [ -f /etc/crontab ]devrait réussir).

voretaq7
la source
4
Il y a un problème possible: si la sudocommande échoue (mauvais mot de passe, non autorisé dans / etc / sudoers, etc.), elle donnera le même résultat que si le fichier n'existait pas.
Gordon Davisson
1
@Gordon - true: Ma réponse est basée sur la sudoportion qui fonctionne :)
voretaq7
13
if sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

page de manuel de test

Pour compléter les choses, sur le côté opposé, si vous souhaitez vérifier à partir de la racine si un fichier ou un répertoire est lisible pour un certain utilisateur, vous pouvez utiliser

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi
Luca Borrione
la source
La réponse de Luca Borrione a parfaitement fonctionné pour moi. J'avais besoin de tester l'existence de fichiers profondément enfouis dans des répertoires lisibles uniquement par root.
chauffe
1

En ajoutant aux autres réponses, la distinction entre le test ou l'échec de l'authentification sudo peut être effectuée en exécutant d'abord sudo true. La plupart des implémentations sudo que je connais ne nécessitent pas de ré-authentification dans un court laps de temps.

Par exemple:

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
la source