다음을 사용하여 각 명령을 다른 사용자로 실행할 수 있다는 것을 알고 있습니다.
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"