스크립트 내에서 'sudo'명령을 어떻게 실행합니까?


84

패치를 수동으로 수행하려면이 명령을 입력해야합니다

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

09 바로 전에 공간이 있습니다.

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

스크립트 내에서 이것을 어떻게 실행할 수 있습니까?

몇 가지 다른 명령도 있지만 문제가 있습니다.


2
스크립트에 넣으면 문제가 무엇입니까?
Lie Ryan

6
@LieRyan- sudo 비밀번호 -누군가 비밀번호를 입력 하지 않으면 스크립트를 완전히 실행할 수 없습니다.
Wilf

내 시스템은 프롬프트없이 잘 실행합니다. 2017 년 10 월 Ubuntu 16.04 sudoers. 설정 이 엉망 입니다. 별거 아냐 그냥 수정하면됩니다.
SDsolar

1
@SDsolar 귀하의 시스템 엉망 사람입니다; 암호를 묻지 않는 사소한 보안 취약점입니다 (사용자는 일부 유형의 사회 공학 공격에 더 취약합니다).
wizzwizz4

답변:


107

sudo내부 스크립트 를 갖는 것은 좋은 생각이 아닙니다. 대신 sudo스크립트에서를 제거 하고 다음을 사용하여 스크립트 자체를 실행하십시오 sudo.

sudo myscript.sh

이렇게하면 스크립트 내의 모든 명령이 루트 권한으로 실행되며 스크립트를 시작할 때 암호를 한 번만 제공하면됩니다. 스크립트 내에서 특정 명령을 sudo권한 없이 실행하려면 Lie Ryan 덕분에 일반 사용자로 실행할 수 있습니다 .

sudo -u username command 

공백은 관련이 없으며 아무 것도 영향을 미치지 않아야합니다 . 명령과 인수 사이에는 항상 공백이 있습니다.


30
스크립트에 루트 권한이 필요없는 명령이있을 수 있습니다. sudo -u username을 사용하여 해당 명령에 대한 루트 권한을 일시적으로 삭제할 수 있습니다.
Lie Ryan

48
내가 작성한 많은 스크립트는 많은 사용자 상호 작용 및 / 또는 오류 검사를 수행합니다. 그런 다음 rsync와 같은 끝에 하나의 명령을 루트로 실행해야합니다. 전체 실행을 높이고 왜 하나 또는 몇 개의 명령 만 해당 액세스를 필요로 할 때 루트 액세스와 관련된 심각한 오류 또는 취약점을 포함 할 수있는 많은 코드 줄에 공개하려고합니까?
Joe

2
@ 조 공정한. "좋은 아이디어는 절대로"변경했습니다.
terdon

10
@Joe는 여기에 정말 좋은 지적이 있습니다. 또한 그렇게하지 않으면 , 왜 그런지, 적어도 어떤 맥락에서 그렇게하지 말아야하는지, 왜 그런지 정확히 아는 것이 좋을 것입니다.
arainone

10
@terdon 듣고 있지 않습니다. 당신이 경우 알고 루트로 스크립트를 실행 은 sudo를위한 메시지를 표시하지 않습니다. 루트로 필요한 스크립트를 루트로 실행하지 않고 스크립트sudo 에서 명시 적으로 호출 하는 것과 비교하고 있습니다. 루트로 필요한 소수의 좁은 작업 만있는 경우 전체 스크립트를 루트로 올리는 것은 끔찍한 아이디어 일 수 있습니다. 그 맥락에서 나는 당신의 의견에 특별히 응답했습니다. "거의 말입니다. 이는 요청 될 때마다 암호를 입력해야하기 때문에 스크립트를 자동으로 실행할 수 없다는 것을 의미합니다."
BeeOnRope

41

sudoers파일을 수정했을 수도 있습니다.

를 실행하십시오 sudo visudo.

비밀번호를 요구하지 않고 실행하려는 사용자 이름 및 스크립트에 대한 항목을 추가하십시오.

username ALL=(ALL) NOPASSWD: /path/to/script

