항상 "sudo" 대신 "sudo bash -c"를 사용하는 것이 좋은 생각입니까?

항상 "sudo" 대신 "sudo bash -c"를 사용하는 것이 좋은 생각입니까?

먼저 Debian/Ubuntu 운영 체제에 대해서만 논의하겠습니다. (불쾌하다면 죄송합니다. 저는 이 2개만 알고 있기 때문입니다.)

둘째, sudo 권한만 가진 루트가 아닌 사용자에 대해 이야기하고 있습니다.


sudo 권한으로 명령을 실행하려고 할 때마다 나는 항상 sudo bash -c 'command'sudo를 사용해야 할지 아니면 그냥 sudo만 사용해야 할지 자문합니다 sudo command. 이는 약간 고통스럽습니다.

sudo command예를 들어 어떤 경우에는 직접 작동 하지 않기 때문에sudo echo "smth" >> /etc/privilegedfile

하지만 sudo sh -c "echo 'smth' >> /etc/privilegedfile"or 항상 작동하는 것 같습니다.sudo bash -c "echo 'smth' >> /etc/privilegedfile"

(또는 teeMake It Work와 같은 다른 도구를 사용하십시오.)


그래서 질문은,

sudo bash -c 'command'수행할 수 없고 sudo command수행 만 가능한 상황(예외) 이 있나요 ?

sudo bash -c영원히 대신 사용하는 것이 좋은 생각입니까 sudo?

답변1

sudo bash -c특정 명령을 실행하는 특정 사용자에게 권한을 부여하도록 구성할 수 있다는 것과 는 sudo큰 차이점이 있습니다 . 따라서 특정 값에 대해 실행을 허용 하지만 실행을 허용하지 않는 sudo설정에 있을 수 있습니다 .sudo commandcommandsudo bash

일반적으로 최대한 구체적으로 설명하는 것이 좋으므로 우선순위 sudo command를 정하세요 sudo bash -c command.

답변2

sudo와 함께 사용하면 bash -c단독으로 사용하는 것보다 훨씬 더 위험할 수 있습니다 sudo. 셸에서 명령을 실행하면 셸은 다양한 방식으로 많은 특수 문자를 처리하고 확장합니다. 예를 들어 rm *.txt, 입력 중인 셸(일반적으로 bash)은 *.txt를 .txt로 끝나는 현재 폴더의 파일 목록으로 확장합니다. 단순성과 보안을 위해 sudo 명령은 이 작업을 수행하지 않습니다. 대신, 전달한 인수를 사용하여 명령을 직접 실행합니다. 예를 들어, 셸에서 다음 명령을 실행한다고 가정합니다.

$ file=/etc/passwd
$ sudo vim $file
$ ls *.txt
hello.txt  world.txt
$ sudo rm *.txt

$file첫 번째 줄은 현재 셸에서 sudo 명령을 실행하는 변수를 설정한 sudo vim /etc/passwd다음 모든 텍스트 파일을 나열하고 sudo를 삭제합니다. 쉘은 sudo가 이를 보거나 실행할 기회를 갖기 전에 변수 및 파일 이름 와일드카드를 확장합니다. 마지막 줄에서 sudo가 호출되면 , 및 3개의 매개변수 가 제공되었음을 알 수 있습니다 rm. 그런 다음 사용자 루트로 호출되며 두 개의 매개변수만 사용하고 추가 처리는 없습니다. 예를 들어 주위에 따옴표를 사용하면 sudo는 이를 확인하고 하나의 인수로 명령을 호출합니다 . rm 명령은 이를 문자 그대로 받아들이고 "*.txt"라는 파일을 삭제하려고 시도하지만 해당 파일이 존재하지 않음을 발견합니다. .txt로 끝나는 다른 두 파일도 보지 않습니다. 확장은 쉘에 의해 수행됩니다.hello.txtworld.txtrmsudo rm "*.txt"rm*.txt

요점을 명확하게 설명하자면, 삶을 더 쉽게 만들어 주는 셸의 마법을 제거할 때 위에 나열한 명령은 다음과 같이 변수나 와일드카드 없이 직접 작성해야 합니다.

$ sudo vim /etc/passwd
$ ls hello.txt world.txt
hello.txt  world.txt
$ sudo rm hello.txt world.txt

ls, *.txt를 확장하는 방법을 rm모르 거나 이것이 쉘의 작업입니다. 이제 sudo가 위험할 수 있는 부분을 살펴보겠습니다 . 집에서 이것을 시도하지 마십시오:sudo$filebash -c

$ file=/etc/passwd
$ sudo vim $file
# Take a short break from your computer here...
$ file="/lets/be/malicious; cp /dev/zero /dev/sda"
$ sudo vim $file  # Might see a harmless error here
$ sudo bash -c "vim $file"  # Goodbye hard-drive

이것이 매우 인위적인 예라는 점은 인정해야 하지만, 여기에서 발생할 수 있는 잠재적인 위험을 상상하는 것이 어렵지 않기를 바랍니다. 문제는 이제 루트로 메타 문자를 확장할 수 있는 기능을 쉘에 제공한다는 것입니다. 당신이 없는 동안 누군가가 파일 변수를 수정하고 그 안에 하드 드라이브를 지우는 악의적인 명령을 삽입했다고 가정해 보겠습니다. 이전 구문을 사용하면 sudo vim $file권한이 없는 일반 사용자로 확장되어 실패합니다. 두 번째 사용에서는 $file과 그 안에 포함된 모든 마법을 확장하여 루트로 실행되는 완전한 셸에서 실행됩니다.

관련 정보