Tại sao lệnh find nổ tung trong / run /?


13

Tôi đã sử dụng lệnh sau để kiểm tra các phiên bản python như được đưa ra bởi câu trả lời này . Nó không hoạt động ngoại trừ một lỗi, được hiển thị dưới đây. Có ai có thể giải thích tại sao không?

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

Lỗi:

find: ‘/run/user/1000/gvfs’: Permission denied

2
python --versionpython3 --versionđể hiển thị phiên bản hoạt động. Tất cả chúng ta đều có phiên bản 2.x và phiên bản 3.x;)
Rinzwind

6
Và lỗi là bình thường và không phải là một vấn đề với lệnh. /run/không nên được bao gồm trong "tìm". gvfskhông thuộc sở hữu của người dùng của bạn.
Rinzwind

1
Bạn cũng có thể nhập pythonvào bảng điều khiển và nhấn phím tab hai lần, nó sẽ hiển thị mọi thực thi trong đường dẫn của bạn bắt đầu bằng python.
Timo

7
Tốt đau buồn, mọi người. Tôi đang thực hiện một chỉnh sửa khá lớn cho câu hỏi vì một số người đã không quản lý để thực hiện nó đến đoạn đầu tiên. OP biết cách tìm phiên bản nào, câu hỏi đặt ra là tại sao lệnh này (tìm tất cả các phiên bản của Python) đang phát hiện ra một lỗi cụ thể. Nếu bạn muốn đăng về python -Vvà các lựa chọn thay thế, vui lòng đưa nó đến một câu hỏi thực sự thu hút thông tin đó .
Oli

1
Chạy lệnh trong câu hỏi là một ý tưởng tồi, nó sẽ tìm thấy bất kỳ tệp nào trên hệ thống của bạn có tên bắt đầu bằng python và thực thi nó dưới quyền root . Nếu người dùng của bạn phát hiện ra bạn sử dụng lệnh này thì bạn chỉ cần cung cấp cho họ một công cụ khai thác root tầm thường.
Peter Green

Câu trả lời:


20

Các quyền:

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

Vì vậy, chỉ có chủ sở hữu có quyền thực thi (cho phép tìm kiếm các thư mục). Nhưng, bạn đã sử dụng sudovà root có tất cả các quyền có thể, phải không? Thật ra bạn đã tìm thấy ngoại lệ:

Câu trả lời này của Gilles trên Unix và Linux SE giải thích lý do tại sao quyền bị từ chối đối với thư mục gốc, đó là một điểm gắn kết cho FUSE:

Việc quản lý ranh giới tin cậy với các hệ thống tệp FUSE rất khó khăn, bởi vì trình điều khiển hệ thống tệp đang chạy như một người dùng không có đặc quyền, trái ngược với mã hạt nhân cho các hệ thống tệp truyền thống. Để tránh các sự phức tạp, theo mặc định, hệ thống tập tin FUSE chỉ có thể truy cập đối với người dùng đang chạy quá trình trình điều khiển. Ngay cả root cũng không được bỏ qua hạn chế này.

Nếu bạn chạy findlệnh mà không có sudo(với tư cách là người dùng của chính bạn, UID 1000), bạn sẽ không gặp phải lỗi đó, vì bạn sở hữu thư mục, nhưng bạn sẽ nhận được các lỗi cấp phép khác thay vào đó, vì vậy, hãy sử dụng sudovà nhận lời khuyên của Gilles:

Nếu bạn đang tìm kiếm một tệp trên các hệ thống tệp cục bộ, hãy chuyển -xdev để tìm.


Cách dễ nhất để kiểm tra các phiên bản python:

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

Tôi chỉ có một người dùng ngoại trừ root thì bạn muốn sở hữu nó ở đâu?
abdul qayyum

1
Đó là bạn, UID 1000. Bạn có thể cdvào thư mục đó với tư cách là người dùng bình thường, nhưng không phải là root. Nếu bạn chạy findmà không có sudobạn sẽ không thấy lỗi đó (nhưng dĩ nhiên bạn sẽ gặp các lỗi cấp phép khác)
Zanna

2
@abdulqayyum Bạn có chắc không? Theo mặc định, Ubuntu có khá nhiều người dùng liên quan đến các quy trình trình nền khác nhau. Vì vậy, có, họ không thể đăng nhập và họ không có thư mục chính nhưng họ tồn tại và có thể sở hữu các tệp và thư mục ...
Bakuriu

7

Có một số cách để tìm phiên bản trăn bạn có. Dưới đây là hai cách bạn sẽ nhận được cả hai phiên bản Python 2 và Python 3:

Python cụ thể

Đầu tiên chỉ cần chạy pythonpython3với tùy chọn--version

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

Điều này là cụ thể cho python, nhưng rất nhiều chương trình khác sử dụng một phương pháp tương tự.

Chung cho bất kỳ gói / chương trình

Một phương pháp tổng quát hơn là xem gói nào được cài đặt. dpkg -lsẽ liệt kê tất cả các gói của bạn, nhưng bạn có thể chỉ định những gói bạn đang tìm kiếm. Đối với chỉ python và python3 sử dụng như sau:

$ 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 

Như một chuẩn độ thêm. Nếu bạn muốn tìm tất cả các gói có tên bắt đầu python, bạn có thể sử dụng ký tự đại diện *như thế này:

$ dpkg -l 'python*'

Điều đó sẽ in rất nhiều dòng với các gói.


Trả lời tốt nhưng kịch bản ở trên không hoạt động. Tôi chỉ quan tâm đến việc từ chối cấp phép
abdul qayyum

Hầu hết chúng ta chỉ chuyển hướng stderr đến một tệp tạm thời. Xảy ra cho rất nhiều hoạt động loại quét.
mckenzm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.