development

'sudo : tty present 및 askpass program specified'오류 수정 방법

big-blog 2020. 2. 25. 22:47
반응형

'sudo : tty present 및 askpass program specified'오류 수정 방법


makefile을 사용하여 일부 소스를 컴파일하려고합니다. makefile에는로 실행해야하는 명령이 많이 있습니다 sudo.

터미널에서 소스를 컴파일하면 모든 것이 잘되고 sudo명령이 처음으로 암호를 기다리는 동안 make가 일시 중지 됩니다. 암호를 입력하면 make가 다시 시작되고 완료됩니다.

그러나 NetBeans에서 소스를 컴파일 할 수 있기를 바랍니다. 그래서 프로젝트를 시작하고 소스를 찾을 수있는 위치에 netbeans를 보여 주었지만 프로젝트를 컴파일하면 오류가 발생합니다.

sudo: no tty present and no askpass program specified

처음으로 sudo명령을 내 렸습니다 .

인터넷에서 문제를 찾았으며 찾은 모든 솔루션 중 하나는이 사용자의 암호를 비활성화하는 것입니다. 문제의 사용자가 루트이기 때문에. 나는 그것을하고 싶지 않습니다.

다른 해결책이 있습니까?


사용자에게 암호를 묻지 않고 해당 명령을 사용하도록 허용하면 문제가 해결됩니다. 먼저 쉘 콘솔을 열고 다음을 입력하십시오.

sudo visudo

그런 다음 해당 파일을 편집하여 맨 끝에 추가하십시오.

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

예 :

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

사용자 수 johnsudo를 poweroff, startstop암호를 입력하라는 메시지가 표시되지 않고.

화면 하단에서 visudo에 사용해야하는 키 입력이 있는지 확인하십시오.이 방법은 vi가 아니므로 문제의 첫 징후가 없으면 저장하지 않고 종료하십시오. 건강 경고 :이 파일을 손상 시키면 심각한 결과를 초래할 수 있으므로주의해서 편집하십시오!


시험:

  1. NOPASSWD모든 명령에 줄을 사용하십시오 .

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. sudoers파일의 다른 모든 줄 뒤에 줄을 넣으십시오 .

그것은 나를 위해 일했습니다 (우분투 14.04).


시험:

ssh -t remotehost "sudo <cmd>"

위의 오류가 제거됩니다.


모든 대안을 찾은 후 다음을 발견했습니다.

sudo -S <cmd>

-S (stdin) 옵션은 sudo가 터미널 장치 대신 표준 입력에서 암호를 읽도록합니다.

출처

위의 명령은 여전히 ​​암호를 입력해야합니다. jenkins와 같은 경우 암호 입력을 수동으로 제거하려면이 명령이 작동합니다.

echo <password> | sudo -S <cmd> 

sudo기본적으로 연결된 터미널에서 비밀번호를 읽습니다. 문제는 netbeans 콘솔에서 실행될 때 연결된 터미널이 없다는 것입니다. 따라서 다른 방법으로 암호를 입력해야합니다.이를 askpass 프로그램 이라고합니다 .

askpass의 프로그램은 특정 프로그램,하지만 암호를 요청할 수있는 프로그램이 아닙니다. 예를 들어 내 시스템에서 x11-ssh-askpass제대로 작동합니다.

그러기 위해서는 환경 변수 SUDO_ASKPASSsudo.conf파일 에서 사용할 프로그램을 지정해야 합니다 ( man sudo자세한 내용 참조).

sudo옵션을 사용하여 askpass 프로그램을 강제 로 사용할 수 있습니다 -A. 기본적으로 접속 된 터미널이없는 경우에만 사용합니다.


이걸로 해봐:

echo '' | sudo -S my_command

우분투 16.04 사용자

읽어야 할 파일이 있습니다.

cat /etc/sudoers.d/README

/etc/sudoers.d/myuser에 0440 모드의 파일을 다음 내용으로 배치합니다.

myuser  ALL=(ALL) NOPASSWD: ALL

문제를 해결해야합니다.

다음을 잊지 마십시오 :

chmod 0440 /etc/sudoers.d/myuser

우연히 Windows10과 함께 제공되는 우분투 내부에서 sudo를 할 수 없기 때문에 여기에 오면

  1. 편집 (메모장) 윈도우에서의 / etc / hosts 파일을이에 위치 할 것입니다 : %localappdata\lxss\rootfs\etc, 추가는 127.0.0.1 WINDOWS8,이는 호스트를 찾을 수있는 첫 번째 오류를 제거 얻을 것이다.

  2. no tty present오류를 없애려면 항상sudo -S <command>


