Почему команда 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-эксплойт.
Питер Грин

Ответы:

20

Разрешения:

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

Таким образом, только владелец имеет разрешение на выполнение (что позволяет искать каталоги). Но вы использовали sudoи root имеет все возможные разрешения, верно? На самом деле вы нашли исключение:

Этот ответ на Жиля на Unix и Linux SE объясняет , почему запрещен доступ к корневой директории , что, который является точкой монтирования для FUSE:

Управление доверительными границами с файловыми системами FUSE сложно, потому что драйвер файловой системы работает как непривилегированный пользователь, в отличие от кода ядра для традиционных файловых систем. Чтобы избежать сложностей, по умолчанию файловые системы FUSE доступны только пользователю, выполняющему процесс драйвера. Даже root не может обойти это ограничение.

Если вы запустите findкоманду без sudo(как ваш собственный пользователь, UID 1000), вы не получите эту ошибку, потому что у вас есть каталог, но вместо этого вы получите другие ошибки разрешения, поэтому используйте sudoи примите совет Жиля:

Если вы ищете файл только на локальных файловых системах, введите -xdev для поиска.


Самый простой способ проверить версии Python:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Занна
источник
У меня есть только один пользователь, кроме root, тогда кто, как вы ожидаете, будет его владельцем?
Абдул Кайюм
1
Это вы, UID 1000. Вы можете войти cdв этот каталог как обычный пользователь, но не как root. Если вы бежите findбез sudoвас, вы не увидите эту ошибку (но, конечно, вы получите и другие ошибки разрешения)
Zanna
2
@abdulqayyum Вы уверены? По умолчанию в Ubuntu довольно много пользователей, связанных с различными процессами демона. Так что да, они не могут войти в систему и у них нет домашнего каталога, но они существуют и могут иметь файлы и каталоги ...
Бакуриу
7

Есть несколько способов узнать, какая у вас версия Python. Вот два способа получить версии Python 2 и Python 3:

Специфичный для Python

Сначала просто беги 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, вы можете использовать подстановочный знак, *например:

$ dpkg -l 'python*'

Это напечатает много строк с пакетами.

Йорген
источник
Хороший ответ, но скрипт выше работает. Я был просто обеспокоен отказом в
выдаче
Большинство из нас просто перенаправляют stderr во временный файл. Случается много операций типа сканирования.
mckenzm