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


13

J'ai utilisé la commande suivante pour vérifier les versions de python comme indiqué 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

2
python --versionet python3 --versionpour afficher la version active. Nous avons tous une version 2.x et une version 3.x;)
Rinzwind

6
Et l'erreur est normale et n'est pas un problème avec la commande. /run/ne doit pas être inclus dans "find". gvfsn'appartient pas à votre utilisateur.
Rinzwind

1
Vous pouvez également taper pythondans la console et appuyer deux fois sur la touche de tabulation, il affichera tous les exécutables de votre chemin en commençant par python.
Timo

7
Bon deuil, les gens. J'apporte une modification assez lourde à la question parce que certaines personnes n'ont pas réussi à atteindre le premier paragraphe. L'OP sait trouver quelles versions, la question est de savoir pourquoi cette commande (qui trouve toutes les versions de Python) supprime une erreur spécifique. Si vous souhaitez publier des informations sur les python -Valternatives, veuillez les poser à une question sollicitant réellement ces informations .
Oli

1
L'exécution de la commande dans la question est une mauvaise idée, elle trouvera tout fichier sur votre système dont le nom commence par python et l' exécutera en tant que root . Si vos utilisateurs découvrent que vous utilisez cette commande, vous leur avez simplement remis un root-exploit trivial.
Peter Green

Réponses:


20

Les autorisations:

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

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

Cette réponse de Gilles sur Unix et Linux SE explique pourquoi l'autorisation est refusée pour rooter 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 fonctionne en tant qu'utilisateur non privilégié, par opposition au code du noyau pour les 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 du pilote. Même root ne peut pas contourner cette restriction.

Si vous exécutez la findcommande sans sudo(en tant que votre propre utilisateur, UID 1000), vous n'obtiendrez pas cette erreur, car vous possédez le répertoire, mais vous obtiendrez d'autres erreurs d'autorisation à la place, alors, utilisez sudoet suivez les conseils de Gilles:

Si vous recherchez un fichier uniquement sur des systèmes de fichiers locaux, passez -xdev pour le trouver.


Le moyen le plus simple de vérifier les versions de python:

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

Je n'ai qu'un seul utilisateur sauf root, alors qui pensez-vous en être le propriétaire?
abdul qayyum du

1
C'est vous, UID 1000. Vous pouvez accéder cdà ce répertoire en tant qu'utilisateur normal, mais pas en tant que root. Si vous courez findsans, sudovous ne verrez pas cette erreur (mais vous obtiendrez bien sûr d'autres erreurs d'autorisation)
Zanna

2
@abdulqayyum Êtes-vous sûr? Par défaut, ubuntu a plusieurs utilisateurs associés à divers processus démon. Alors oui, ils ne peuvent pas se connecter et ils n'ont pas de répertoire personnel mais ils existent et peuvent posséder des fichiers et des répertoires ...
Bakuriu

7

Il existe plusieurs façons de trouver la version de python dont vous disposez. Voici deux façons d'obtenir les versions Python 2 et Python 3:

Spécifique à Python

Il suffit de lancer pythonet python3avec l'option--version

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

Ceci est spécifique à python, mais de nombreux autres programmes utilisent une méthode similaire.

Général pour tout forfait / programme

Une méthode plus générale consiste à voir quel package est installé. dpkg -lrépertorie tous vos packages, mais vous pouvez spécifier les packages que vous recherchez. Pour seulement python et python3, utilisez ce qui suit:

$ 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 morceau supplémentaire. Si vous souhaitez trouver tous les packages dont le nom commence par python, vous pouvez utiliser un caractère générique *comme celui-ci:

$ dpkg -l 'python*'

Cela imprimera beaucoup de lignes avec des packages.


Bonne réponse mais le script ci-dessus fonctionne. J'étais juste préoccupé par le refus d'autorisation
abdul qayyum

La plupart d'entre nous redirige simplement stderr vers un fichier temporaire. Cela se produit pour de nombreuses opérations de type scan.
mckenzm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.