왜 루트는 이것을 할 수 있는데 sudo는 할 수 없나요? [복사]

왜 루트는 이것을 할 수 있는데 sudo는 할 수 없나요? [복사]

sudoer나는 소프트웨어 등을 설치하기 위해 항상 사용하는 데비안 컴퓨터에 설정을 가지고 있습니다 . 나는 이 흥미로운 상황에 부딪혔고 그것에 대해 머리를 긁적입니다:

다음 명령을 사용하여 apt에서 멋진 진행률 표시줄을 활성화하려고 합니다.

sudo echo 'Dpkg::Progress-Fancy "1";' > /etc/apt/apt.conf.d/99progressbar

권한 문제가 있습니다:

/etc/apt/apt.conf.d/99progressbar: Permission denied

그러나 su명령을 실행하면 모든 것이 잘 작동합니다.

왜 그럴까요?

답변1

왜냐하면

 sudo cmd > file

로 설명되었다

(sudo cmd) > file

당신의 껍질을 통해. 즉, 리디렉션은 자신의 사용자로 수행됩니다.

이 문제를 해결한 방법은 다음과 같습니다.

cmd | sudo tee file

추가됨: 콘솔에 출력도 표시됩니다. cmd원하지 않는 경우 리디렉션해야 합니다.

답변2

내가 아는 한, 이를 사용할 때 루트 쉘로 실행되어 루트가 소유한 파일을 리디렉션할 수 있게 하는 >것은 쉘 자체의 명령입니다(리디렉션은 루트가 아닌 쉘 자체에 의해 수행됨).su

답변3

sudo명령 부분을 실행하기 때문에 문제가 있습니다. 리디렉션 후에는 sudo더 이상 작동하지 않습니다.

다음을 수행할 수 있습니다.

sudo bash -c "Your commands here > output_file"

따옴표 사이의 명령에서 작은따옴표나 큰따옴표를 사용하는 중첩 순서에 따라 조심스럽게 이스케이프하세요.

편집하다:

좀 더 자세한 설명

스크립트를 실행하면 실제로는 새 하위 셸이 생성되고 스크립트는 해당 하위 셸에서 실행되지만 출력은 현재 셸로 반환됩니다. 이 스크립트를 실행하는 새 하위 쉘은 sudo권한으로 실행되므로 스크립트는 효과적으로 루트로 실행됩니다. 그러나 실행이 완료되면 셸이 종료되고 sudo*pooof*가 발생합니다. 출력은 현재 권한이 없는 쉘로 반환됩니다. 권한 있는 위치에 기록될 것으로 예상하는 경우에는 이런 일이 발생하지 않습니다. 따라서 잘 정의된 쉘 내에서 새 쉘과 전체 엔칠라다를 실행하면 bash이를 달성할 수 있습니다. 왜냐하면 이 시점에서 명령과 출력은 sudo원래 사례의 절반이 아닌 활성화된 셸에 의해 처리되기 때문입니다.

관련 정보