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
원래 사례의 절반이 아닌 활성화된 셸에 의해 처리되기 때문입니다.