서비스는 기본적으로 root
RHEL 상자에서 부팅 할 때 시작됩니다 . 올바르게 기억한다면 init 스크립트를 사용하는 다른 Linux 배포판에서도 마찬가지입니다 /etc/init.d
.
프로세스를 내가 선택한 (정적) 사용자로 실행하는 가장 좋은 방법은 무엇이라고 생각하십니까?
내가 도착한 유일한 방법은 다음과 같은 것을 사용하는 것입니다.
su my_user -c 'daemon my_cmd &>/dev/null &'
그러나 이것은 조금 어수선한 것 같습니다 …
루트가 아닌 다른 사용자로서 서비스를 자동으로 시작하는 쉬운 메커니즘을 제공하는 약간의 마술이 있습니까?
편집 : 이 인스턴스에서 시작하는 프로세스가 Python 스크립트 또는 Java 프로그램이라고 말해야합니다. 오히려 주변에 네이티브 래퍼를 작성하지 않기 때문에 불행히도 Black이 제안한 대로 setuid () 를 호출 할 수 없습니다 .
답변
데비안 start-stop-daemon
에서는 pid 파일을 처리하고, 사용자를 변경하고, 데몬을 백그라운드로 만드는 유틸리티를 사용합니다 .
나는 RedHat에 익숙하지 않지만, daemon
이미 사용중인 유틸리티 ( /etc/init.d/functions
btw에 정의되어 있음 )는 어디에서나 동등한 것으로 언급 start-stop-daemon
되므로 프로그램의 UID를 변경하거나 수행 방식을 변경할 수 있습니다 이미 올바른 것입니다.
그물을 둘러 보면 사용할 수있는 기성품 래퍼가 몇 가지 있습니다. 일부는 이미 RedHat에 패키지되어있을 수도 있습니다. 한 번 봐 가지고 daemonize
예를 들어,.
답변
여기에있는 모든 제안을 살펴본 후, 제 위치에있는 다른 사람들에게 유용 할 수있는 몇 가지 사항을 발견했습니다.
-
홉 은 나를 다시 지적하는 것이 옳습니다
/etc/init.d/functions
:이
daemon
기능을 통해 이미 다른 사용자를 설정할 수 있습니다.daemon --user=my_user my_cmd &>/dev/null &
이것은 프로세스 호출을 래핑하여 구현합니다
runuser
. -
Jonathan Leffler 가 옳습니다 : Python에는 setuid가 있습니다.
import os os.setuid(501) # UID of my_user is 501
그러나 여전히 JVM 내부에서 setuid를 설정할 수 있다고 생각하지 않습니다.
-
어느 쪽
su
도runuser
정상적으로 당신은 당신이 이미있는 사용자로 명령을 실행하도록 요청 경우를 처리하지 않습니다. 예 :[my_user@my_host]$ id uid=500(my_user) gid=500(my_user) groups=500(my_user) [my_user@my_host]$ su my_user -c "id" Password: # don't want to be prompted! uid=500(my_user) gid=500(my_user) groups=500(my_user)
su
and의 해당 동작을 해결하기 위해 runuser
init 스크립트를 다음과 같이 변경했습니다.
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
도와 주셔서 감사합니다!
답변
- 일부 데몬 (예 : 아파치)은 setuid () 를 호출하여 스스로이를 수행합니다.
- setuid-file 플래그 를 사용하여 다른 사용자로 프로세스를 실행할 수 있습니다 .
- 물론 언급 한 솔루션도 효과가 있습니다.
자신의 데몬을 작성하려면 setuid ()를 호출하는 것이 좋습니다. 이렇게하면 프로세스가
- 루트 권한을 사용하십시오 (예 : 열린 로그 파일, pid 파일 작성).
- 시작하는 동안 특정 지점에서 루트 권한을 삭제하십시오.
답변
주의해야 할 다른 사항을 추가하기 만하면됩니다.
- init.d 스크립트의 Sudo는 tty가 필요하기 때문에 좋지 않습니다 ( “sudo : 죄송합니다. sudo를 실행하려면 tty가 있어야합니다”).
- Java 응용 프로그램을 디먼중인 경우 Java 서비스 랩퍼 (사용자 ID 설정을위한 메커니즘 제공)를 고려할 수 있습니다.
- 또 다른 대안은 su –session-command = [cmd] [user]입니다.
답변
svn 서버용 CENTOS (Red Hat) 가상 머신에서 : /etc/init.d/svnserver
pid를 svn이 쓸 수있는 것으로 변경하도록 편집 되었습니다.
pidfile=${PIDFILE-/home/svn/run/svnserve.pid}
옵션 추가 --user=svn
:
daemon --pidfile=${pidfile} --user=svn $exec $args
원래 pidfile은 /var/run/svnserve.pid
입니다. 데몬은 루트 만 작성할 수있는 becaseu를 시작하지 않았습니다.
These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart
답변
주의해야 할 사항 :
- 언급했듯이 su는 이미 대상 사용자 인 경우 암호를 묻습니다.
- 마찬가지로, 이미 일부 사용자의 경우 대상 사용자 인 경우 setuid (2)가 실패합니다.
- setuid (2)는 /etc/limits.conf(Linux) 또는 / etc / user_attr (Solaris)에 정의 된 권한 또는 자원 제어를 설치하지 않습니다.
- setgid (2) / setuid (2) 경로를 사용하는 경우 initgroups (3)를 호출하는 것을 잊지 마십시오 .
일반적으로 데몬을 시작하기 전에 / sbin / su를 사용하여 적절한 사용자로 전환합니다.
답변
init 스크립트에서 다음을 시도해보십시오.
setuid $USER application_name
그것은 나를 위해 일했다.