답변:
가장 간단한 경우는 다음과 같은 이진 실행 파일 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
실행 파일 을 찾은 사실은 이미 실행 권한이 있음을 나타냅니다.)
which
$PATH
변수에 추가 된 디렉토리 중 하나에있는 파일에 대해서는 명령이 충분해야 합니다. 예를 들어, 일 sudo chmod 700 /bin/nano
또는 sudo chmod 744 nano
원인은 which
어떠한 출력을 생성 없습니다. 로컬 스크립트의 경우 PATH
디렉토리 중 하나 이외의 곳에 ls -l
있거나 stat
호출하면 트릭을 수행합니다. 좋은 답변이지만 게시물에이 정보를 추가하십시오
stat -c '%a' /bin/gzip
것을 사용하십시오 755
.
로 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 -l
는 sudoer가 아니더라도 안전하게 실행할 수 있습니다. 요점은 -l
sudo로 명령을 실행할 수 있는지 여부를 알려줍니다.
당신이 사용할 수있는:
test -x $(command -v shutdown) && echo yes || echo no
command -v shutdown
shutdown
명령 의 경로를 반환합니다 . test -x
해당 경로가 실행 가능한지 확인합니다.
명령을 실행할 수는 있지만 작업을 수행 할 수있는 권한이 없기 때문에 명령이 계속 실패 할 수 있습니다. 이것은 명령을 실행하기 위해 액세스를 제한하는 대신 프로그램이 실제로 수행 할 수있는 작업에 대한 액세스를 제한하는 Unix 유형 시스템의 일반적인 경우입니다.
alias shutdown="shutdown now"
?
$(which shutdown)
나 $(shopt -u expand_aliases && command -v shutdown)
. 이 문제는 대화식 모드에서만 나타납니다.
글쎄, 때때로 조금 어려울 수 있습니다 ...
우선, 권한을 살펴보십시오 ls -l
...
owngrpotr 사용자 그룹 명령 -rwxr-xr-x 루트 빈 vim
/ 마지막 세 번째 삼중는 받았다면 X 거기에, 다음 ( "실행할 수 있습니다") 다른 사람 이 그와 같은 쉘 스크립트 또는 무언가가 있다면, 다음 ... 그것을 실행할 수 있습니다 - 그리고 그 방법 당신은 - 다른 사람이 필요 R을 "( 읽을 수 있습니다 ").
경우 다른 사람이 도착하지 않는 실행-허락하지만 그룹 당신이의 일원 인 경우에, 당신은 그것을 실행할 수 않습니다 (두 번째 삼중) 그룹 - 예에서 이상 함을 . 예를 들어, wheel -group은 종종 누가 실행할 수있는 사람을 제한하는 데 사용되므로이 su
그룹에 속한 사용자 만이를 실행할 수 있습니다. 또 다른 예는 개발자 를 위한 그룹을 만들고 C- 컴파일러 및 이러한 도구의 실행을이 그룹으로 제한하는 것입니다.
마지막 삼중 항 뒤에 후행 + 가 있으면 AccessControllList가 사용됨을 의미합니다. 이는 추가 사용자 및 그룹에 실행 권한을 추가 할 수 있습니다.
+++
명령을 실행할 수 있어도 명령은 액세스 할 수없는 파일, 디렉토리 및 / 또는 장치에 대한 액세스에 따라 달라질 수 있습니다. 이렇게하면 수행 할 수있는 작업이 제한 될 수 있습니다 ( 무엇이든 할 수 있습니다).
마지막으로 명령을 실행할 수는 있지만 명령 자체는 신원을 확인하고 구성 파일에 나열되지 않거나 특정 사용자 (예 : root ) 가 아닌 한 사용을 거부 할 수 있습니다 . 예를 들어이 mount
명령은 루트 만 장치를 마운트 하도록 허용 합니다. 일반 사용자는 / etc / fstab ...에 나열된 장치 만 마운트 할 수 있습니다. 뿌리를 내리지 않고 무언가를 마운트하려고 mount
하면 장치를 불평하고 마운트를 거부합니다. 또 다른 예는 sudo
누구에게나 실행되지만 / etc / sudoers에 나열된 사용자 만 실제로 root 로 항목을 실행할 수 있습니다 .
사용 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
. 다시 한번, 수동 검사없이, 또는 명령을 내리고 결과를 관찰하지 않으면이를 알 수있는 일반적인 방법은 없습니다.
sudo
) 시도 하고 알아내는 것입니다. 텍스트 모드 명령이 필요할 수sudo
있고 그래픽 명령이 필요할 수 있습니다gksudo
. 로 명령이 설치된 위치를 확인할 수도 있습니다which command
./sbin
또는에 있으면/usr/sbin
명령에sudo
또는이 필요할 것으로 예상 할 수 있습니다gksudo
.