다른 사용자가 alias 명령을 실행하지 못한 경우

다른 사용자가 alias 명령을 실행하지 못한 경우

내가 여기서 뭘 잘못하고 있는지 잘 모르겠습니다.

User2는 환경별 별칭을 설정하기 위해 자신의 .bash_profile에서 파일을 가져옵니다.

# .bash_profile
source $HOME/set_environment_shortcuts

$HOME/set_environment_shortcuts에 있습니다(여기에는 많은 별칭이 있습니다). 예:

alias startservices="verylongcommand"

이제 "다른 사용자로부터 서비스를 시작"하고 싶습니다.

[User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

runuser 명령은 동일한 결과를 생성합니다.

[User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

별칭이 이런 식으로 작동할 수 없나요?

이 명령은 별칭이 완전히 무시될 때 작동합니다.

답변1

쉘이 비대화형인 경우 expand_aliases쉘 옵션을 설정하는 데 사용되지 않는 한 별칭은 확장되지 않습니다 shopt -s expand_aliases.

Alias는 대화형 사용을 위한 단축 도구입니다. 모든 종류의 스크립트에는 대신 셸 함수를 사용하세요.

startservices () {
    # commands go here
}

쉘 함수는 여러 면에서 별칭보다 훨씬 더 유연합니다. 우선, 쉘 스크립트와 같은 매개변수를 허용합니다.

startservices () {
    user="$1"
    service="$2"
    # code to start service "$service" as user "$user"
}

다른 사용자의 소스를 명시적으로 가져올 필요는 없습니다 .bash_profile. 대신 사용하십시오 sudo -i. 그러면 .bash_profile시작 시 다음과 같은 로그인 셸이 시작됩니다 .

$ sudo -i -u User2 startservices

이는 startservices스크립트나 기타 외부 유틸리티, 셸 시작 파일 $PATH에 정의된 셸 함수 User2또는 셸 시작 파일에 정의된 별칭이어야 합니다 User2(셸을 실행하려면 set 사용).expand_aliasesUser2

당신은 또한 볼 수 있습니다sudo su를 실행해야 할 이유가 있나요?

답변2

별칭은 user1의 .bash_profile에 정의되어 있습니다. "su -l user2"를 사용하면 실제로 user1의 모든 환경 변수가 지워지고 "startservices" 별칭이 정의되지 않은 user2의 변수가 로드됩니다.

"su -p" 옵션을 사용하여 현재 환경을 보존할 수 있지만 이 경우 user2는 user1의 .bashrc 파일에 대한 읽기 권한이 있어야 합니다.

관련 정보