Warum sprengt der find Befehl in / run /?

13

Ich habe den folgenden Befehl verwendet, um die in dieser Antwort angegebenen Python-Versionen zu überprüfen . Es funktioniert bis auf einen Fehler (siehe unten). Kann jemand erklären, warum?

$ 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
quelle
2
python --versionund python3 --versionum die aktive Version anzuzeigen. Wir haben alle eine 2.x-Version und die 3.x-Version;)
Rinzwind
6
Und der Fehler ist normal und kein Problem mit dem Befehl. /run/sollte nicht in "find" enthalten sein. gvfsgehört nicht Ihrem Benutzer.
Rinzwind
1
Sie können auch pythondie Konsole eingeben und zweimal die Tabulatortaste drücken. Es werden alle ausführbaren Dateien in Ihrem Pfad angezeigt, die mit beginnen python.
Timo
7
Guter Kummer, Leute. Ich bearbeite die Frage ziemlich heftig, weil einige Leute es nicht geschafft haben, den ersten Absatz zu erreichen. Das OP weiß, wie man welche Versionen findet. Die Frage ist, warum dieser Befehl (der alle Versionen von Python findet) einen bestimmten Fehler ausgibt. Wenn Sie über python -Vund Alternativen posten möchten , wenden Sie sich bitte an eine Frage, bei der diese Informationen tatsächlich eingeholt werden .
Oli
1
Es ist keine gute Idee, den Befehl in der Frage auszuführen. Er findet alle Dateien auf Ihrem System, deren Name mit python beginnt, und führt sie als root aus . Wenn Ihre Benutzer herausfinden, dass Sie diesen Befehl verwenden, haben Sie ihnen lediglich einen einfachen Root-Exploit übergeben.
Peter Green

Antworten:

20

Die Berechtigungen:

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

Daher hat nur der Eigentümer die Ausführungsberechtigung (mit der Verzeichnisse durchsucht werden können). Aber du benutzt sudound root hat alle möglichen Berechtigungen, oder? Eigentlich hast du die Ausnahme gefunden:

Diese Antwort von Gilles unter Unix und Linux SE erklärt, warum die Berechtigung für das Stammverzeichnis verweigert wird, das ein Einhängepunkt für FUSE ist:

Das Verwalten von Vertrauensgrenzen mit FUSE-Dateisystemen ist schwierig, da der Dateisystemtreiber im Gegensatz zum Kernelcode für herkömmliche Dateisysteme als nicht privilegierter Benutzer ausgeführt wird. Um Komplikationen zu vermeiden, ist der Zugriff auf FUSE-Dateisysteme standardmäßig nur dem Benutzer möglich, der den Treiberprozess ausführt. Sogar root kann diese Einschränkung nicht umgehen.

Wenn Sie den findBefehl ausführen, ohne sudo(als Ihr eigener Benutzer, UID 1000), wird dieser Fehler nicht angezeigt, da Ihnen das Verzeichnis gehört. Stattdessen werden andere Berechtigungsfehler angezeigt. Befolgen Sie daher sudoGilles 'Ratschläge:

Wenn Sie nur auf lokalen Dateisystemen nach einer Datei suchen, übergeben Sie -xdev, um sie zu finden.


Der einfachste Weg, um Python-Versionen zu überprüfen:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Zanna
quelle
Ich habe nur einen Benutzer außer root. Wen erwartest du dann als Besitzer?
Abdul Qayyum
1
Sie sind es, UID 1000. Sie können cdals normaler Benutzer in dieses Verzeichnis wechseln, aber nicht als Root. Wenn Sie findohne laufen, werden sudoSie diesen Fehler nicht sehen (aber Sie werden natürlich andere Berechtigungsfehler bekommen)
Zanna
2
@abdulqayyum Bist du sicher? Standardmäßig hat Ubuntu einige Benutzer, die mit verschiedenen Daemon-Prozessen verbunden sind. Also ja, sie können sich nicht einloggen und sie haben kein Home-Verzeichnis, aber sie existieren und können Dateien und Verzeichnisse besitzen ...
Bakuriu
7

Es gibt verschiedene Möglichkeiten, um herauszufinden, welche Version von Python Sie haben. Hier sind zwei Möglichkeiten, wie Sie sowohl Python 2- als auch Python 3-Versionen erhalten:

Python-spezifisch

Zuerst einfach ausführen pythonund python3mit der Option--version

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

Dies ist spezifisch für Python, aber viele andere Programme verwenden eine ähnliche Methode.

Allgemein für jedes Paket / Programm

Eine allgemeinere Methode besteht darin, zu ermitteln, welches Paket installiert ist. dpkg -llistet alle Ihre Pakete auf, aber Sie können angeben, nach welchen Paketen Sie suchen. Verwenden Sie nur für Python und Python3 Folgendes:

$ 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 

Als extra Leckerbissen. Wenn Sie alle Pakete suchen möchten, deren Name mit "" beginnt python, können Sie ein Platzhalterzeichen *wie das folgende verwenden:

$ dpkg -l 'python*'

Das wird eine Menge Zeilen mit Paketen drucken.

Jorgen
quelle
Gute Antwort, aber das obige Skript funktioniert. Ich war nur besorgt über die Verweigerung der Erlaubnis
abdul qayyum
Die meisten von uns leiten stderr einfach in eine temporäre Datei um. Passiert für viele Scan-Vorgänge.
McKenzm