Làm thế nào tôi có thể biết nếu tôi có quyền chạy một lệnh cụ thể?


18

Có cách nào để xác định liệu tôi với tư cách là người dùng bình thường có quyền đưa ra lệnh hay không.

Ví dụ; Tôi muốn kiểm tra xem tôi có quyền đưa ra lệnh tắt máy hay không trước khi tôi thực sự phát hành nó.

Một cái gì đó giống như các lệnh sau

-> doIhaveRightToIssue shutdown
-> Yes/No

4
Cách đơn giản là thử (không có sudo) và tìm hiểu. Các lệnh chế độ văn bản có thể cần sudovà các lệnh đồ họa có thể cần gksudo. Bạn cũng có thể kiểm tra nơi lệnh được cài đặt which command. Nếu trong /sbinhoặc /usr/sbin- bạn có thể mong đợi rằng lệnh cần sudohoặc gksudo.
sudodus

Câu trả lời:


26

Trường hợp đơn giản nhất là một thực thi nhị phân như thế nào gzip. Đầu tiên, chúng tôi xác định vị trí thực thi:

$ which gzip
/bin/gzip

Sau đó, chúng tôi xem xét các thuộc tính của tập tin này:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Ba x x cho chúng ta biết rằng tập tin có thể được thực hiện bởi chủ sở hữu (người đầu tiên root) hoặc bất kỳ ai trong nhóm root(thứ hai root) và bất kỳ ai khác, tương ứng. Vì vậy, người dùng của bạn được phép thực hiện chương trình.

Tuy nhiên, tệp thực thi của bạn có thể là tệp tập lệnh gọi các tệp thực thi khác bên trong. Bạn có thể thực thi tập lệnh nhưng không phải các chương trình được gọi bên trong tập lệnh. Không có cách nào để xác định xem người dùng của bạn có được phép làm điều đó không, ngoài việc thực sự dùng thử.

Sau đó, có những trường hợp đặc biệt như shutdown- đây thực sự là một liên kết tượng trưng đến một tiện ích cốt lõi được gọi systemctl, có cơ chế riêng để xác định xem bạn có được phép gọi nó hay không, và hỏi bạn mật khẩu sudo của bạn nếu bạn không, ví dụ .

(Thông tin về các whichlệnh:. Này đặt thực thi trong $ PATH của bạn rằng bạn được phép thực hiện, và cho bạn biết cái nào bạn sử dụng nếu bạn có nhiều hơn một có cùng tên trong $ PATH Nó không xác định vị trí chỉ cần bất kỳ thực thi tôi. sử dụng nó ở đây như một ví dụ về nơi tìm kiếm sự cho phép. Thực tế là việc whichtìm thấy tệp thực thi đã chỉ ra rằng bạn có quyền thực thi nó.)


Câu trả lời rất súc tích (+1). Ví dụ, có thể mô phỏng kết quả của cài đặt apt-get với cờ -s (sudo apt-get install -s htop). Tôi đã nghĩ rằng nếu không có cách nào để học được sự cho phép của một lệnh trước một vấn đề, thì ít nhất có một cái gì đó như "mô phỏng".
Bernhard Colby

Chắc chắn, có những tiện ích cung cấp cờ "chạy khô" hoặc "mô phỏng" mà bạn có thể sử dụng.
Jos

4
whichlệnh phải đủ cho những tệp nằm trong một trong các thư mục được thêm vào $PATHbiến. Ví dụ, làm sudo chmod 700 /bin/nanohoặc sudo chmod 744 nanonguyên nhân whichđể sản xuất không có đầu ra. Đối với các tập lệnh cục bộ, nằm ở một nơi nào đó không phải là một trong các PATHthư mục, ls -lhoặc statcác cuộc gọi sẽ thực hiện thủ thuật. Câu trả lời hay, nhưng vui lòng thêm thông tin này vào bài đăng của bạn
Sergiy Kolodyazhnyy 22/03/2017

Đi ra ngoài những gì Serg nói, sử dụng một cái gì đó như stat -c '%a' /bin/gzipđể lấy 755ví dụ.
TẠI

21

Với sudo:

$ sudo -l shutdown
/sbin/shutdown

Nếu tôi không được phép, sudosẽ khiếu nại thay vì hiển thị lệnh.

Với polkit, bạn kiểm tra hành động bạn muốn chạy:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

Tìm hành động liên quan là một câu hỏi khác nhau.


Vấn đề với sudo là tôi không sudoer trong hệ thống. Do đó, tôi cố gắng cẩn thận trước khi tôi thực sự ra lệnh.
Bernhard Colby

4
@BernhardColby bạn có thể chạy một cách an toàn sudo -lngay cả khi bạn không phải là người sudoer - đó là toàn bộ vấn đề -l- để cho bạn biết liệu bạn có thể chạy lệnh bằng sudo không.
muru

Cảm ơn (+1), tôi không biết điều đó. Tôi sẽ thử giải pháp của bạn ngay khi tôi nhận được máy tính của tôi.
Bernhard Colby

8

