¿Por qué el comando find explota en / run /?

13

Utilicé el siguiente comando para verificar las versiones de Python como se indica en esta respuesta . Funciona excepto por un error, que se muestra a continuación. ¿Alguien puede explicar por qué?

$ sudo find / -type f -executable -iname 'python*' -exec file -i '{}' \; \
    | awk -F: '/x-executable; charset=binary/ {print $1}' \
    | xargs readlink -f | sort -u | xargs -I % sh -c 'echo -n "%: "; % -V'

Error:

find: ‘/run/user/1000/gvfs’: Permission denied
abdul qayyum
fuente
2
python --versiony python3 --versionpara mostrar la versión activa. Todos tenemos una versión 2.xy una versión 3.x;)
Rinzwind
66
Y el error es normal y no es un problema con el comando. /run/no debe incluirse en "buscar". gvfsno es propiedad de su usuario.
Rinzwind
1
También puede escribir pythonen la consola y presionar la tecla de tabulación dos veces, se mostrará cada ejecutable en su ruta a partir de python.
Timo
77
Buena pena, gente. Estoy haciendo una edición bastante considerable de la pregunta porque algunas personas no lograron llegar al primer párrafo. El OP sabe cómo encontrar qué versiones, la pregunta es por qué este comando (que encuentra todas las versiones de Python) está arrojando un error específico. Si desea publicar acerca de python -Vy alternativas, diríjase a una pregunta que realmente solicite esa información .
Oli
1
Ejecutar el comando en la pregunta es una mala idea, encontrará cualquier archivo en su sistema cuyo nombre comience con python y lo ejecutará como root . Si tus usuarios descubren que usas este comando, entonces solo les entregaste un exploit de raíz trivial.
Peter Green

Respuestas:

20

Los permisos:

$ stat -c %a /run/user/1000/gvfs
500

Por lo tanto, solo el propietario tiene permiso de ejecución (que permite buscar directorios). Pero, usaste sudoy root tiene todos los permisos posibles, ¿verdad? En realidad encontraste la excepción:

Esta respuesta de Gilles en Unix y Linux SE explica por qué se niega el permiso para el directorio raíz, que es un punto de montaje para FUSE:

Administrar los límites de confianza con los sistemas de archivos FUSE es difícil, porque el controlador del sistema de archivos se ejecuta como un usuario sin privilegios, a diferencia del código del núcleo para los sistemas de archivos tradicionales. Para evitar complicaciones, de manera predeterminada, los sistemas de archivos FUSE solo son accesibles para el usuario que ejecuta el proceso del controlador. Incluso la raíz no puede pasar por alto esta restricción.

Si ejecuta el findcomando sin sudo(como su propio usuario, UID 1000) no obtendrá ese error, porque es el propietario del directorio, pero en su lugar obtendrá otros errores de permiso, así que use sudoy siga el consejo de Gilles:

Si está buscando un archivo solo en sistemas de archivos locales, pase -xdev para buscar.


La forma más fácil de verificar las versiones de Python:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Zanna
fuente
Solo tengo un usuario, excepto root, ¿quién espera que sea el propietario?
abdul qayyum
1
Eres tú, UID 1000. Puedes cdhacerlo en ese directorio como tu usuario normal, pero no como root. Si corre findsin sudono verá ese error (pero obtendrá otros errores de permiso, por supuesto)
Zanna
2
@abdulqayyum ¿Estás seguro? Por defecto, ubuntu tiene bastantes usuarios asociados con varios procesos de daemon. Entonces, sí, no pueden iniciar sesión y no tienen un directorio de inicio, pero existen y pueden poseer archivos y directorios ...
Bakuriu
7

Hay varias formas de encontrar qué versión de Python tienes. Aquí hay dos formas de obtener las versiones de Python 2 y Python 3:

Python específica

Primero solo corre pythony python3con la opción--version

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

Esto es específico para python, pero muchos otros programas usan un método similar.

General para cualquier paquete / programa

Un método más general es ver qué paquete está instalado. dpkg -lenumerará todos sus paquetes, pero puede especificar qué paquetes está buscando. Solo para python y python3 use lo siguiente:

$ dpkg -l 'python'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python                2.7.11-1        amd64           interactive high-level object-oriented language 
$ dpkg -l 'python3'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python3               3.5.1-3         amd64           interactive high-level object-oriented language 

Como un titbit extra. Si desea encontrar todos los paquetes que tienen un nombre comenzando python, puede usar caracteres comodín *como este:

$ dpkg -l 'python*'

Eso imprimirá muchas líneas con paquetes.

Jorgen
fuente
Buena respuesta, pero el script anterior funciona. Estaba preocupado por la denegación de permisos
abdul qayyum
La mayoría de nosotros simplemente redirige stderr a un archivo temporal. Sucede muchas operaciones de tipo escaneo.
mckenzm