Perché il comando find esplode in / run /?


13

Ho usato il seguente comando per controllare le versioni di Python come dato da questa risposta . Funziona tranne un errore, mostrato di seguito. Qualcuno può spiegare perché?

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

Errore:

find: ‘/run/user/1000/gvfs’: Permission denied

2
python --versione python3 --versionper mostrare la versione attiva. Abbiamo tutti una versione 2.xe una versione 3.x;)
Rinzwind

6
E l'errore è normale e non è un problema con il comando. /run/non dovrebbe essere incluso in "trova". gvfsnon è di proprietà dell'utente.
Rinzwind,

1
Puoi anche digitare pythonnella console e premere due volte il tasto Tab, a partire da tutti gli eseguibili sul tuo percorso python.
Timo,

7
Buon dolore, gente. Sto apportando una modifica abbastanza pesante alla domanda perché alcune persone non sono riuscite a passare al primo paragrafo. L'OP sa come trovare quali versioni, la domanda è perché questo comando (che trova tutte le versioni di Python) sta eliminando un errore specifico. Se si desidera pubblicare post python -Ve alternative, si prega di portarlo a una domanda che sollecita effettivamente tali informazioni .
Oli

1
Eseguire il comando nella domanda è una cattiva idea, troverà qualsiasi file sul tuo sistema il cui nome inizia con Python ed eseguirlo come root . Se i tuoi utenti scoprono che usi questo comando, hai appena consegnato loro un banale exploit di root.
Peter Green,

Risposte:


20

Le autorizzazioni:

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

Quindi solo il proprietario ha il permesso di esecuzione (che consente di cercare le directory). Ma hai usato sudoe root ha tutte le autorizzazioni possibili, giusto? In realtà hai trovato l'eccezione:

Questa risposta di Gilles su Unix e Linux SE spiega perché viene negata l'autorizzazione per root quella directory, che è un mountpoint per FUSE:

Gestire i confini di fiducia con i filesystem FUSE è difficile, perché il driver del filesystem è in esecuzione come utente non privilegiato, al contrario del codice del kernel per i filesystem tradizionali. Per evitare complicazioni, per impostazione predefinita, i filesystem FUSE sono accessibili solo all'utente che esegue il processo del driver. Anche il root non riesce a aggirare questa limitazione.

Se esegui il findcomando senza sudo(come tuo utente, UID 1000) non otterrai questo errore, perché possiedi la directory, ma otterrai invece altri errori di autorizzazione, quindi usa sudoe segui il consiglio di Gilles:

Se stai cercando un file solo su filesystem locali, passa -xdev per trovarlo.


Il modo più semplice per controllare le versioni di Python:

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

Ho un solo utente tranne root, quindi chi ti aspetti di possederlo?
Abdul Qayyum,

1
Sei tu, UID 1000. Puoi accedere cda quella directory come il tuo normale utente, ma non come root. Se corri findsenza di sudote non vedrai quell'errore (ma otterrai ovviamente altri errori di autorizzazione)
Zanna,

2
@abdulqayyum Sei sicuro? Di default ubuntu ha parecchi utenti associati a vari processi daemon. Quindi sì, non possono effettuare il login e non hanno una home directory ma esistono e possono possedere file e directory ...
Bakuriu

7

Esistono diversi modi per trovare la versione di Python in uso. Ecco due modi per ottenere entrambe le versioni Python 2 e Python 3:

Python specifico

Prima esegui pythone python3con l'opzione--version

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

Questo è specifico per Python, ma molti altri programmi usano un metodo simile.

Generale per qualsiasi pacchetto / programma

Un metodo più generale è vedere quale pacchetto è installato. dpkg -lelencherà tutti i tuoi pacchetti, ma puoi specificare quali pacchetti stai cercando. Per solo python e python3 utilizzare quanto segue:

$ 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 

Come extra titbit. Se desideri trovare tutti i pacchetti che iniziano con un nome python, puoi utilizzare il carattere jolly in *questo modo:

$ dpkg -l 'python*'

Ciò stamperà molte righe con i pacchetti.


Buona risposta ma lo script sopra funziona. Ero solo preoccupato per il rifiuto del permesso
abdul qayyum,

Molti di noi reindirizzano semplicemente stderr a un file temporaneo. Succede per molte operazioni sul tipo di scansione.
mckenzm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.