web-dev-qa-db-fra.com

Pourquoi la commande find explose-t-elle dans / run /?

J'ai utilisé la commande suivante pour vérifier les versions de python telles que données par cette réponse . Cela fonctionne sauf pour une erreur, illustrée ci-dessous. Quelqu'un peut-il expliquer pourquoi?

$ 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'

Erreur:

find: ‘/run/user/1000/gvfs’: Permission denied
13
abdul qayyum

Les permissions:

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

Ainsi, seul le propriétaire dispose de l'autorisation d'exécution (ce qui permet d'effectuer une recherche dans les répertoires). Mais vous avez utilisé Sudo et root a toutes les autorisations possibles, non? En fait, vous avez trouvé l'exception:

Cette réponse par Gilles sous Unix et Linux SE explique pourquoi la permission est refusée pour root ce répertoire, qui est un point de montage pour Fuse:

La gestion des limites de confiance avec les systèmes de fichiers Fuse est difficile, car le pilote du système de fichiers s'exécute en tant qu'utilisateur non privilégié, par opposition au code du noyau des systèmes de fichiers traditionnels. Pour éviter les complications, par défaut, les systèmes de fichiers Fuse ne sont accessibles qu’à l’utilisateur exécutant le processus de pilote. Même root ne peut pas contourner cette restriction.

Si vous exécutez la commande find sans Sudo (en tant que votre propre utilisateur, UID 1000), vous n'obtiendrez pas cette erreur, car vous êtes propriétaire du répertoire, mais vous obtiendrez d'autres erreurs d'autorisation. Utilisez donc Sudo et suivez les conseils de Gilles:

Si vous recherchez un fichier sur des systèmes de fichiers locaux uniquement, passez -xdev à rechercher.


Meilleure façon de vérifier les versions de python:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
20
Zanna

Il existe plusieurs façons de trouver quelle version de python vous avez. Voici deux manières d'obtenir les versions Python 2 et Python 3:

spécifique à Python

D'abord, lancez simplement python et python3 avec l'option --version

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

Ceci est spécifique à Python, mais beaucoup d’autres programmes utilisent une méthode similaire.

Général pour tout package/programme

Une méthode plus générale consiste à voir quel paquet est installé. dpkg -l listera tous vos paquets, mais vous pouvez spécifier les paquets que vous recherchez. Pour pythonuniquement _ et python3, utilisez les éléments suivants:

$ 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 

Comme un bonus supplémentaire. Si vous souhaitez rechercher tous les packages dont le nom commence par python, vous pouvez utiliser le caractère générique * comme ceci:

$ dpkg -l 'python*'

Cela va imprimer beaucoup de lignes avec des paquets.

7
Jorgen