쉘 스크립트를 실행할 때 사용자에게 루트로 로그인하도록 프롬프트


17

내가 겪고있는 문제는 명령을 입력하면

su - root

쉘 스크립트 파일의 시작 부분에서 사용자에게 비밀번호를 입력하라는 프롬프트를 표시 한 후 나머지 쉘 스크립트를 계속 하지 않습니다 . 그런 다음 터미널을 통해 셸 스크립트를 수동으로 찾아서 실행해야합니다. 스크립트가 사용자가 루트로 로그인했는지 확인한 다음 나머지 쉘 스크립트를 계속 진행하고 싶습니다.

다시 말해서 스크립트를 다른 사용자로 실행하고 싶지만 스크립트가 실행 되 자마자 사용자는 루트로 변경 한 다음 스크립트가 끝날 때까지 루트로 나머지 스크립트를 계속 사용해야합니다. 이것을 할 수 있습니까?

답변:


34

이것은 달성하기가 매우 쉽습니다.

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

현재 사용자가 루트가 아닌 경우를 통해 스크립트를 다시 실행하십시오 sudo.

sudo여기서 대신을 사용하고 있습니다 su. 인수를 보존 할 수 있기 때문입니다. 을 사용 하면 공백이나 특수 쉘 문자가있는 경우 인수를 엉망 su으로 su -c "$0 $@"만드는 명령이 있어야합니다 .

쉘이 bash이면 외부 호출을 피할 수 있습니다 whoami.

(( EUID != 0 )) && exec sudo -- "$0" "$@"

죄송합니다. 설명에 오류가있어 잘못 해석되었을 수 있습니다. 더 명확한 설명이 있습니다. 도와 주셔서 감사합니다!
레드 슨

@ user68857 질문이 분명했습니다. 이 답변은 원하는 것을 정확하게 수행합니다.
Patrick

이 오류가 계속 발생합니다. sudo : setuid root 여야합니다
Redson

터미널을 통해 일반 사용자로 스크립트를 실행하고 싶지만 스크립트가 끝날 때까지 사용자를 루트로 전환해야합니다
Redson

@Nosscire 당신이 얻는다면 sudo: must be setuid root, sudo에 무슨 일이 생겼습니다. 수정하려면 : chmod u+s $(which sudo). 그리고 네, 당신이하려는 일을 잘 알고 있습니다. 내 스크립트에서 항상 똑같은 일을합니다.
Patrick

7

UID도 확인할 수 있습니다.

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi

5

스크립트 자체를 호출하고 다음을 확인할 수 있습니다.

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

로그인하려는 지점에서 다음 명령을 추가하십시오.

sudo su

이것은 내 코드와 완벽하게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.