Pertanyaan Mengapa perintah find meledak di / run /?


Saya menggunakan perintah berikut untuk memeriksa versi python yang diberikan oleh jawaban ini. Itu berhasil kecuali untuk satu kesalahan, ditunjukkan di bawah ini. Bisakah ada yang 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

13
2017-10-20 08:16


asal


python --version dan python3 --version untuk menampilkan versi aktif. Kita semua memiliki versi 2.x dan versi 3.x;) - Rinzwind
Dan kesalahannya normal dan bukan masalah dengan perintah. /run/ tidak boleh dimasukkan dalam "temukan". gvfs tidak dimiliki oleh pengguna Anda. - Rinzwind
Anda juga bisa mengetik python di konsol dan tekan tombol tab dua kali, itu akan menunjukkan setiap dieksekusi di jalan Anda mulai dengan python. - Timo
Kesedihan yang bagus, orang-orang. Saya membuat pengeditan yang cukup besar untuk pertanyaan karena beberapa orang tidak berhasil sampai ke paragraf pertama. OP tahu bagaimana menemukan versi yang mana, pertanyaannya adalah mengapa perintah ini (yang menemukan semua versi Python) membuang kesalahan tertentu. Jika Anda ingin memposting tentang python -V dan alternatif, tolong bawa untuk sebuah pertanyaan yang sebenarnya meminta informasi itu. - Oli♦
Menjalankan perintah dalam pertanyaan itu adalah ide yang buruk, ia akan menemukan file apa pun di sistem Anda yang namanya dimulai dengan python dan jalankan sebagai root. Jika pengguna Anda mengetahui bahwa Anda menggunakan perintah ini, maka Anda hanya memberikan mereka root-exploit yang sepele. - Peter Green


Jawaban:


Izin:

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

Jadi hanya pemilik yang telah menjalankan izin (yang memungkinkan direktori untuk dicari). Tapi, kamu menggunakannya sudo dan root memiliki semua izin yang memungkinkan, bukan? Sebenarnya Anda menemukan pengecualian:

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

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

Jika Anda menjalankan find perintah 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 sudo dan menerima saran Gilles:

Jika Anda mencari file hanya pada sistem file lokal, lewati -xdev   mencari.


Cara termudah untuk memeriksa versi python:

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

20
2017-10-20 08:20



Saya hanya memiliki satu pengguna kecuali root lalu siapa yang Anda harapkan untuk memilikinya? - abdul qayyum
Itu Anda, UID 1000. Anda bisa cd ke direktori itu sebagai pengguna normal Anda, tetapi tidak sebagai root. Jika Anda lari find tanpa sudo Anda tidak akan melihat kesalahan itu (tetapi Anda akan mendapatkan kesalahan izin lain tentu saja) - Zanna
@abdulqayyum Apakah Anda yakin? Secara default, ubuntu memiliki beberapa pengguna yang terkait dengan berbagai proses daemon. Jadi ya, mereka tidak dapat masuk dan mereka tidak memiliki direktori home tetapi mereka ada dan dapat memiliki file dan direktori ... - Bakuriu


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

Python Spesifik

Pertama jalankan saja python dan python3 dengan 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 -l akan mencantumkan semua paket Anda, tetapi Anda dapat menentukan paket apa yang Anda cari. Untuk hanya python dan python3 gunakan yang berikut:

$ 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 titit tambahan. Jika Anda ingin menemukan semua paket yang namanya dimulai python, Anda dapat menggunakan karakter wildcard * seperti ini:

$ dpkg -l 'python*'

Itu akan mencetak banyak garis dengan paket.


7
2017-10-20 08:37



Jawaban Bagus 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