특정 데몬을 실행시키는 아래와 같은 스크립트가 있다고 가정.

#!bin/sh

sudo -u USER PATH/TO/FILE 2>&1 &

 

이 스크립트를 다른 서버에서 ssh로 실행시키면 다음과 같은 오류가 발생.

sudo: sorry, you must have a tty to run sudo

 

이건 /etc/sudoers 파일에 정의되어 있는 requiretty 설정 때문.

보안상 필요로 인한 설정으로 tty가 있는 사용자만 sudo를 사용할 수 있음.

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

 

이를 해결하기 위해 ssh 명령어에 -t, -tt 옵션을 붙여 pseudo tty를 지정하여 실행하는 방법이 있으나,

스크립트가 단순한 형태가 아닐 경우 이로 인해 또 꼬이는 문제가 발생할 수 있음.

예를 들어 -tt 옵션으로 pseudo tty를 지정하여 실행했을 때 & 로 실행한 프로세스가 뜨긴 하나, 

ssh 명령어가 끝나는 순간 pseudo tty도 사라져서 daemon으로 뜨지 않고 프로세스가 그냥 죽는다던가 하는 문제.

 

근본적으로 문제를 해결하려면 /etc/sudoers 파일에서 requiretty 설정을 하지 않으면 됨.

# requiretty 설정 자체를 무력화
Defaults !requiretty
# 혹은 그냥 주석처리
#Defaults requiretty
 
 
# 사용자 단위 설정
Defaults:root !requiretty
 
 
# 명령어 단위 설정
Defaults!/path/to/file !requiretty

 

보안을 위한 설정인데 솔직히 실효성이 있는지도 의문인지라 그냥 설정만 저렇게 해버리면 간편한데,

혹여나 서버의 해당 파일에 권한이 없거나 정책문제로 손댈 수 없는 경우 runuser를 사용하는 방법이 있음.

 

아래와 같은 형태로 실행한다면,

sudo -u USER /PATH/TO/FILE 2>&1 &

 

runuser를 사용할 경우 이렇게 하면 됨.

runuser -s /bin/bash -l USER -c "/PATH/TO/FILE 2>&1 &"
Posted by bloodguy
,