Чому команда find вибухає в / run /?


13

Я використовував наступну команду, щоб перевірити версії python, як це дано у цій відповіді . Це працює, за винятком однієї помилки, показаної нижче. Хтось може пояснити, чому?

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

Помилка:

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

2
python --versionі python3 --versionпоказати активну версію. У всіх нас є версія 2.x і версія 3.x;)
Rinzwind

6
І помилка - це нормально і не проблема з командою. /run/не слід включати в "знайти". gvfsне належить вашому користувачеві.
Rinzwind

1
Ви також можете ввести pythonконсоль і натиснути клавішу вкладки двічі, вона відобразить кожен виконуваний файл у вашому шляху, починаючи з python.
Тимо

7
Добре горе, люди. Я доволі здоровенно редагую це питання, тому що деяким людям не вдалося проникнути в перший абзац. ОП знає, як знайти, які версії, питання полягає в тому, чому ця команда (яка знаходить усі версії Python) вигадує конкретну помилку. Якщо ви хочете опублікувати інформацію python -Vта альтернативи, перейдіть до питання, яке насправді вимагає цієї інформації .
Олі

1
Запуск команди у питанні - це погана ідея, вона знайде будь-який файл у вашій системі, ім'я якого починається з python, та виконає його як root . Якщо ваші користувачі дізнаються, що ви використовуєте цю команду, тоді ви просто передали їм тривіальний root-exploit.
Пітер Грін

Відповіді:


20

Дозволи:

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

Тож лише власник має дозвіл на виконання (що дозволяє шукати каталоги). Але, ви використовували sudoі root має всі можливі дозволи, правда? Насправді ви знайшли виняток:

Ця відповідь на Жиля на Unix і Linux SE пояснює , чому заборонений доступ до кореневої директорії , що, який є точкою монтування для FUSE:

Управління межами довіри за допомогою файлових систем FUSE складно, оскільки драйвер файлової системи працює як непривілейований користувач, на відміну від коду ядра для традиційних файлових систем. Щоб уникнути ускладнень, за замовчуванням файлові системи FUSE доступні лише користувачеві, який запускає драйвер. Навіть root не може обійти це обмеження.

Якщо ви запустите findкоманду без sudo(як власний користувач, UID 1000), ви не отримаєте цієї помилки, оскільки у вас є каталог, але ви отримаєте інші помилки дозволу, тому скористайтеся sudoта прийміть поради Gilles:

Якщо ви шукаєте файл лише в локальних файлових системах, передайте -xdev, щоб знайти.


Найпростіший спосіб перевірити версії python:

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

У мене є лише один користувач, окрім root, тоді, кого ви очікуєте, що ним володіти?
abdul qayyum

1
Це ви, UID 1000. Ви можете cdдо цього каталогу як звичайний користувач, але не як root. Якщо запустити findбез sudoвас не буде бачити , що помилка (але ви отримаєте інші помилки дозволу, звичайно)
Žanna

2
@abdulqayyum Ви впевнені? За замовчуванням ubuntu має досить багато користувачів, пов'язаних з різними демоновими процесами. Так, так, вони не можуть увійти, і вони не мають домашнього каталогу, але вони існують і можуть володіти файлами та каталогами ...
Bakuriu

7

Існує кілька способів знайти версію python у вас. Ось два способи отримати версії Python 2 та Python 3:

Python Specific

Спочатку просто запустіть pythonі python3з опцією--version

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

Це специфічно для python, але багато інших програм використовують подібний метод.

Загальне для будь-якого пакету / програми

Більш загальний метод - це побачити, який пакет встановлений. dpkg -lперерахує всі ваші пакунки, але ви можете вказати, які пакунки шукаєте. Для python та python3 використовуйте наступне:

$ 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 

Як додатковий титбіт. Якщо ви хочете знайти всі пакунки, з яких починається ім’я python, ви можете використовувати символ wildcard *таким чином:

$ dpkg -l 'python*'

Це надрукує багато рядків з пакетами.


Хороша відповідь, але сценарій вище працює. Мене просто хвилювало відмова в дозволі
abdul qayyum

Більшість із нас просто перенаправляє stderr на тимчасовий файл. Відбувається багато операцій типу сканування.
mckenzm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.