내가 여기서 뭘 잘못하고 있는지 잘 모르겠습니다.
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_aliases
User2
당신은 또한 볼 수 있습니다sudo su를 실행해야 할 이유가 있나요?
답변2
별칭은 user1의 .bash_profile에 정의되어 있습니다. "su -l user2"를 사용하면 실제로 user1의 모든 환경 변수가 지워지고 "startservices" 별칭이 정의되지 않은 user2의 변수가 로드됩니다.
"su -p" 옵션을 사용하여 현재 환경을 보존할 수 있지만 이 경우 user2는 user1의 .bashrc 파일에 대한 읽기 권한이 있어야 합니다.