사용자가 특정 파일의 특정 문자열에 대해 grep(sudo를 통해) 및 grep을 실행할 수 있도록 허용하고 싶습니다. 이 사용자가 모든 파일에 대해 grep을 실행할 수 있도록 허용하고 싶지 않습니다. 사용자에게 파일에 대한 읽기 권한이 없으므로 sudo를 사용해야 합니다. 내 컴퓨터에 있는 다른 서비스의 로그 파일을 grep하기 위해 nagios 검사를 작성하려고 합니다.
하지만 작동하지 않습니다. sudo는 계속 비밀번호를 묻습니다.
sudo grep "string I want (" /var/log/thefilename.log
내 명령은 다음과 같습니다. (예, 문자열에 원시 및 일부 공백이 포함되도록 grep하고 싶습니다 .)(
/etc/sudoers.d/user-can-grep
다음과 같은 것이 있습니다.
user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log
sudoers 파일은 소유자가 소유 root:root
하며 권한이 있습니다.-r--r-----
서버는 Ubuntu 신뢰할 수 있는 14.04.3 LTS입니다.
어떻게 해야 하나요?
답변1
- 스크립트 작성(루트로만 작성 가능)
- 해당 스크립트에서
grep
필요한 작업을 수행하십시오. - sudoers 구성에서는 스크립트에 대한 액세스만 허용합니다.
- 도구를 구성하거나 사용자에게 sudo를 통해 스크립트를 실행하도록 권장
디버깅이 더 쉽고, 특정 파일에 대한 특정 액세스를 잠그기가 더 쉬우며, 악용이 더 어렵습니다.
답변2
분명히 sudo는 명령을 sudoers 파일의 사양과 비교하기 전에 문자열로 병합합니다. 따라서 귀하의 경우에는 따옴표나 다른 형태의 이스케이프를 사용할 필요가 없습니다.
user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log
편집하다: @user23013이 의견에서 지적한 것처럼 이는 모든 파일에서 "내가 원하는 문자열"을 grep하는 데 악용될 수 있습니다. (그리고 확장에 따라 "문자열 I" 및 "문자열"에도 사용할 수 있습니다.) sudo의 매개변수 검사를 고려하십시오. 사용하기 전에 조심스럽게!
또한 다음 호출은 동일합니다. 즉, 사용자를 특정 표현으로 제한할 수 없습니다.
sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log
이는 따옴표와 이스케이프가 쉘에 의해 처리되고 결코 도달하지 않기 때문입니다 sudo
.
답변3
파일에 액세스하려면 루트만 필요하므로 비슷한 것을 사용 cat
하고 실행해야 하는 프로그램 tee
에 파이프하는 것을 고려하십시오. grep
예를 들어, sudo cat /file/path | grep …
이 방법을 사용하면 꼭 필요한 곳으로 루트를 제한할 수 있습니다.
답변4
sudo
훌륭하지만 때로는 가장 적합하지 않은 경우도 있습니다. 이를 위해 나는 상승된 권한을 허용하는 super
.super
super.tab은 다음과 같습니다:
grepcmd "grep 'string I want (' /var/log/thefilename.log" user
로 호출됩니다 super grepcmd
.