리눅스에 로그인하십시오. 다음 명령을 실행하십시오. sudoer를 편집하는 것은 위험한 제안이므로주의하십시오.

$ sudo visudo

vi 편집기가 열리면 다음을 변경하십시오.

  1. 주석 처리 Defaults requiretty

    # Defaults    requiretty
    
  2. 파일의 끝으로 이동하여 추가하십시오

    jenkins ALL=(ALL) NOPASSWD: ALL
    

젠킨스에서 :

echo '<your-password>' | sudo -S command

:-

echo '******' | sudo -S service nginx restart

마스크 비밀번호 플러그인사용 하여 비밀번호를 숨길 수 있습니다


이것은 나를 위해 일했다 :

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

사용자가 "myuser"인 곳

Docker 이미지의 경우 다음과 같습니다.

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

사용중인 명령 sudo이의 일부 인지 확인하십시오 PATH.

단일 (또는 다중이지만 전부는 아님) 명령 sudoers항목이있는 sudo: no tty present and no askpass program specified경우 명령이 경로의 일부가 아닌 경우 (전체 경로가 지정되지 않은 경우)가 표시됩니다.

명령을 명령에 추가 PATH하거나 절대 경로로 호출 하여 문제를 해결할 수 있습니다.

sudo /usr/sbin/ipset

대신에

sudo ipset


sudo루트 암호를 묻는 메시지가 표시되고 pseudo-tty가 할당되지 않아 (스크립트의 일부이므로) 명령 이 실패합니다.

이 명령을 실행하려면 루트로 로그인하거나 /etc/sudoers (또는 :)에 다음 규칙을 설정해야합니다 sudo visudo.

# Members of the admin group may gain root privileges.
%admin  ALL=(ALL) NOPASSWD:ALL

그런 다음 사용자가 admin그룹 (또는 wheel)에 속하는지 확인하십시오 .

이상적으로 (safer) 루트 권한을 다음과 같이 지정할 수있는 특정 명령으로 만 제한하는 것입니다. %admin ALL=(ALL) NOPASSWD:/path/to/program


내 사건에 대해 누군가를 도울 수 있다고 생각합니다.

먼저 /etc/sudoers위의 답변 참조 하여 사용자 설정을 변경했습니다 . 그러나 여전히 작동하지 않았습니다.

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

제 경우에는에 myuser있었습니다 mygroup.

그리고 나는 그룹이 필요하지 않았습니다. 그래서 그 줄을 삭제했습니다.

(나처럼 그 줄을 삭제하지 말고 주석을 표시하십시오.)

myuser   ALL=(ALL) NOPASSWD: ALL

효과가있다!


jenkins에서 sudo 명령이 포함 된 쉘 스크립트를 실행하면 예상대로 실행되지 않을 수 있습니다. 이 문제를 해결하려면 따라

간단한 단계 :

  1. 우분투 기반 시스템에서 "$ sudo visudo"를 실행하십시오.

  2. 그러면 / etc / sudoers 파일이 열립니다.

  3. jenkins 사용자가 이미 해당 파일에 있으면 다음과 같이 수정하십시오.

젠킨스 ALL = (ALL) NOPASSWD : ALL

  1. 파일을 저장

  2. 젠킨스 직업을 다시 시작

  3. 오류 메시지가 다시 표시되지 않아야합니다. :)


