다음을 사용하여 각 명령을 다른 사용자로 실행할 수 있다는 것을 알고 있습니다.
su -s /bin/bash "command" - user
그러나 실행해야 할 명령이 여러 개 있으며 모든 줄에 su를 추가하는 것보다 더 깔끔한 방법을 찾고 있습니다.
"여기의 모든 명령은 userX로 실행됩니다"라고 말한 다음 "userX로 명령 실행을 중지합니다"라고 말하고 나머지 스크립트는 루트로 계속 실행하려면 어떻게 해야 합니까?
감사해요.
다음은 다른 사용자로 실행하고 싶은 블록입니다(@Jetchisel의 답변을 기반으로 업데이트됨).
#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"
su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info \
/pathto/repo \
|& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}
if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi
위의 방법은 작동하지만 두 가지가 있습니다.
- Borg가 일반적으로 자동으로 가져오는 환경 변수인 $BORG_PASSPHRASE를 전달할 수 없는 것 같습니다. 사용자 간의 권한 문제일 수 있나요?
- info=exit를 올바르게 전달하지 않는 것 같습니다. 테스트에서 Borg가 보존한 에코를 완전히 제거했지만 철자를 "ech"로 잘못 입력하여 실패했습니다. 그러나 그럼에도 불구하고 스크립트는 성공을 보고합니다.
답변1
-c
플래그를 사용해 볼 수 있습니다.
OPTIONS
-c, --command=command
Pass command to the shell with the -c option.
그것은 마치
su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'
또는 명령을 구분하는 대신 새 줄을 사용하십시오 ;
.
su - "$user" -s /bin/bash -c '
command1
command2
command3
...
'
작은따옴표로 명령을 인용해야 하는 경우 인용문을 처리하면 됩니다.
답변2
Bash 스크립트에서 함수를 사용할 수 있으며조판이를 쉽게 달성할 수 있습니다.
#!/bin/bash
function1 () {
echo "this is function1"
}
function2 () {
echo "this is function2"
}
su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2
exit 0
이 기능에 실행하려는 명령을 넣으면 해당 사용자가 해당 명령을 모두 실행합니다.
노트:비밀번호 문제를 쉽게 피하기 위해 스크립트를 루트로 실행합니다.
sudo su -c ./script.sh
답변3
잘. 저는 스택교환을 처음 사용합니다. 그렇지 않으면 이것은 답변이 아닌 의견이 될 것입니다. 댓글을 달 대표가 없습니다. 그럼 여러분. 나에게 편하게 대해주세요! su 대신 ssh를 사용하는 것이 좋습니다. 루트 및 백업 사용자가 공통 기본 UNIX 그룹을 공유하도록 하는 것이 좋습니다.
- SSH를 사용하면 백업 사용자 비밀번호를 변경할 수 있으며 스크립트는 계속 작동합니다.
- 개념 증명 분석 후 공유 그룹을 사용하는 경우 루트 이외의 계정이 스크립트를 소유하고 실행할 수 있는 솔루션으로 마이그레이션할 수 있습니다. 이것의 장점은 루트 비밀번호를 공유할 필요가 없다는 것입니다.
- ssh 명령에 환경 변수를 전달할 수 있습니다. 예: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"