반응형
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
반응형
'Programing' 카테고리의 다른 글
PHP에서 오류 로그 파일에 쓰는 방법 (0) | 2020.11.20 |
---|---|
Chrome은 Fiddler 루트 인증서를 신뢰하지 않습니다. (0) | 2020.11.20 |
GCC 포함 경로가 무엇인지 확인 (0) | 2020.11.20 |
iTextSharp를 사용하여 HTML을 PDF로 변환하는 방법 (0) | 2020.11.20 |
Docker가 Dockerfile을 빌드 할 때 RUN npm 설치 지침을 캐시하는 방법 (0) | 2020.11.20 |