이 오류는 일부 sudo ls비쉘 스크립트에서 터미널 명령 (루트 비밀번호가 필요함 )을 루비 프로그램에서 (백틱으로) 실행하려고 할 때도 발생할 수 있습니다 . 이 경우 Expect 유틸리티 ( http://en.wikipedia.org/wiki/Expect ) 또는 그 대안을 사용할 수 있습니다 .
예를 들어 Ruby에서을 sudo ls얻지 않고 실행하려면 sudo: no tty present and no askpass program specified다음을 실행할 수 있습니다.

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[이는 TCL 확장 예상 하기위한 대안 중 하나를 사용 합니다 : ruby_expect gem].


참고로 다른 사람이 같은 문제를 겪을 경우 NOPASSWD 매개 변수를 사용한 이후로 발생해서는 안되는이 오류로 좋은 시간 동안 멈췄습니다.

내가 모르는 것은 tty가없고 sudo가 시작하려고하는 명령이 / etc / sudoers 파일에서 허용 된 명령의 일부가 아닌 경우 sudo가 똑같은 오류 메시지를 발생시킬 수 있다는 것입니다.

내 문제가있는 파일 내용의 간단한 예는 다음과 같습니다.

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

bguser가 tty없이 "sudo command_b arg_b"를 시작하려고하면 (bguser가 일부 데몬에 사용됨) "tty가없고 askpass 프로그램이 지정되지 않았습니다"라는 오류가 발생합니다.

왜?

/ etc / sudoers 파일의 줄 끝에 쉼표가 없기 때문에 ...

(이 경우에 예상되는 동작이며 sudo의 버그가 아닌지 궁금합니다. "죄송합니다. 사용자 bguser는 실행할 수 없습니다."


사용자가 단일 실행 파일 'systemctl'로만 제한하고 visudo 파일을 잘못 구성했기 때문에이 오류가 발생했습니다.

내가 가진 것은 다음과 같습니다.

jenkins ALL=NOPASSWD: systemctl

그러나 실행 파일이 기본 경로에 있더라도 실행 파일의 전체 경로를 포함해야합니다. 예를 들면 다음과 같습니다.

jenkins ALL=NOPASSWD: /bin/systemctl

이것은 내 jenkins 사용자가 서비스를 다시 시작할 수는 있지만 전체 루트 액세스 권한은 없습니다


한 호스트에서 다른 호스트로 마이그레이션하는 경우 sudoers 파일에서 호스트 이름을 확인하는 것에 대해 기억하지 마십시오.

그래서 이것은 내 / etc / sudoers 설정입니다

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

일치하지 않으면

uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux

이 오류가 나타납니다.

tty가없고 askpass 프로그램이 지정되지 않았습니다.


NOPASSWD를 기반으로하지 않는 다른 옵션 :

  • 루트 권한 ((sudo netbeans) 또는 이와 유사한)을 사용하여 Netbeans을 시작하면 루트로 빌드 프로세스를 포크하여 sudo가 자동으로 성공합니다.
  • suexec에 필요한 작업을 수행하십시오. root가 소유하고 모드를 4755로 설정하십시오. (물론 컴퓨터의 모든 사용자가 실행할 수 있습니다.) 그렇게하면 sudo가 전혀 필요하지 않습니다.
  • 부트 섹터로 가상 하드 디스크 파일을 만들 때 sudo가 전혀 필요하지 않습니다. 파일은 파일 일 뿐이며 부트 섹터는 데이터 일뿐입니다. 고급 장치 전달을 수행하지 않는 한 가상 시스템도 루트가 필요하지 않습니다.

어쩌면 질문에 일치하는 답변이 없는지 확실하지 않지만 sudo가 필요한 sshfs를 마운트하려고 할 때 동일한 오류 메시지가 표시되었습니다. 명령은 다음과 같습니다.

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

옵션을 추가하여 -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

나는이 질문에 대해 같은 메시지를 받았다.

sudo: no tty present and no askpass program specified

그래서 다른 사람들의 대답 /etc/sudoer.d/user을 읽음으로써 다음과 같이 my.server.tld에 파일 을 만들었습니다.

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

이제 사용자에게 너무 많은 권한을 부여하지 않고도 드라이브를 마운트 할 수 있습니다.


이 질문은 오래되었지만 여전히 최신 시스템과 관련이 있습니다. sudo ( Debug sudo /var/log/sudo_debug all@infoin /etc/sudo.conf) 의 디버그 모드를 활성화 한 후 / dev : " /dev is world writable"를 가리 켰습니다 . 따라서 tty 파일 권한 , 특히 tty / pts 노드가있는 디렉토리의 권한확인 해야 할 수도 있습니다 .


이 작업을 수행 할 수 있었지만 단계를 올바르게 따르십시오. 가져 오기 오류가 발생하는 모든 사람을위한 것입니다.

1 단계 : 파일 및 폴더에 실행 권한 문제가 있는지 확인하십시오. 리눅스 사용자 사용 :

chmod 777 filename

2 단계 : 실행할 권한이있는 사용자를 확인하십시오.

3 단계 : 열린 터미널 유형이 명령입니다.

sudo visudo

이 코드를 아래 코드에 추가하십시오

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

스크립트를 실행할 수있는 권한을 부여하고 모든 라이브러리를 사용할 수 있도록합니다. 사용자는 일반적으로 '아무도'또는 'www-data'입니다.

이제 코드를 다음과 같이 편집하십시오.

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

프로세스가 실행 중인지 확인하기 위해 터미널로 이동하십시오.

ps aux | grep python

이것은 파이썬에서 실행중인 모든 프로세스를 출력합니다.

추가 기능 : 아래 코드를 사용하여 시스템의 사용자를 확인하십시오.

cut -d: -f1 /etc/passwd

감사합니다!

참고 URL : https://stackoverflow.com/questions/21659637/how-to-fix-sudo-no-tty-present-and-no-askpass-program-specified-error



반응형