하나의 명령 줄에서 암호로 sudo?


115

바쁜 날에는 달리고 싶습니다

$ ./configure && make && sudo make install && halt

응용 프로그램이 자동으로 설치되기를 바라면서 밤에 잠자리에 들었습니다. 그러나 다음날 내가 보는 것은 sudo가 암호를 묻는 화면입니다. 그렇다면 하나의 명령 줄에서 암호로 sudo를 어떻게 실행할 수 있습니까? 아니면 다른 방법이 있습니까?


halt루트로 실행 해야 합니다.
Keith Thompson

1
하지 않습니다 sudo15 분의 시간 제한이 있습니까? 달리 sudo ls거나 말 하거나 비슷한 것을 할 수 없다면, 비밀번호를 입력 한 다음, 위의 명령을 실행하여 sudo권한이 여전히 활성화되어 있습니까? (현재로서는 테스트 할 수 없습니다. 그렇지 않으면 답변으로 게시하겠습니다.)
Matt

1
제한 시간을 sudo구성 할 수 있습니다. 보안에 민감한 사람들 (일명 나 같은 편집증)은 그것을 0으로 설정했습니다 ... :-)
dda

답변:


173

예, -SSTDIN에서 비밀번호를 읽는 스위치를 사용하십시오 .

$echo <password> | sudo -S <command>

따라서 귀하의 경우 다음과 같이 보일 것입니다.

$./configure && make && echo <password> | sudo -S make install && halt

물론 <password>암호로 바꾸 십시오.


42
다른 사람이 다른 사람이 셸 기록에서 암호를 볼 위험이있는 경우에는 이것을 실행하고 싶지 않을 것입니다.
Brett Daniel

원격 호스트에서 권한있는 명령을 빠르게 실행할 수있는 방법을 찾고 있는데 이는 매우 효과적입니다.
nelaaro

13
'echo <password> | sudo -S '옵션을 사용하면 명령 기록에 비밀번호가 노출되지 않도록 SPACE 문자로 명령을 시작하십시오. 물론 가장 좋은 방법은 보안 파일에서 비밀번호를 파이프하는 것입니다.
Shannon Haworth

$ VARIABLE에 비밀번호가있는 경우 (예를 들어 sops로 프로비저닝 할 수있는 경우)
Natim

9 년 후 여전히 매력처럼 작동합니다 :)
WinEunuuchs2Unix

10

명령 행을 다음과 같이 바꿀 수 있습니다.

$sudo su

$./configure && make && make install && halt

암호를 즉시 입력하라는 메시지가 표시되면 나머지 명령은 수퍼 유저로 실행됩니다.


8
이것의 대체 (그리고 아마도 선호되는) 버전 :sudo sh -c "./configure && make && make install && halt"
quack quixote 3

2
그러나 생성 된 모든 컴파일 파일에 수퍼 유저 권한이있는 것은 아닙니까? 이렇게하면 나중에 ./configure && 일반 사용자로 실행하지 못하게됩니다.
user45909

예, user45909, 당신 말이 맞습니다. 어쨌든 메인 패키지의 업데이트를 다운로드 한 후를 제외하고는 개인적으로 ./configure && make를 다시 실행하지는 않았지만 일반적으로 그렇지는 않습니다.
CarlF

10

다른 솔루션 중 일부는 불필요하게 실행 ./configure되고 make루트로 실행된다는 단점이 있습니다.

이것은 약간 복잡하지만 작동해야합니다.

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

$USER루트가 아닌 쉘에서 확장 할 수 있도록 큰 따옴표를 사용 하십시오.

명령 sleep 60앞에를 추가 할 수도 있습니다 halt. 나는 때때로 명령이 오랫동안 실행될 것으로 예상하면서 이와 같은 일을 해왔지만 무언가 잘못되어 즉시 종료됩니다. 는 sleep시스템이 종료되기 전에 나에게 명령을 죽일 수 있습니다. 또는 shutdown시간 인수와 함께 사용할 수 있습니다 .


9

사용자가 visudo비밀번호없이 make를 sudo로 사용할 수 있도록 sudo를 구성 할 수도 있습니다 .

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

HISTIGNORE를 " sudo -S "로 설정하십시오.

$ export HISTIGNORE='*sudo -S*'

그런 다음 sudo에 안전하게 암호를 전달하십시오.

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE"는이 명령을 기록에 저장하지 않음을 의미합니다. 메모리 또는 "~ / .bash_history"파일의 기록입니다.

예를 들어, 아래는 비밀번호 기록을 유지하지 않고 비밀번호를 sudo 명령으로 안전하게 파이프합니다.

“-S”는 비밀번호에 stdin을 사용하는 것을 의미합니다.

“-k”는 캐시 된 자격 증명을 무시하여 sudo가 항상 요청하도록합니다. 이것은 일관된 동작을위한 것입니다.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

위의 방법의 단점은 나중에 기록에서 실행 한 명령을 보려면 거기에 없을 것이라는 것입니다. 또 다른 방법은 sudo 인증 신임 캐시를 업데이트 한 후 (기본값은 5 분 제한 시간으로 설정 됨) sudo를 별도로 실행하는 것입니다. 그러나 이것의 단점은 5 분 캐시를 알고 있어야한다는 것입니다.

예를 들면 다음과 같습니다.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