Bạn có thể dùng:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdowntrả về đường dẫn đến shutdownlệnh. test -xkiểm tra nếu đường dẫn đó được thực thi cho bạn.

Lưu ý rằng mặc dù bạn có thể thực thi lệnh, lệnh vẫn có thể thất bại vì nó không đủ quyền để thực hiện tác vụ. Đây là trường hợp phổ biến trên các hệ thống kiểu Unix, thay vì hạn chế quyền truy cập để thực thi lệnh, thay vào đó hạn chế quyền truy cập vào các hoạt động mà các chương trình thực sự có thể làm.


Thế còn ví dụ alias shutdown="shutdown now"?
Dmitry Grigoryev

Để tránh vấn đề với bí danh người ta có thể sử dụng $(which shutdown)hoặc $(shopt -u expand_aliases && command -v shutdown). Vấn đề này chỉ xuất hiện trong chế độ tương tác.
David Foerster

5

Chà, đôi khi có thể hơi khó khăn ...

Trước hết, hãy nhìn vào các quyền với ls -l...

 lệnh nhóm người dùng owngrpotr
-rwxr-xr-x gốc bin vim

Nếu bộ ba cuối cùng / thứ ba có x ("có thể thực thi") trong đó, thì bộ ba khác - và điều đó có nghĩa là bạn - có thể thực thi nó ... Nếu đó là tập lệnh shell hoặc thứ gì đó tương tự, thì những người khác sẽ cần r (" cũng có thể đọc ").

Nếu những người khác không có quyền thực thi nhưng nhóm (bộ ba thứ hai) thì bạn có thể thực thi nếu bạn là thành viên của nhóm - trong ví dụ trên, bin . Ví dụ: nhóm bánh xe thường được sử dụng để giới hạn người có thể chạy su, vì vậy chỉ những người dùng thuộc nhóm này mới có thể thực hiện nó. Một ví dụ khác là tạo một nhóm để phát triển ers và hạn chế thực thi trình biên dịch C và các công cụ như vậy đối với nhóm này.

Nếu có dấu + sau bộ ba cuối cùng, điều đó có nghĩa là AccessControllLists được sử dụng - điều này có thể thêm quyền thực thi cho người dùng và nhóm bổ sung.

+++

Ngay cả khi bạn có thể thực thi lệnh, lệnh có thể phụ thuộc vào quyền truy cập vào tệp, thư mục và / hoặc thiết bị mà bạn không có quyền truy cập - điều này có thể hạn chế những gì bạn có thể làm (bạn có thể không thể để làm bất cứ điều gì).

Cuối cùng, mặc dù bạn có thể được phép thực thi một lệnh, nhưng chính lệnh đó có thể kiểm tra danh tính của bạn và từ chối cho phép bạn sử dụng trừ khi bạn được liệt kê trong tệp cấu hình hoặc là một số người dùng nhất định (ví dụ: root ). Ví dụ: mountlệnh sẽ chỉ cho phép root để gắn kết bất kỳ thiết bị nào - người dùng bình thường chỉ được phép gắn các thiết bị được liệt kê như trong / etc / fstab ... có thể không có. Nếu bạn không root và cố gắn cái gì đó, mountsẽ phàn nàn và từ chối gắn thiết bị. Một ví dụ khác là sudo, nó sẽ chạy cho bất kỳ ai, nhưng chỉ những người dùng được liệt kê trong / etc / sudoers mới thực sự được phép chạy mọi thứ với quyền root .


3

Sử dụng which, type, commandvv là một giải pháp thực tế mà sẽ làm việc trong 99% các trường hợp, nhưng phải chắc chắn 100% bạn sẽ phải tự kiểm tra từng thư mục thực thi liệt kê trong của bạn $PATH. Nhiều shell (bao gồm bash) sẽ tiền tố lệnh của bạn với các ký tự từ $PATHvà cố gắng thực hiện các tệp đó nhiều lần cho đến khi chúng thành công. Vì whichkhông thể thực sự thực thi lệnh, nên nó không thể dự đoán tệp nào mà shell của bạn sẽ thực sự chọn.

Ví dụ, hãy tưởng tượng tôi có PATH=/opt/arm/bin:/bin, cả hai thư mục chứa các tệp thực thi, nhưng cho các kiến ​​trúc khác nhau. Chạy which ddsẽ trở lại /opt/arm/bin/dd(giả sử tôi có quyền thực thi nó), vì mục đó đến trước. Tuy nhiên, khi tôi chạy ddtrong shell của mình, /bin/ddsẽ bị thực thi, vì /opt/arm/bin/ddsẽ không chạy được. Tình huống tương tự có thể xảy ra trong trường hợp nhị phân bị hỏng, thiếu lib, v.v ... Cuối cùng, không có cách nào chắc chắn để biết liệu bạn có thể thực thi lệnh hay không, ngoài việc thử.

Một khía cạnh khác là những gì bạn xem xét "có quyền". Là người dùng, tôi có quyền chạy rm ~/filenhưng không được rm /root/file. Một lần nữa, không có cách chung nào để biết rằng không có kiểm tra thủ công, hoặc đưa ra lệnh và quan sát kết quả.

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.