Mengapa perintah find meledak di / run /?

13

Saya menggunakan perintah berikut untuk memeriksa versi python seperti yang diberikan oleh jawaban ini . Ini berfungsi kecuali untuk satu kesalahan, yang ditunjukkan di bawah ini. Adakah yang bisa menjelaskan mengapa?

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

Kesalahan:

find: ‘/run/user/1000/gvfs’: Permission denied
abdul qayyum
sumber
2
python --versiondan python3 --versionuntuk menampilkan versi aktif. Kita semua memiliki versi 2.x dan versi 3.x;)
Rinzwind
6
Dan kesalahan itu normal dan bukan masalah dengan perintah. /run/seharusnya tidak dimasukkan dalam "find". gvfstidak dimiliki oleh pengguna Anda.
Rinzwind
1
Anda juga dapat mengetik pythondi konsol dan menekan tombol tab dua kali, itu akan menampilkan setiap executable di jalur Anda mulai dengan python.
Timo
7
Astaga, teman-teman. Saya membuat pengeditan yang lumayan untuk pertanyaan karena beberapa orang tidak berhasil sampai ke paragraf pertama. OP tahu bagaimana menemukan versi mana, pertanyaannya adalah mengapa perintah ini (yang menemukan semua versi Python) membuang kesalahan tertentu. Jika Anda ingin memposting tentang python -Vdan alternatifnya, harap ajukan pertanyaan yang sebenarnya meminta informasi itu .
Oli
1
Menjalankan perintah dalam pertanyaan itu adalah ide yang buruk, itu akan menemukan file di sistem Anda yang namanya dimulai dengan python dan jalankan sebagai root . Jika pengguna Anda mengetahui Anda menggunakan perintah ini maka Anda hanya memberi mereka eksploit root yang sepele.
Peter Green

Jawaban:

20

Izin:

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

Jadi hanya pemilik yang memiliki izin pelaksanaan (yang memungkinkan direktori untuk dicari). Tapi, Anda menggunakan sudodan root memiliki semua izin yang memungkinkan, bukan? Sebenarnya Anda menemukan pengecualian:

Jawaban oleh Gilles di Unix dan Linux SE ini menjelaskan mengapa izin ditolak untuk me-root direktori itu, yang merupakan titik mount untuk FUSE:

Mengelola batas-batas kepercayaan dengan filesystem FUSE sulit, karena driver filesystem berjalan sebagai pengguna yang tidak berhak, sebagai lawan dari kode kernel untuk sistem file tradisional. Untuk menghindari komplikasi, secara default, sistem file FUSE hanya dapat diakses oleh pengguna yang menjalankan proses driver. Bahkan root tidak bisa melewati batasan ini.

Jika Anda menjalankan findperintah tanpa sudo(sebagai pengguna Anda sendiri, UID 1000) Anda tidak akan mendapatkan kesalahan itu, karena Anda memiliki direktori, tetapi Anda akan mendapatkan kesalahan izin lainnya, jadi, gunakan sudodan terima saran Gilles:

Jika Anda mencari file hanya pada sistem file lokal, berikan -xdev untuk menemukannya.


Cara termudah untuk memeriksa versi python:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Zanna
sumber
Saya hanya memiliki satu pengguna kecuali root lalu siapa yang Anda harapkan untuk memilikinya?
abdul qayyum
1
Itu Anda, UID 1000. Anda bisa cdke direktori itu sebagai pengguna normal Anda, tetapi tidak sebagai root. Jika Anda menjalankan findtanpa sudoAnda tidak akan melihat kesalahan itu (tetapi tentu saja Anda akan mendapatkan kesalahan izin lainnya)
Zanna
2
@abdulqayyum Anda yakin? Secara default, ubuntu memiliki beberapa pengguna yang terkait dengan berbagai proses daemon. Jadi ya, mereka tidak dapat login dan mereka tidak memiliki direktori home tetapi mereka ada dan dapat memiliki file dan direktori ...
Bakuriu
7

Ada beberapa cara untuk menemukan versi python yang Anda miliki. Berikut adalah dua cara Anda akan mendapatkan versi Python 2 dan Python 3:

Khusus Python

Pertama jalankan pythondan python3dengan opsi--version

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

Ini khusus untuk python, tetapi banyak program lain menggunakan metode serupa.

Umum untuk semua paket / program

Metode yang lebih umum adalah melihat paket apa yang diinstal. dpkg -lakan mencantumkan semua paket Anda, tetapi Anda dapat menentukan paket apa yang Anda cari. Untuk hanya python dan python3 gunakan yang berikut ini:

$ 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 

Sebagai titbit tambahan. Jika Anda ingin menemukan semua paket yang memiliki nama yang dimulai dengan python, Anda dapat menggunakan karakter wildcard *seperti ini:

$ dpkg -l 'python*'

Itu akan mencetak banyak baris dengan paket.

Jorgen
sumber
Jawaban Baik tetapi skrip di atas tidak berfungsi. Saya hanya khawatir tentang penolakan izin
abdul qayyum
Sebagian besar dari kita hanya mengarahkan stderr ke file temp. Terjadi untuk banyak operasi jenis pemindaian.
mckenzm