Dlaczego polecenie find wysadza w powietrze / run /?

13

Użyłem następującego polecenia, aby sprawdzić wersje Pythona podane w tej odpowiedzi . Działa z wyjątkiem jednego błędu pokazanego poniżej. Czy ktoś może wyjaśnić, dlaczego?

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

Błąd:

find: ‘/run/user/1000/gvfs’: Permission denied
abdul qayyum
źródło
2
python --versioni python3 --versionpokazać aktywną wersję. Wszyscy mamy wersję 2.x i 3.x;)
Rinzwind,
6
Błąd jest normalny i nie stanowi problemu z poleceniem. /run/nie powinny być uwzględniane w „znajdź”. gvfsnie jest własnością użytkownika.
Rinzwind,
1
Możesz także wpisać pythonw konsoli i nacisnąć klawisz tab dwa razy, pokaże każdy plik wykonywalny na twojej ścieżce, zaczynając od python.
Timo,
7
Dobry smutek, ludzie. Dokonuję dość mocnej edycji tego pytania, ponieważ niektórym ludziom nie udało się przejść do pierwszego akapitu. OP wie, jak znaleźć wersje, pytanie dotyczy tego, dlaczego to polecenie (które wyszukuje wszystkie wersje Pythona) wyrzuca konkretny błąd. Jeśli chcesz publikować informacje o python -Valternatywach, przejdź do pytania, które faktycznie dotyczy tych informacji .
Oli
1
Uruchomienie polecenia w pytaniu jest złym pomysłem, znajdzie w systemie dowolny plik, którego nazwa zaczyna się od python i wykonuje go jako root . Jeśli Twoi użytkownicy dowiedzą się, że używasz tego polecenia, wręczyłeś im trywialny exploit roota.
Peter Green,

Odpowiedzi:

20

Uprawnienia:

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

Tak więc tylko właściciel ma uprawnienia do wykonywania (co umożliwia przeszukiwanie katalogów). Ale używałeś sudoi root ma wszystkie możliwe uprawnienia, prawda? Właściwie znalazłeś wyjątek:

Ta odpowiedź przez Gilles na Unix i Linux SE wyjaśnia, dlaczego odmówiono zgody na korzeniu tym katalogu, który jest mountpoint zapalnika:

Zarządzanie granicami zaufania w systemach plików FUSE jest trudne, ponieważ sterownik systemu plików działa jako użytkownik nieuprzywilejowany, w przeciwieństwie do kodu jądra dla tradycyjnych systemów plików. Aby uniknąć komplikacji, domyślnie systemy plików FUSE są dostępne tylko dla użytkownika uruchamiającego proces sterownika. Nawet root nie może ominąć tego ograniczenia.

Jeśli uruchomisz findpolecenie bez sudo(jako własnego użytkownika, UID 1000), nie dostaniesz tego błędu, ponieważ jesteś właścicielem katalogu, ale zamiast tego dostaniesz inne błędy uprawnień, więc skorzystaj z sudoporady Gillesa:

Jeśli szukasz pliku tylko w lokalnych systemach plików, podaj -xdev, aby znaleźć.


Najprostszym sposobem sprawdzenia wersji Pythona:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Zanna
źródło
Mam tylko jednego użytkownika oprócz roota, więc kogo masz go posiadać?
abdul qayyum,
1
To Ty, UID 1000. Możesz cdprzejść do tego katalogu jako zwykły użytkownik, ale nie jako root. Jeśli będziesz biegał findbez sudo, nie zobaczysz tego błędu (ale dostaniesz oczywiście inne błędy uprawnień)
Zanna,
2
@abdulqayyum Czy na pewno? Domyślnie ubuntu ma wielu użytkowników powiązanych z różnymi procesami demonów. Tak, nie mogą się zalogować i nie mają katalogu domowego, ale istnieją i mogą posiadać pliki i katalogi ...
Bakuriu,
7

Istnieje kilka sposobów na znalezienie posiadanej wersji Pythona. Oto dwa sposoby uzyskania wersji Python 2 i Python 3:

Specyficzne dla Pythona

Najpierw po prostu uruchom pythoni python3z opcją--version

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

Jest to specyficzne dla Pythona, ale wiele innych programów używa podobnej metody.

Ogólne dla każdego pakietu / programu

Bardziej ogólną metodą jest sprawdzenie, który pakiet jest zainstalowany. dpkg -lwyświetli listę wszystkich twoich pakietów, ale możesz określić, jakich pakietów szukasz. Aby użyć tylko Pythona i Pythona3, użyj następujących poleceń:

$ 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 

Jako dodatkowy przysmak. Jeśli chcesz znaleźć wszystkie pakiety, których nazwa zaczyna się od python, możesz użyć znaku zastępczego w *następujący sposób:

$ dpkg -l 'python*'

To wydrukuje wiele linii z pakietami.

Jorgen
źródło
Dobra odpowiedź, ale powyższy skrypt działa. Byłem zaniepokojony odmową zgody
abdul qayyum,
Większość z nas po prostu przekierowuje stderr do pliku tymczasowego. Dzieje się tak w przypadku wielu operacji typu skanowania.
mckenzm,