Program Club

일부 명령은 수퍼 유저로 실행하고 일부 명령은 수퍼 유저로 실행하지 않고 실행하는 쉘 스크립트를 작성하는 방법은 무엇입니까?

proclub 2020. 12. 31. 22:18
반응형

일부 명령은 수퍼 유저로 실행하고 일부 명령은 수퍼 유저로 실행하지 않고 실행하는 쉘 스크립트를 작성하는 방법은 무엇입니까?


일련의 명령을 자동화하는 쉘 스크립트를 작성하고 싶습니다. 문제는 일부 명령은 수퍼 유저로 실행해야하고 일부 명령은 수퍼 유저로 실행하면 안된다는 것입니다. 지금까지 내가 한 일은 다음과 같습니다.

#!/bin/bash

command1
sudo command2
command3
sudo command4

문제는 누군가가 command1이 완료 될 때까지 기다려야 암호를 입력하라는 메시지가 표시되고, command3이 충분히 오래 걸리면 command3이 완료 될 때까지 기다려야한다는 것입니다. 그 사람이 일어나서 걸어 갔다가 한 시간 후에 돌아와서 끝낼 수 있다면 좋을 것입니다. 예를 들어, 다음 스크립트에는이 문제가 있습니다.

#!/bin/bash

sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"

사용자가 처음에 비밀번호를 한 번만 입력 한 다음 자리를 비울 수 있도록하려면 어떻게해야합니까?

최신 정보:

응답 해 주셔서 감사합니다. 저는 Mac OS X Lion에서 실행 중이고 Stephen P의 스크립트를 실행했으며 다른 결과를 얻었습니다. ($ HOME도 추가했습니다)

pair@abbey scratch$ ./test2.sh
uid is 501
user is pair
username is 
home directory is /Users/pair
pair@abbey scratch$ sudo ./test2.sh 
Password:
uid is 0
user is root
username is root
home directory is /Users/pair

파일 sutest

#!/bin/bash
echo "uid is ${UID}"
echo "user is ${USER}"
echo "username is ${USERNAME}"

그것을 실행하십시오 :`./sutest '는 나에게 준다.

uid is 500
user is stephenp
username is stephenp

그러나 sudo 사용 : sudo ./sutest제공

uid is 0
user is root
username is stephenp

따라서 sudo로 실행할 때 $ USERNAME의 원래 사용자 이름을 유지합니다. 이것은 다른 사람들이 게시 한 것과 유사한 솔루션으로 이어집니다.

#!/bin/bash
sudo -u ${USERNAME} normal_command_1
root_command_1
root_command_2
sudo -u ${USERNAME} normal_command_2
# etc.

처음에 스크립트를 호출하려면 sudo 만하면됩니다. 비밀번호를 입력하라는 메시지가 한 번 표시됩니다.


나는 원래이 답변을 Linux에서 작성했는데 OS X와 ​​약간의 차이가 있습니다.

OS X (Mountain Lion 10.8.3에서 테스트 SUDO_USER 중임 )에는 sudo를 실행할 때 환경 변수 가 있습니다.이 변수 는 위의 대신 사용할 수 있습니다 USERNAME. 또는 스크립트가 SUDO_USER인지 확인할 수있는 크로스 플랫폼이 될 수 있습니다. 설정된 경우 사용하거나 설정된 경우 USERNAME을 사용합니다.

OS X의 원본 스크립트를 변경하면 ...

#!/bin/bash
sudo -u ${SUDO_USER} normal_command_1
root_command_1
root_command_2
sudo -u ${SUDO_USER} normal_command_2
# etc.

크로스 플랫폼으로 만드는 첫 번째 찌르는 것은 ...

#!/bin/bash
#
# set "THE_USER" to SUDO_USER if that's set,
#  else set it to USERNAME if THAT is set,
#   else set it to the string "unknown"
# should probably then test to see if it's "unknown"
#
THE_USER=${SUDO_USER:-${USERNAME:-unknown}}

sudo -u ${THE_USER} normal_command_1
root_command_1
root_command_2
sudo -u ${THE_USER} normal_command_2
# etc.

전체 스크립트를 수퍼 유저로 실행해야합니다. 수퍼 유저가 아닌 사용자로 일부 명령을 실행하려면 sudo의 "-u"옵션을 사용하십시오.

#!/bin/bash

sudo -u username command1
command2
sudo -u username command3
command4

루트로 실행할 때 sudo는 암호를 묻지 않습니다.


이것을 사용하는 경우도 확인하십시오 man sudo.

#!/bin/bash

sudo echo "Hi, I'm root"

sudo -u nobody echo "I'm nobody"

sudo -u 1000 touch /test_user

글쎄, 몇 가지 옵션이 있습니다.

암호를 묻지 않도록 sudo를 구성 할 수 있습니다. 보안 위험으로 인해 권장되지 않습니다.

암호를 읽고 필요할 때 sudo에 제공하는 expect 스크립트를 작성할 수 있지만 이는 투박하고 취약합니다.

필요하지 않을 때마다 루트로 실행하고 권한을 삭제하도록 스크립트를 디자인하는 것이 좋습니다. sudo -u someotheruser command루트가 필요하지 않은 명령을 위해 간단하게 사용하십시오 .

(If they have to run specifically as the user invoking the script, then you could have the script save the uid and invoke a second script via sudo with the id as an argument, so it knows who to su to..)

ReferenceURL : https://stackoverflow.com/questions/10220019/how-to-write-a-shell-script-that-runs-some-commands-as-superuser-and-some-comman

반응형