모든 사용자 로그인에서 루트로 프로세스를 시작하고 싶습니다. 이 외에도 동기는 프로세스가 특정 사용자 폴더의 암호화된 홈 폴더에서 실행된다는 것입니다.
이 목표를 어떻게 달성할 수 있나요?
답변1
시스템에서 다음을 사용하는 경우폴리아크릴아미드(대부분) 당신은 사용할 수 있습니다pam_exec
스택의 모듈 session
. 명령이 완료될 때까지 사용자는 로그인되지 않습니다. 백그라운드에서 무언가를 실행하려면 이를 분기하십시오. 일부환경 변수세션에 대한 정보를 제공합니다. 예를 들어:
session optional pam_exec.so seteuid /usr/local/sbin/my-login-process
다음 /usr/local/sbin/my-login-process
과 같은 내용이 포함되어 있습니다.
#!/bin/sh
{
exec 2>&1 >>"/var/log/my-root-service/$PAM_USER.log"
echo "$PAM_USER logged in on $PAM_TTY on $PAM_RHOST at $(date)"
do-something
} &
답변2
/etc/sudoers
파일 에 다음 줄을 추가합니다(단축키 visudo).
Cmnd_Alias CMDNAME = /path/to/binaryOrscriptToBeRunAsRoot
%groupnamehere ALL=NOPASSWD: CMDNAME
사용자 이름만 사용하는 대신 CMDNAME 그룹을 생성하면 해당 그룹의 모든 사용자가 해당 권한을 갖습니다.
groupadd groupnamehere
usermod -G groupnamehere usertoaddtogrouphere
이를 테스트하려면 사용자가 되어 다음 명령을 실행하십시오.
- 사용자 되기 => su - 사용자 이름여기
- 그룹 사용자가 => 그룹에 있는지 확인하세요.
- 명령 실행 => sudo CMDNAME 재시작
- 전역 명령이 아닌 경우 => sudo /path/to/binaryOrScript arg를 실행하세요.
예는 다음과 같습니다:
/etc/sudoers
Cmnd_Alias TESTME = /usr/local/bin/testme.sh
%cmdgroup ALL=NOPASSWD: TESTME
/usr/local/bin/testme.sh
#!/bin/sh
#netstat can only be run by root on my servers.
#File permissions are 'chmod 700'
netstat -tln |grep :80
/etc/구성 파일
# You need to change 'testme' in the boundry to match the groupname created
# This checks to see if the user who just logged is part of that cmdgroup,
# if so, it runs whatever is inside.
username=`id -un`
if groups $username | grep &>/dev/null '\btestme\b'; then
sudo /usr/local/bin/testme.sh
fi
이 그룹의 사용자로 로그인하여 다음을 확인하세요.
[nonrootuser ~]#
tcp 0 0 :::80 :::* LISTEN