특정 명령을 실행할 권한이 있는지 어떻게 알 수 있습니까?


18

일반 사용자로서 명령을 실행할 권리가 있는지 여부를 식별 할 수있는 방법이 있습니까?

예를 들어; 실제로 종료 하기 전에 shutdown 명령 을 실행할 권한이 있는지 확인하고 싶습니다 .

다음 명령과 같은 것

-> doIhaveRightToIssue shutdown
-> Yes/No

4
간단한 방법은 (없이 sudo) 시도 하고 알아내는 것입니다. 텍스트 모드 명령이 필요할 수 sudo있고 그래픽 명령이 필요할 수 있습니다 gksudo. 로 명령이 설치된 위치를 확인할 수도 있습니다 which command. /sbin또는에 있으면 /usr/sbin명령에 sudo또는이 필요할 것으로 예상 할 수 있습니다 gksudo.
sudodus

답변:


26

가장 간단한 경우는 다음과 같은 이진 실행 파일 gzip입니다. 먼저 실행 파일을 찾습니다.

$ which gzip
/bin/gzip

그런 다음이 파일의 속성을 살펴 봅니다.

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

세 x는 파일을 소유자 (첫 번째 root) 또는 그룹의 모든 사람 root(second root)과 다른 사람이 각각 실행할 수 있다고 알려줍니다 . 따라서 사용자는 프로그램을 실행할 수 있습니다.

그러나 실행 파일은 내부의 다른 실행 파일을 호출하는 스크립트 파일 일 수 있습니다. 스크립트를 실행할 수는 있지만 그 안에서 호출 된 프로그램은 실행할 수 없습니다. 실제로 시도하는 것 외에 사용자가 그렇게 할 수 있는지 확인할 방법이 없습니다.

다음과 같은 특별한 경우가 있습니다 shutdown-이것은 실제로라는 핵심 유틸리티에 대한 상징적 링크 systemctl입니다. .

( which명령 정보 :이 명령은 실행이 허용 된 $ PATH에서 실행 파일을 찾고 $ PATH에 동일한 이름을 가진 둘 이상의 이름이있는 경우 사용하는 실행 파일을 알려줍니다. 실행 파일 만 찾지는 않습니다. 사용 권한을 찾을 위치의 예로 여기에서 사용하십시오. which실행 파일 을 찾은 사실은 이미 실행 권한이 있음을 나타냅니다.)


매우 간결한 답변 (+1). 예를 들어, -s 플래그 (sudo apt-get install -s htop)를 사용하여 apt-get install의 결과를 시뮬레이션 할 수 있습니다. 나는 한 문제 전에 명령의 허가를 배울 방법이 없다면 적어도 "시뮬레이션"과 같은 것이 있다고 생각했습니다.
Bernhard Colby

확실히 사용할 수있는 "드라 이런"또는 "시뮬레이션"플래그를 제공하는 유틸리티가 있습니다.
Jos

4
which$PATH변수에 추가 된 디렉토리 중 하나에있는 파일에 대해서는 명령이 충분해야 합니다. 예를 들어, 일 sudo chmod 700 /bin/nano또는 sudo chmod 744 nano원인은 which어떠한 출력을 생성 없습니다. 로컬 스크립트의 경우 PATH디렉토리 중 하나 이외의 곳에 ls -l있거나 stat호출하면 트릭을 수행합니다. 좋은 답변이지만 게시물에이 정보를 추가하십시오
Sergiy Kolodyazhnyy

Serg가 말한 것을 버리고 예를 들어 같은 stat -c '%a' /bin/gzip것을 사용하십시오 755.
AT

21

sudo:

$ sudo -l shutdown
/sbin/shutdown

권한이 없으면 sudo명령을 표시하는 대신 불평합니다.

polkit을 사용하여 실행할 조치를 확인하십시오.

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

관련 조치를 찾는 것은 다른 질문입니다.


sudo의 문제점은 시스템에서 sudoer가 아니라는 것입니다. 그 때문에 명령을 내리기 전에주의를 기울입니다.
Bernhard Colby

4
@BernhardColby sudo -l는 sudoer가 아니더라도 안전하게 실행할 수 있습니다. 요점은 -lsudo로 명령을 실행할 수 있는지 여부를 알려줍니다.
muru

고마워 (+1), 나는 그것을 몰랐다. PC를 구입하자마자 솔루션을 사용해 보겠습니다.
Bernhard Colby

8

당신이 사용할 수있는:

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

command -v shutdownshutdown명령 의 경로를 반환합니다 . test -x해당 경로가 실행 가능한지 확인합니다.

