루트로 실행되는 BASH 스크립트, 다른 사용자로 실행되는 명령을 그룹화하는 깔끔한 방법?

루트로 실행되는 BASH 스크립트, 다른 사용자로 실행되는 명령을 그룹화하는 깔끔한 방법?

다음을 사용하여 각 명령을 다른 사용자로 실행할 수 있다는 것을 알고 있습니다.

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

위의 내용은 작동하지만 두 가지 사항에 대해 작동합니다.

  1. Borg가 일반적으로 자동으로 선택하는 환경 변수인 $BORG_PASSPHRASE를 전달할 수 없는 것 같습니다. 사용자 간의 권한 문제일까요?
  2. 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 그룹을 공유하도록 하는 것이 좋습니다.

  1. SSH를 사용하면 백업 사용자 비밀번호가 변경될 수 있으며 스크립트는 계속 작동합니다.
  2. 나중에 개념 증명 분석 후 공유 그룹을 사용하는 경우 루트 이외의 계정이 스크립트를 소유하고 실행할 수 있는 솔루션으로 마이그레이션할 수 있습니다. 이는 루트 비밀번호를 공유하지 않아도 되도록 만들 수 있다는 장점이 있습니다.
  3. ssh 명령에 환경 변수를 전달할 수 있습니다... 예: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

관련 정보