답변:
sudo
제공된 첫 번째 명령으로 만 실행하고 첫 번째 파이프 이후의 다른 모든 것을 원래 사용자 ID로 실행 한다는 것을 확신시키기 위해이 쓸모없는 명령 체인을 사용하여 볼 수 있습니다.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
그런 다음 cat
해당 파일을 보면 다음과 같은 사용자 이름이 표시됩니다.
$ cat file{1..3}
root
saml
saml
그러나 서브 쉘을 실행하는 경우 :
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
그런 다음 cat
이 파일을 보면 다음과 같은 사용자 이름이 표시됩니다.
$ cat file{4..6}
root
root
root
의 sudo foo1 | sudo foo2 ...
결과 sudo foo1
는에 피드 되기 때문에 에 대한 귀하의 의견은 효과 가 없습니다 sudo foo2
. 내 whoami
예제를 사용하면 명령 체인이 아무 것도 수행하지 않음을 알 수 있습니다.
$ sudo whoami | sudo whoami | sudo whoami
root
첫 번째는 달렸지만 두 번째와 세 번째는 입력을받을 수 없기 때문에 아무것도하지 않습니다. 오히려 나는 당신이 다음과 같은 것을 쓸 생각이라고 생각합니다.
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
이는 3 가지 명령 프롬프트에서 3 번 실행하는 것과 같습니다. 아니면 이거:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
그러나이 마지막을하지 마십시오. 다음 섹션에 속합니다.
이것들은 최선의 방법은 아니지만를 사용하여 여러 명령을 실행하는 것을 보았을 수도있는 다른 방법 sudo
입니다. 다른 사람들이 반드시 그렇게 할 수 있도록 가르치지 않기 위해서만 여기에 표시 합니다!
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
어떻게 작동합니까?
sudo로 인해 큰 따옴표 안에있는 echo 프로그램이 root로 실행되고 있지만 echo 출력을 root 전용 파일로 리디렉션하는 쉘은 여전히 사용자로 실행 중입니다. 현재 쉘은 sudo
시작 하기 전에 리디렉션을 수행 합니다.
$ sudo tee /proc/sys/vm/drop_caches <<<1
어떻게 작동합니까?
이 메소드는 tee
프로그램을 루트 로 실행하고 명령 을 호출 하기 전에 실행 되는 here 문자열 에서 입력을받습니다 .sudo
tee
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
어떻게 작동합니까?
이것들은 다르게 보일 수 있지만 실제로 같은 일을하고 있습니다. -s
스위치를 사용할 때 sudo
단일 명령을 실행합니다. 탈출 할 방법이 있는지 알아낼 수 없었습니다. 이것들과 같은 것은 효과가 없습니다.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
그러나 매뉴얼 페이지를 보면 -s
스위치는 사용자의 /etc/passwd
파일 입력에 정의 된 셸에 단일 명령을 전달한다고 말합니다 . 따라서 우리는 두 번째 형태의 트릭을 사용합니다. 주로 쉘을 전달합니다. 다른 쉘 ( sh -c
)은 명령 문자열을 "백도어"로 실행합니다.
더 있지만 나는 여기서 멈출 것이다. 이것들은 당신이 일을 이해하면 할 수있는 일을 보여주기위한 것이지만, 정크를 함께 묶을 필요는 없기 때문에 코드 실용을 논리적 수준으로 유지하여 다른 사람들이 이해하고 지원할 수 있도록하십시오. 미래에 그들.