제목이 조금 모호한 것으로 알고 있습니다. 우리 문제를 설명해주세요. Debian 기반 시스템이 우리의 주요 핵심이기 때문에 Ubuntu에서 설치 프로그램 스크립트를 설계했지만 일부 클라우드 기반 시스템과 일부 고객은 Debian 기반이 아닌 시스템을 사용합니다. 결과적으로 sudo를 사용한 이후 몇 가지 주요 위치에서 스크립트가 실패했습니다. 우리 질문에 대한 대답은 매우 기본적이라는 것을 알고 있습니다. 몇 가지 일반적인 배포판(CentOS, RHEL, Fedora, Ubuntu, Debian 등)을 지원하기 위해 사용해야 하는 정확한 구문을 모르겠습니다.
글쎄, 그게 문제야. 우리의 스크립트는 소프트웨어의 설치 프로그램입니다. 이 스크립트는 필요한 파일, 서비스 등을 설치합니다. 설치 스크립트는 루트로 실행되어야 하므로 사용자는 루트 콘솔에 있거나 sudo를 사용해야 합니다. 어쨌든 지금까지는 너무 좋았습니다. 스크립트가 끝나면 설치 프로그램은 루트 콘솔을 종료하고 소프트웨어 사용자로 서비스를 시작해야 합니다. 이를 위해 처음 스크립트를 작성할 때 다음을 사용했습니다.
usermod -aG sudo <username> #Put the softwares user in the sudo group
sudo -u <username> service <software> start #Drop to the user and start the service
물론 Debian 기반이 아닌 시스템에 이 스크립트를 배포하려고 하면 CentOS가 sudo를 이해하지 못하기 때문에 스크립트가 실패합니다. 해결 방법은 sudo를 활성화하지 않는 것입니다. 이 기능을 켜거나 끌 수 없는 일부 고객 시스템에서도 이런 일이 발생할 수 있기 때문입니다. 그래서 자연스럽게 저는 이전 su 명령을 사용하여 이 작업을 수행할 수 있는 방법을 찾기 시작했습니다. 다음을 시도했지만 사용자를 변경한 후 즉시 오류가 발생하거나 스크립트에서 종료됩니다.
su <username>
service <software> start
대부분의 Linux 배포판에서 사용할 수 있도록 올바른 구문에 대한 제안 사항이 있습니까?
감사해요
* 갱신 *
나는 다음을 시도했다:
su <username> -c 'service <software> start'
명령은 실행되지만 사용자에게 루트 권한이 없기 때문에 실패합니다. 구체적으로 서비스 명령을 찾을 수 없다고 말합니다(다시 루트 없이도). 그렇다면 위의 sudo 명령이 작동하는 이유는 무엇입니까? 사용자로 실행 중이지만 루트 권한이 있습니까?
답변1
다음 명령을 직접 전달해야 합니다 su
.
su <username> -c 'service <software> start'
해당 줄을 실행하면 su <username>
해당 사용자로 대화형 셸이 시작됩니다.
sudo
서비스 시작을 지정된 사용자로 수행해야 한다는 점은 다소 이상합니다. 더 일반적으로 시작 스크립트는 루트가 또는 에 의지하지 않고도 서비스를 시작할 수 있도록 원하는 사용자로 무엇이든 실행하는 역할을 합니다 su
.
답변2
귀하의 요구 사항은 Ansible의 훌륭한 사용 사례입니다. 이 문제를 해결해 주는 오픈 소스 구성 관리/조정 도구입니다. 에이전트가 없고 SSH를 통해 작동하므로 일반적으로 클라이언트 설정을 수행할 필요가 없습니다.
답변3
당신은 맨페이지를 읽지 않았습니다 su
! 필수 사용자 이름은 항상 끝에 와야 합니다.
su -c 'service <software> start' <username>