Programing

Bash에서 다른 사용자로 명령 그룹을 실행하는 방법은 무엇입니까?

lottogame 2020. 11. 20. 08:26
반응형

Bash에서 다른 사용자로 명령 그룹을 실행하는 방법은 무엇입니까?


다른 사용자로 명령을 실행 하는 방법에 대한 기존 질문 이 이미 여기에 있습니다. 그러나 질문과 대답 은 긴 명령 그룹 대신 단일 명령 에 중점을 둡니다 .

예를 들어, 다음 스크립트를 고려하십시오.

#!/bin/bash
set -e

root_command -p param1  # run as root

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'

여기서 주목해야 할 몇 가지 중요한 사항이 있습니다.

  • 마지막 세 가지 명령을 사용하여 다른 사용자로 실행해야합니다 su또는 sudo. 예제에는 세 개의 명령이 있지만 더 많은 명령이 있다고 가정합니다.

  • 명령 자체는 작은 따옴표와 큰 따옴표를 사용합니다.

위의 두 번째 사항은 다음 구문의 사용을 방지합니다.

su somebody -c "command"

... 명령 자체에 따옴표가 포함되어 있기 때문입니다.

명령을 "그룹화"하고 다른 사용자 계정으로 실행하는 적절한 방법은 무엇입니까?


이 시도:

su somebody <<'EOF'
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
EOF

<<here-doc을 소개합니다 . 다음 토큰은 구분 기호이며 구분 기호로 시작하는 행까지의 모든 것이 명령에 대한 표준 입력으로 제공됩니다. 구분 기호를 작은 따옴표로 묶으면 here-doc 내에서 변수 대체가 방지됩니다.


나는 bash-foo에 그다지 위대하지 않기 때문에 더 우아한 방법이 될 수밖에 없지만 과거에는 여러 스크립트와 "드라이버"를 사용하여이 문제에 접근했습니다.

운전사

#!/bin/bash
set -e

su root script1
su somebody script2

Script1

#!/bin/bash
set -e

root_command -p param1  # run as root

Script2

#!/bin/bash
set -e

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'

이 스크립트는 스크립트를 실행중인 현재 사용자가 원하는 사용자인지 확인합니다. 그렇지 않은 경우 원하는 사용자로 스크립트가 다시 실행됩니다.

#!/usr/bin/env bash

TOKEN_USER_X=TOKEN_USER_X
USER_X=peter # other user!

SCRIPT_PATH=$(readlink -f "$BASH_SOURCE")

if [[ "$@" != "$TOKEN_USER_X" ]]; then

    ###### RUN THIS PART AS the user who started the script

    echo "This script is $SCRIPT_PATH"

    echo -n "Current user: "
    echo $USER

    read -p "insert: "
    echo "got $REPLY"

    su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X)

else
    #TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X

    ###### RUN THIS PART AS USER peter

    echo
    echo "Now this script is $SCRIPT_PATH"

    echo -n "Current user: "
    echo $USER

    read -p "insert: "
    echo "got $REPLY"

    exit 0
fi

echo
echo "Back to initial user..."
echo -n "Current user: "
echo $USER

참고 URL : https://stackoverflow.com/questions/17758235/how-to-execute-a-group-of-commands-as-another-user-in-bash

반응형