나는 sudo를 사용하는 "이유"를 수집하고 기록하기 위해 간단한 스크립트(음, 간단하다고 생각합니다)를 작성하고 있습니다. 내가 찾은 또 다른 기사에 따르면 이 부분은 매우 간단하게 작동합니다(https://community.unix.com/t/sudo-prompt-for-comment-text/265046/4).
그러나 사용자가 명령에 PIPE(|)를 사용하면 내 스크립트가 충돌합니다.
mysudo.sh cat /var/log/syslog | grep -i something
위 명령을 사용하면 스크립트가 효과적으로 파이프에서 일시 중지되고 Enter/Return을 누를 때까지 아무 작업도 수행하지 않습니다. 그런 다음 if 문을 우회하고 빈 커서로 "그곳에 앉아" 있습니다. Enter를 누르면 입력한 sudo 명령이 실행되지만 아무 것도 기록되지 않습니다.
내가 다음과 같은 것을 사용한다면 :
./mysudo.sh ls -lh /var/log/syslog
if 문이 트리거되면 사용자가 GROUP 그룹에 있으면 이유를 묻는 메시지를 표시하고 이벤트를 기록한 다음 sudo 및 명령을 올바르게 실행합니다.
내가 원하는 것은 "mysudo.sh" 뒤의 모든 데이터를 문자열로 캡처한 다음 이를 내 스크립트에서 사용하는 것입니다. 누구든지 이 작업을 수행할 수 있는 방법이 있습니까? 최종 목표는 이제 특정 조건이 충족될 때 이유를 입력해야 한다는 점을 제외하고는 최종 사용자가 래퍼에 대해 전혀 알 수 없도록 이 새 스크립트를 sudo에 심볼릭 링크하는 것입니다. 내 생각은 매개 변수(파이프 뒤에 오는 항목 포함)를 문자열로 캡처하고 두 개의 sudo 줄(및 이유 문자열)을 다음과 같이 변경하는 것이었습니다.
ENTEREDCOMMAND=<the string of arguements, including the pipe and other data> ... sudo ${ENTERETEDCOMMAND}
(이 질문을 예로 들어보세요)
ENTEREDCOMMAND would equal "cat /var/log/syslog | grep -i something" ... sudo ${ENTERETEDCOMMAND}
스크립트는 다음과 같습니다.
어떤 도움이라도 대단히 감사하겠습니다!
logFile=/path/to/log.log
shopt -s nocasematch
clear
GROUP=$(groups | grep -i "GROUP")
if [[ ${GROUP} =~ "GROUP" ]];
then //if user is GROUP capture the reason for sudo, then proceed with sudo
echo '
Enter the reason for executing the command with elevated privileges (include a ticket # is possible): '
read response
echo "$USER" 'executed "'${*}'" at '"$(date)"' with a reason of "'${response}'".' >> $logFile
sudo $*
else
sudo $* //if the user is NOT in the GROUP above, run sudo as normal
fi