为什么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 --versionpython3 --version显示当前版本。我们都有一个2.x版本和一个3.x版本;)
Rinzwind

6
错误是正常现象,而不是命令问题。/run/不应包含在“查找”中。gvfs不属于您的用户。
Rinzwind '16

1
您也可以python在控制台中输入内容,然后按两次Tab键,它将以开头显示路径中的每个可执行文件python
2013年

7
真是的 我对该问题进行了相当大的编辑,因为有些人没有设法使它进入第一段。OP知道如何查找哪个版本,问题在于该命令(查找Python的所有版本)为何会剔除特定错误。如果您想发布关于python -V和的替代方法,请把它带到一个实际征求该信息的问题上
奥利(Oli)

1
在问题中运行命令是一个坏主意,它将在系统上找到名称以python开头的任何文件,并以root身份执行。如果您的用户发现您使用此命令,那么您只需给他们一个琐碎的root-exploit。
彼得·格林

Answers:


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用户外,我只有一个用户,那么您希望拥有该用户?
2016年

1
是您,UID1000。您可以cd以普通用户身份进入该目录,但不能以root用户身份进入。如果没有运行findsudo您将看不到该错误(但您当然会遇到其他权限错误)
Zanna

2
@abdulqayyum确定吗?默认情况下,ubuntu具有与各种守护进程相关联的大量用户。因此,是的,他们无法登录,没有主目录,但它们存在并且可以拥有文件和目录...
Bakuriu

7

有几种方法可以找到您拥有的python版本。您可以通过以下两种方式获得Python 2和Python 3版本:

特定于Python

首先刚运行pythonpython3带有选项--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*'

这将在包装上打印很多行。


很好的答案,但是上面的脚本确实有效。我只是担心拒绝权限
Abdul qayyum

我们大多数人只是将stderr重定向到临时文件。发生许多扫描类型的操作。
mckenzm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.