findコマンドが/ run /で爆発するのはなぜですか?


13

次のコマンドを使用して、この回答で指定されたpythonバージョンを確認しました。以下に示す1つのエラーを除いて機能します。誰でもその理由を説明できますか?

$ 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/「find」に含めないでください。gvfsユーザーが所有していません。
Rinzwind

1
pythonコンソールに入力してTabキーを2回押すと、パス内のすべての実行可能ファイルが表示されますpython
ティモ

7
良い悲しみ、人々。一部の人々は何とか最初の段落にたどり着かなかったので、私はこの質問に対してかなり多額の編集を行っています。OPはどのバージョンを見つけるかを知っています。問題は、このコマンド(Pythonのすべてのバージョンを見つける)が特定のエラーを追い出す理由です。python -V代替案について投稿したい場合は、実際にその情報を求めている質問にお持ちください
オリ

1
質問内のコマンドを実行するのは悪い考えです。名前がpythonで始まるシステム上のすべてのファイルを検索し、rootとして実行します。ユーザーがこのコマンドを使用していることがわかった場合は、単純なルートエクスプロイトを渡しただけです。
ピーターグリーン

回答:


20

許可:

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

そのため、所有者のみが実行許可を持ちます(これにより、ディレクトリを検索できます)。しかし、あなたは使用しsudo、rootにはすべての可能な許可がありますよね?実際にあなたは例外を見つけました:

UnixおよびLinux SEのGillesによるこの回答は、FUSEのマウントポイントであるそのディレクトリのルートに対する許可が拒否される理由を説明しています。

FUSEファイルシステムで信頼境界を管理することは困難です。ファイルシステムドライバーは、従来のファイルシステムのカーネルコードとは対照的に、特権のないユーザーとして実行されているためです。複雑さを避けるため、デフォルトでは、FUSEファイルシステムにはドライバープロセスを実行しているユーザーのみがアクセスできます。ルートでもこの制限を回避することはできません。

ディレクトリを所有しているので(自分のユーザーUID 1000として)findなしでコマンドを実行すると、sudoそのエラーは表示されませんが、代わりに他のアクセス許可エラーが表示されるので、sudoGillesのアドバイスを使用してください:

ローカルファイルシステムのみでファイルを検索する場合は、-xdevを渡して検索します。


Pythonバージョンをチェックする最も簡単な方法:

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

root以外のユーザーは1人だけですが、それを所有するのは誰ですか?
アブドゥルqayyum

1
UID 1000ですcd。通常のユーザーとしてそのディレクトリにアクセスできますが、rootとしてはできません。あなたが実行するとfindせずにsudo、あなたは(あなたはもちろん、他の権限エラーを取得します)というエラーが表示されません
Zanna

2
@abdulqayyumよろしいですか?デフォルトでは、ubuntuにはさまざまなデーモンプロセスに関連付けられたかなりの数のユーザーがいます。そうです、彼らはありませんログインすることができ、彼らはホームディレクトリを持っていませんが、彼らは存在し、ファイルやディレクトリを所有することができます...
Bakuriu

7

使用しているpythonのバージョンを見つける方法はいくつかあります。Python 2とPython 3の両方のバージョンを取得するには、次の2つの方法があります。

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

これにより、パッケージを含む多くの行が出力されます。


良い答えですが、上記のスクリプトは機能します。私はちょうど許可拒否について心配していた
アブドゥルqayyum

私たちのほとんどは、stderrを一時ファイルにリダイレクトするだけです。多くのスキャンタイプの操作で発生します。
mckenzm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.