2
나를 위해 일하지 않았지만 감사합니다. 아마도 구문이 잘못되었을 것입니다.
Chris K

5
아무도 언급하지 않았지만 sudoers파일 을 편집 한 후에는 해당 사용자의 모든 로그인 세션을 종료해야 합니다.
escape-llc

1
여기서 명확히하기 위해 sudoers 파일에 지정해야하는 "sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql"줄이 포함 된 스크립트가 아니라 playback_delete_data_patch.sh 스크립트 또는 사용자 및 / 또는 해당 사용자가 원하는 다른 명령 비밀번호를 지정하지 않고 sudo를 실행할 수있는 스크립트
MttJocy

19

다음과 같은 것을 시도해 볼 수 있습니다.

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

sudoer 비밀번호를 일반 텍스트로 작성하기 때문에 가장 안전한 방법은 아닙니다. 좀 더 안전하게 만들기 위해 변수를 만들고 sudo 암호를 변수로 읽은 다음 명령을 다음과 같이 실행할 수 있습니다.

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

또한 루트로 실행되는 모든 명령이 마음에 들지 않으면 sudo앞에서 제안한 것처럼을 사용하여 스크립트를 간단하게 실행할 수 있습니다 .

sudo ./myscript

변수에 암호를 안전하게 읽기 :read -s PASSWORD
Tobias Uhmann

10

이 답변은 terdon의 답변 과 비슷합니다 . 또한 sudo스크립트 실행 중에 사용자 암호를 묻지 않고 스크립트를 실행할 수 있도록 기본 스크립트를 실행하는 것이 좋습니다 .

그러나 일부 명령에 대한 루트 권한을 삭제하고을 사용하여 명령을 호출 한 실제 사용자로 실행하려는 sudo경우 $SUDO_USER변수를 확인 하여 원래 사용자를 파악할 수 있습니다 .

다음은이를 달성하는 방법에 대한 예제 스크립트입니다.

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command

4

실제로이 작업을 수행하는 훨씬 간단한 방법이 있습니다. 이식성을 위해 이것은 나의 구현이지만 필요에 맞게 자유롭게 조작 할 수 있습니다.

스크립트를 시작할 때 sudo 비밀번호를 매개 변수로 입력하고이를 캡처 한 후 sudo 비밀번호를 묻는 프롬프트가 표시되는 각 명령으로이를 에코하십시오.

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

다음과 같이 스크립트가 시작된 후 프롬프트를 추가하고 캡처 할 수 있습니다.

echo "enter the sudo password, please"
read PW

그러나 다른 사람이 노드에서 실행되는 것을 모니터링하는 경우 자신이 만든 로그에 액세스 할 수 있습니다. 또는 테스트를 실행할 때 무작위로 보안 문제가 발생할 수있는 부분을 살펴보아야합니다.

또한 계속하려면 예가 필요한 명령 / 스크립트 실행과 함께 작동합니다.

echo $PW | yes | ./install.sh

에코는 프롬프트에 대한 응답이므로 진행 프롬프트가있는 다른 스크립트를 실행중인 경우 필요한 순서대로 순차적으로 사용할 수 있습니다. 그러나 그 순서 나 나쁜 일이 발생할 수 있음을 알고 있어야합니다.


훨씬 더 우아하고 간단합니다. 스크롤을 끝까지 내 렸습니다. 편집 : 잠깐, 이것은 내 터미널 기록에 암호를 추가합니다
Job

1
사용자 이름을 요청하는 방법 /와 비밀번호 read: ryanstutorials.net/bash-scripting-tutorial/bash-input.php 이 문제를 피해야한다
작업

3
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

0

스크립트를 실행하는 사용자를 sudoers 파일에 추가 할 수 있습니다.

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm

일반적으로 이것은 좋지 않은 방법입니다. NOPASSWD sudo 규칙, 특히 자동화를 실행하는 계정에 대해 NOPASSWD sudo 규칙을 추가하려는 경우 최소한 실행되는 정확한 명령 (모두가 아님)으로 제한해야합니다.
Christopher Hunter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.