명령을 실행할 수는 있지만 작업을 수행 할 수있는 권한이 없기 때문에 명령이 계속 실패 할 수 있습니다. 이것은 명령을 실행하기 위해 액세스를 제한하는 대신 프로그램이 실제로 수행 할 수있는 작업에 대한 액세스를 제한하는 Unix 유형 시스템의 일반적인 경우입니다.


예를 들어 alias shutdown="shutdown now"?
Dmitry Grigoryev

하나가 사용할 수있는 별칭이 문제를 방지하려면 $(which shutdown)$(shopt -u expand_aliases && command -v shutdown). 이 문제는 대화식 모드에서만 나타납니다.
David Foerster

5

글쎄, 때때로 조금 어려울 수 있습니다 ...

우선, 권한을 살펴보십시오 ls -l...

 owngrpotr 사용자 그룹 명령
-rwxr-xr-x 루트 빈 vim

/ 마지막 세 번째 삼중는 받았다면 X 거기에, 다음 ( "실행할 수 있습니다") 다른 사람 이 그와 같은 쉘 스크립트 또는 무언가가 있다면, 다음 ... 그것을 실행할 수 있습니다 - 그리고 그 방법 당신은 - 다른 사람이 필요 R을 "( 읽을 수 있습니다 ").

경우 다른 사람이 도착하지 않는 실행-허락하지만 그룹 당신이의 일원 인 경우에, 당신은 그것을 실행할 수 않습니다 (두 번째 삼중) 그룹 - 예에서 이상 함을 . 예를 들어, wheel -group은 종종 누가 실행할 수있는 사람을 제한하는 데 사용되므로이 su그룹에 속한 사용자 만이를 실행할 수 있습니다. 또 다른 예는 개발자위한 그룹을 만들고 C- 컴파일러 및 이러한 도구의 실행을이 그룹으로 제한하는 것입니다.

마지막 삼중 항 뒤에 후행 + 가 있으면 AccessControllList가 사용됨을 의미합니다. 이는 추가 사용자 및 그룹에 실행 권한을 추가 할 수 있습니다.

+++

명령을 실행할 수 있어도 명령은 액세스 할 수없는 파일, 디렉토리 및 / 또는 장치에 대한 액세스에 따라 달라질 수 있습니다. 이렇게하면 수행 할 수있는 작업이 제한 될 수 있습니다 ( 무엇이든 할 수 있습니다).

마지막으로 명령을 실행할 수는 있지만 명령 자체는 신원을 확인하고 구성 파일에 나열되지 않거나 특정 사용자 (예 : root ) 가 아닌 한 사용을 거부 할 수 있습니다 . 예를 들어이 mount명령은 루트 만 장치를 마운트 하도록 허용 합니다. 일반 사용자는 / etc / fstab ...에 나열된 장치 만 마운트 할 수 있습니다. 뿌리를 내리지 않고 무언가를 마운트하려고 mount하면 장치를 불평하고 마운트를 거부합니다. 또 다른 예는 sudo누구에게나 실행되지만 / etc / sudoers에 나열된 사용자 만 실제로 root 로 항목을 실행할 수 있습니다 .


3

사용 which, type, command등의 경우 99 %에서 작동하지만 100 %는 당신이 수동에 나열된 모든 실행 디렉토리를 검사해야 할 실제적인 솔루션입니다 $PATH. 을 포함하여 많은 쉘 bash은 명령 앞에 entres를 입력 $PATH하고 성공할 때까지 해당 파일을 반복적으로 실행하려고 시도합니다. 때문에 which실제로 명령을 실행할 수 없습니다 그것은 당신의 쉘 정말 선택되는 파일을 예측하기가 불가능하다.

예를 들어, PATH=/opt/arm/bin:/bin실행 파일을 포함하는 디렉토리가 있지만 아키텍처가 다른 두 개의 디렉토리 가 있다고 가정하십시오 . 해당 항목이 먼저 오기 때문에 Running which dd/opt/arm/bin/dd( 실행 권한이 있다고 가정) 반환 합니다. 그러나 dd쉘에서 실행할 때 실행 이 실패하기 /bin/dd때문에 /opt/arm/bin/dd실행됩니다. 바이너리가 손상되거나 lib가 누락 된 경우에도 동일한 상황이 발생할 수 있습니다. 결국, 시도를 제외하고 명령을 실행할 수 있는지 여부를 알 수있는 확실한 방법은 없습니다.

또 다른 측면은 "권한 보유"를 고려하는 것입니다. 사용자는 실행할 권한이 rm ~/file있지만 사용할 수 없습니다 rm /root/file. 다시 한번, 수동 검사없이, 또는 명령을 내리고 결과를 관찰하지 않으면이를 알 수있는 일반적인 방법은 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.