참고 기본값은 5 분이므로 sudo 캐시가 업데이트되도록 각 명령 전에 sudo를 실행했습니다. 그렇습니다. whoami는 5 분이 걸리지 않지만 일관성을 위해 각 명령 전에 실행해야 할 수도 있습니다. "export HISTIGNORE = ' sudo -S를 넣을 수도 있습니다.~ / .bashrc 파일에 ' "를 입력 한 다음"로로드하십시오. ~ / .bashrc "또는 로그 오프 한 다음 로그인하십시오. 그러나 스크립팅 목적으로이 스크립트를 사용하려고 생각하므로 최상의 보안을 위해 모든 스크립트의 최상위에 유지하겠습니다."echo ""| sudo -S -v "대신 변수를 사용하는 것이 좋습니다. 루트 권한이 필요한 각 명령 전에 변수를 실행하십시오. Janar의 주석을 참조하십시오."John T "의 주석에는"-k "매개 변수도 포함되어야합니다. "-k"없이 "sudo -S"를 실행하고 sudo 인증 캐시에 이미 자격 증명이 있고 여전히 유효한 sudo 인증 캐시가 5 분인 것처럼 bash는 대신 암호를 명령으로 실행합니다. 나쁜.


1
역사에서 사용할 수없는 것들을 만드는 것에 대한 작은 메모와 마찬가지로, 명령은 그 앞에 하나의 공간으로 실행하십시오. 어떤 이유로 이것은 역사가 그것을 무시하게 만듭니다.
매트 플레처

4

이전 버전의 sudo, 특히 "Sudo 버전 1.6.7p5"에서는이 방법이 작동하지 않습니다.

$ echo "<your_password>" | sudo -S -k whoami

이 방법이 이전 버전과 새 버전에서 작동하는 경우 sudo :

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

이것은 원래 질문에 대한 답변 이 아닙니다 . 작성자의 의견을 비판하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물 에 댓글 수 있으며 평판 이 충분 하면 게시물댓글 수 있습니다 .
DavidPostill

@Darren DeHaven : 여기에서 묻는 질문에 대한 답변이되는 방법을 설명해 주시겠습니까?
Renju Chandran chingath

4

당신도 이것을 할 수 있습니다 :

sudo -S <<< "password" command

이것은 Mac OS에서 나를 위해 작동합니다.
Mehdico

2

더 많은주의를 기울이고 싶다면 스크립트 만 만들고 파일의 권한을 변경하여 루트 만 읽고 편집 한 다음 실행할 수 있습니다.

예 :
1) 파일을 작성하십시오.

gedit ~/.easy.install  

2) 이것을 붙여 넣고 저장하십시오.

./configure && make && echo <password> | sudo -S make install && halt  

3) 실행 가능하게 만드십시오.

sudo chmod +x ~/.easy.install  

4) 루트 만이 파일을 읽고 편집 할 수 있도록 파일의 권한을 변경하십시오.

sudo chmod 700 ~/.easy.install  

5) 실행 :

~/.easy.install  

즐겨 ;-)


echo <password>는 여전히 프로세스 목록에 표시되며 누군가가 정확한 순간에 ps aux를 사용하여 운이 좋으면 암호를 일반 텍스트로 볼 수 있습니다. 암호를 파일에 저장하고 <를 사용하여 파일에서 sudo로 리디렉션하는 것이 좋습니다.
bobpaul

1

sudo가 계정에 비밀번호가 필요 없다는 사실을 누군가가 알게 된 경우 sudo를 설정하는 것은 위험합니다. 당신이하고있는 일을 알지 못한다면 그렇게하지 마십시오. 실험용 컴퓨터가있는 로컬 A + Training 프로그램에서 한 번 이상 발생했습니다 ... -_-

John T.가 말한 내용은 쉘 히스토리에서 비밀번호를 찾을 위험이 있다는 점을 제외하고는 양호하게 들립니다. CarlF의 말이 더 나아 보이지만 하나의 명령이 실패해도 컴퓨터는 여전히 수퍼 유저 권한으로 실행됩니다.


0

개인적으로 나는 John T가 2009 년 11 월 9 일 2시 47 분에 대답 한 것과 똑같은 일을했으며, 그의 대답에 따라 나의 것을 향상 시켰습니다. 감사합니다.

차이점은 변수를 사용하는 경향이 있다는 것입니다.

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

그런 식으로 sudo 대신 내 변수를 쉽게 사용할 수 있습니다.

$AutoSuDo apt-get update;

더 긴 스크립트를 사용하면 매우 편리합니다. 나는 주로 유지해야하는 다른 사람들의 개인용 컴퓨터를 위해 이것들을 사용합니다.

또한 다음 사항에주의를 기울이는 것이 좋습니다.

  • desgua answer. 4 월 19 일 11시 23 분 56 초
  • 사용자 224306에 대한 John T의 답변에 5 월 14 일 13시 17 분 38 초에 대한 답변

0

문제가 해결되었습니다. 예를 들어, 사용자 루트에게 :

echo -e 'password\npassword\n' | sudo passwd root

@eerson Martinez의 -e 플래그는 무엇입니까?
user674669

1
echo의 -e 플래그를 사용하면 특정 시퀀스를 특별한 의미를 갖는 것으로 해석 할 수 있습니다.
Jerson Martínez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.