¿Cómo puedo usar sudo para verificar si existe un archivo?

13

Quiero comprobar si existe un archivo así

[ -f /path/to/file/ ]

Sin embargo, estoy ejecutando este comando como usuario normal y el archivo es propiedad de root. ¿Cómo puedo usar sudo para lograr esto?

sudo [ -f /path/to/file/ ] No funciona.

ckliborn
fuente
2
Funciona en mi sistema. Cuales son los sintomas ? ¿Estás seguro de que quieres usar -f, no -e?
b0fh

Respuestas:

11

Lo que está describiendo debería funcionar bien, siempre que esté utilizando rutas absolutas y -f("El archivo existe y es un archivo normal") es realmente la prueba que desea realizar.

Veo un final /en lo que publicaste en tu pregunta: ¿estás probando un directorio? Eso debería ser -d, o simplemente -e("Algo existe con ese nombre, independientemente del tipo")

También tenga en cuenta que a menos que algo en el camino no sea legible test( [) debería poder decirle si un archivo propiedad de root existe o no (por ejemplo [ -f /root/.ssh/known_hosts ], probablemente fallará, porque el directorio /root/.ssh no lo es (o al menos no debería) t ) ser legible por un usuario normal. [ -f /etc/crontab ]debe tener éxito).

voretaq7
fuente
44
Existe un posible problema: si el sudocomando falla (contraseña incorrecta, no permitida en / etc / sudoers, etc.), dará el mismo resultado que si el archivo no existiera.
Gordon Davisson
1
@Gordon - cierto: mi respuesta se basa en la sudoparte que funciona :)
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 prueba

Para completar las cosas, en el lado opuesto, si desea verificar desde la raíz si un archivo o directorio es legible para un determinado usuario, puede usar

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi
Luca Borrione
fuente
La respuesta de Luca Borrione funcionó perfectamente para mí. Necesitaba probar la existencia de archivos que se encontraban en el interior de directorios legibles solo por root.
wallheater
1

Además de las otras respuestas, se puede distinguir entre la prueba o la falla de autenticación de sudo ejecutando primero sudo true. La mayoría de las implementaciones de sudo que conozco no requerirán una nueva autenticación en un corto período de tiempo.

Por ejemplo:

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
fuente