[unix] 한 라이너의 시작 부분에 “sudo”를 입력하면 나머지 명령에도 적용됩니까?

sudobash에서 한 라이너의 시작 부분에 입력 하면 나머지 명령에도 적용됩니까?

다른 말로하면 다음과 같습니다.

sudo foo | foo2 | foo3

이것과 동등합니다 :

sudo foo | sudo foo2 | sudo foo3



답변

sudo제공된 첫 번째 명령으로 만 실행하고 첫 번째 파이프 이후의 다른 모든 것을 원래 사용자 ID로 실행 한다는 것을 확신시키기 위해이 쓸모없는 명령 체인을 사용하여 볼 수 있습니다.

실시 예 # 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

그런 다음 cat해당 파일을 보면 다음과 같은 사용자 이름이 표시됩니다.

$ cat file{1..3}
root
saml
saml

실시 예 # 2

그러나 서브 쉘을 실행하는 경우 :

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

그런 다음 cat이 파일을 보면 다음과 같은 사용자 이름이 표시됩니다.

$ cat file{4..6}
root
root
root

실시 예 # 3

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를 호출하는 모호한 방법

이것들은 최선의 방법은 아니지만를 사용하여 여러 명령을 실행하는 것을 보았을 수도있는 다른 방법 sudo입니다. 다른 사람들이 반드시 그렇게 할 수 있도록 가르치지 않기 위해서만 여기에 표시 합니다!

방법 # 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

어떻게 작동합니까?

sudo로 인해 큰 따옴표 안에있는 echo 프로그램이 root로 실행되고 있지만 echo 출력을 root 전용 파일로 리디렉션하는 쉘은 여전히 ​​사용자로 실행 중입니다. 현재 쉘은 sudo시작 하기 전에 리디렉션을 수행 합니다.

길 # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

어떻게 작동합니까?

이 메소드는 tee프로그램을 루트 로 실행하고 명령 을 호출 하기 전에 실행 되는 here 문자열 에서 입력을받습니다 .sudotee

길 # 3

# 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)은 명령 문자열을 “백도어”로 실행합니다.

더 있지만 나는 여기서 멈출 것이다. 이것들은 당신이 일을 이해하면 할 수있는 일을 보여주기위한 것이지만, 정크를 함께 묶을 필요는 없기 때문에 코드 실용을 논리적 수준으로 유지하여 다른 사람들이 이해하고 지원할 수 있도록하십시오. 미래에 그들.


답변

아니요, 귀하의 예에서는에 의해서만 foo실행됩니다 sudo. 에스컬레이션 된 권한으로 모든 명령을 실행하려는 경우 쉘을 생성 할 수 있습니다.

sudo sh -c 'foo | foo2 | foo3'


답변