2012-07-24 4 views
12

특정 명령을 실행하고 루트로 변경하여 나머지 스크립트를 실행하려면 비 루트 사용자 계정이 필요한 쉘 스크립트가 있습니다. SUSE11을 사용하고 있습니다. 나는 암호 프롬프트를 자동화하기 위해 expect를 사용했다. 그러나 spawn su - 을 사용하고 명령이 실행되면 프롬프트가 루트로 돌아오고 나머지 스크립트는 실행되지 않습니다.쉘 스크립트 내에서 루트 사용자로 변경

예 :

< non-root commands> 
spawn su - 
<root commands> 

su - 프롬프트는 사용자와 함께 root로 되돌아갑니다. 나머지 스크립트 실행 방법.

sudo -S 옵션은 컴퓨터의 IP 주소를 찾는 데 필요한 sudo -S ifconfig 명령을 실행하지 않으므로 도움이되지 않습니다.

나는 이미 이러한 링크를 통과했지만 해결책을 찾을 수 없습니다 : 사전에 Change script directory to user's homedir in a shell script

Changing unix user in a shell script

감사를

답변

15

sudo 여기서 일하지만 당신은 조금 당신에게 스크립트를 변경해야합니다 :

$ cat 1.sh 
id 
sudo -s <<EOF 
echo Now i am root 
id 
echo "yes!" 
EOF 

$ bash 1.sh 
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse) 
Now i am root 
uid=0(root) gid=0(root) groups=0(root) 
yes! 

Ommand를 <<EOF 블록에 넣고 블록을 sudo으로 지정합니다.

원하는 경우 물론 su을 사용할 수 있습니다. 하지만 암호를 입력 할 expect/pexpect을 사용하여 실행해야합니다.

그러나 심지어 자동으로 암호를 입력 (또는 해제로 전환)을 관리 할 수있는 경우이 구성은 작동하지 않을 것입니다 :이 경우 root-command에서

user-command 
su 
root-command 

가 있기 때문이 아니라 루트 권한으로, 사용자와 실행됩니다 su이 완료되면 실행될 것입니다 ( su은 현재 쉘의 uid를 변경하지 않고 새 쉘을 엽니 다).

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

을하지만 지금은 sudo와 같은있다 : 당신은 물론 여기에 같은 트릭을 사용할 수 있습니다.

1

가장 쉬운 방법은 최소한 두 개의 스크립트를 만드는 것입니다.

첫 번째 사용자는 루트 권한으로 두 번째 사용자를 호출해야합니다. 따라서 두 번째 스크립트에서 실행하는 모든 명령은 루트로 실행됩니다. 예를 들어

:

runasroot.sh

sudo su-c'./scriptname.sh' 

scriptname는.sh

apt-get install mysql-server-5.5 

또는 필요한 것.

+0

루트 대신 $ USERNAME2을 (를) 호출 할 수 있다면 어떨까요? 미리 감사드립니다. – raja777m

8

두 번째 스크립트 없이는 쉽게 할 수 있습니다. 이 파일을 파일의 시작 부분에 넣으십시오.

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

그러면 자동으로 루트로 실행됩니다. 물론 이것은 암호를 제공 할 필요없이 sudo su을 사용할 수 있다고 가정합니다. 그러나이 대답의 범위를 벗어납니다. 쉘 스크립트에서 sudo를 사용하는 방법에 대한 다른 질문 중 하나를 참조하십시오.

+0

주의하십시오. ''$ 0 ''[당신이 생각하는 것일 수는 없다] (http://mywiki.wooledge.org/BashFAQ/028). – ELLIOTTCABLE

+1

@ELLIOTTCABLE 흥미 롭습니다.하지만 $ 0은 현재 파일의 경로가 아니라 현재 프로세스를 시작하는 명령이므로 약간 덜 부서지기 쉽습니다. 여전히 좋은 지적이며 매우 도움이되는 링크입니다. – Benubird

+0

암호 프롬프트는'echo $ PASSWORD | sudo -S su -c "$ 0"' – Leathan