백그라운드에서 비밀번호를 입력해야하는 sudo 명령을 어떻게 실행합니까?


29

최근에 sudo인증 캐싱 기능을 비활성화 하여 매번 비밀번호를 묻는 메시지를 표시합니다.

그리고 이것은 보안에 좋지만 솔루션을 알아낼 수 없었던 약간의 문제가 발생했지만 다음과 같은 명령을 실행할 수 없습니다.

sudo <command> &

과거에는 그 sudo전에 명령 을 실행했을 때 암호를 캐시하고 sudo몇 분 동안 프롬프트없이 명령 을 실행할 수 있었으므로 명령을 실행할 수있었습니다.
그러나 미리 캐싱이없고 즉시 새 스레드를 시작 sudo하고 암호를 묻는 메시지를 표시하지 않으므로 지금 실행하면이 방법으로 실행할 수 없습니다.

따라서 내가 sudo -i전에 실행하지 않으면 다소 성가신이 형식으로 명령을 실행할 수 없습니다.
그래서이 문제를 해결하고 여전히 이런 식으로 프로그램과 명령을 실행할 수있는 방법이 있는지 궁금합니다.

나는 그놈 3.18과 함께 우분투 그놈 15.10을 실행하고 있으며, 특히이 방식으로 실행하려는 프로그램은 etherape차이 가 있다면 모든 프로그램과 명령에서 작동하는 솔루션을 정말로 원합니다.


3
@ kossince &는 실제로 검색 할 수 없습니다 … sudo command in the background.로 변경하고 있습니다.
muru

@muru 인기있는 검색 엔진이 대신 특수 문자를 검색하게 할 수 있다면. : P
kos

1
@kos 당신은 놀랄 것 입니다. : D
muru

답변:


56

sudo백그라운드에서 실행하는 대신 백그라운드 sudo에서 명령을 실행하도록 지시하십시오. 보낸 사람 man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

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

sudo -b sleep 10

다른 방법은 쉘을 사용하여 명령을 실행하는 것입니다.

sudo sh -c 'sleep 10 &'

다른 옵션은 암호를 얻기 위해 그래픽 프로그램을 지정하고 sudo어쨌든 백그라운드로 보내는 것입니다.

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Askpass 프로그램은 일반적으로 SSH에 사용됩니다. ssh-askpass-gnome패키지 중 하나가 제공되며 적어도 우분투 15.10에 기본적으로 설치됩니다.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

설정 방법입니다 기꺼이 당신이 경우 timestamp_timeout같은 적어도 뭔가에 0.02(1.2 초, 난 그냥 안전한으로 말하고 싶지만 0에서) /etc/sudoers(단, 기본 설정으로 또는 함께, 귀하의 경우 필요 timestamp_timeout아무것도으로 설정하지만, 0하나는 다음을 수행 할 수 있습니다) 에서 이와 같은 별칭을 설정할 수 ~/.bashrc있습니다. 명령을 실행하기 전에 무언가를 수행 할 필요가 없으며 프로세스 제어를 유지할 수 있습니다. :

alias sudo='sudo -v; [ $? ] && sudo'

여기서의 트릭은 세미콜론으로, Bash를 sudo -v먼저 및 별도로 구문 분석 하여 사용자를 인증하고 잠재적 백그라운드 배경을 [ $? ] && sudo명령으로 제한합니다.이 명령 sudo -v은 성공 했는지 여부를 확인하고 필요한 경우 sudo다시 실행 합니다 (잠재적으로 백그라운드로).

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

sudo -v캐싱이 비활성화 된 경우에도 자격 증명 캐싱을 확장 합니까 ? 그리고 IIRC <별칭이 확장 되려면 공간이 시작이 아닌 명령의 끝에 있어야합니다.
muru

@muru RIght 나는 그가 timestamp_timeout설정 한 것을 잊었다 0. 그리고 네, 별칭 확장을 완전히 엉망으로 만들었습니다. 실제로 별칭 확장 되어서는 안됩니다 . 감사.
kos

그렇게 alias sudo='sudo -v && sudo'좋지 않을까요?
G-Man, 'Reinstate

@ G-Man 아니오, 이것은 ;Bash를 sudo -v먼저 파싱 하기 때문에 작동합니다 . &&Bash를 사용 하면 단일 명령으로 모두 구문 분석하고 즉시 백그라운드를 모두 분석합니다.
kos

8

당신은 할 수 없습니다. 이 &명령을 백그라운드로 즉시 보냅니다. 즉, 백그라운드에서 서브 쉘이 작성되고 명령이 실행됩니다. 의 경우와 같이 해당 명령이 프롬프트를 발행 sudo하면 프롬프트가 백그라운드에 표시되고 표시되지 않습니다.

이를 해결할 수있는 유일한 방법은 명령을 다시 포 그라운드로 가져오고 암호를 제공 한 후 백그라운드로 다시 보내는 것입니다. 예를 들면 다음과 같습니다.

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

지금, 당신의 비밀번호, 타격을 입력 Enter한 후 히트 CtrlZ다시 배경을 전송하고 bg계속 실행하도록 지시 할 수 있습니다.

더 간단한 방법은 사용하지 않을하는 것입니다 &수동 배경에, 대신, 전송 작업을하고 CtrlZ하고 bg이를 실행 한 후.

마지막으로 sudo의 비밀번호 시간 제한을 1 초 또는 2 초로 설정하는 것이 좋습니다. 그래도 플래시를 보호하려고하지 않는 한 충분한 보안을 유지하고 예상대로 명령을 실행할 수 있습니다.


플래시는 내 초콜릿 케이크를 훔쳐서 ... ; P

2
이 시대에 펌웨어를 감염시키는 Adobe 취약성 및 맬웨어는 플래시에주의를 기울여야합니다.
Damian Yerrick 21:29에


참고로 실제로 시간 초과를 초로 설정할 수 있습니까? 의 값은 가능한 소수 부분으로 분을 지정해야 man sudoers한다고 말합니다 timestamp_timeout( sudo왜 그런지 모르겠지만 오류를 지정 하면 오류 가 발생합니다).
kos

2
@kos는 그렇습니다. 2.5여기서 잘 작동합니다 (Arch, sudo버전 1.8.15).
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.