일부 명령은 수퍼 유저로 실행하고 일부 명령은 수퍼 유저로 실행하지 않고 실행하는 쉘 스크립트를 작성하는 방법은 무엇입니까?
일련의 명령을 자동화하는 쉘 스크립트를 작성하고 싶습니다. 문제는 일부 명령은 수퍼 유저로 실행해야하고 일부 명령은 수퍼 유저로 실행하면 안된다는 것입니다. 지금까지 내가 한 일은 다음과 같습니다.
#!/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
'Program Club' 카테고리의 다른 글
| PostgreSQL 증분 백업을위한 최상의 방법 (0) | 2020.12.31 |
|---|---|
| CUDA를 C #으로 코딩 하시겠습니까? (0) | 2020.12.31 |
| 참조 된 종속성을 포함하여 NuGet 패키지 자동 빌드 (0) | 2020.12.31 |
| Entity Framework 6.1 및 MVC 5를 사용하여 데이터베이스에서 Code First를 사용한 후 모델을 동기화하는 방법은 무엇입니까? (0) | 2020.12.31 |
| 솔로 개발자를위한 최고의 연속 통합 설정 (.NET) (0) | 2020.12.31 |