[Linux] ssh나 다른 데몬에서 sudo -u 를 이용해 다른 유저권한으로 실행시 sudo: sorry, you must have a tty to run sudo 오류 해결
Linux 2020. 11. 16. 15:08
특정 데몬을 실행시키는 아래와 같은 스크립트가 있다고 가정.
#!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 &"
'Linux' 카테고리의 다른 글
[Linux] curl 응답시간 측정 (how to measure curl response time) (0) | 2022.04.06 |
---|---|
[Linux] tar gzip/xz/bzip2 압축해제 진행률 퍼센트 표시 (print/display tar gzip/xz/bzip2 unpack/decompress progress percent) (0) | 2021.05.25 |
[Linux] shell script 파일 주석을 그대로 도움말로 사용하기 (0) | 2020.07.08 |
[Linux] shell script 작성시 sed 치환패턴 문자열 escapse (0) | 2020.07.08 |
[Linux] 파일명 일괄변경 (0) | 2020.05.27 |