'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
사용자 수 john
sudo를 poweroff
, start
및 stop
암호를 입력하라는 메시지가 표시되지 않고.
화면 하단에서 visudo에 사용해야하는 키 입력이 있는지 확인하십시오.이 방법은 vi가 아니므로 문제의 첫 징후가 없으면 저장하지 않고 종료하십시오. 건강 경고 :이 파일을 손상 시키면 심각한 결과를 초래할 수 있으므로주의해서 편집하십시오!
시험:
NOPASSWD
모든 명령에 줄을 사용하십시오 .jenkins ALL=(ALL) NOPASSWD: ALL
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_ASKPASS
나 sudo.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를 할 수 없기 때문에 여기에 오면
편집 (메모장) 윈도우에서의 / etc / hosts 파일을이에 위치 할 것입니다 :
%localappdata\lxss\rootfs\etc
, 추가는127.0.0.1 WINDOWS8
,이는 호스트를 찾을 수있는 첫 번째 오류를 제거 얻을 것이다.no tty present
오류를 없애려면 항상sudo -S <command>
리눅스에 로그인하십시오. 다음 명령을 실행하십시오. sudoer를 편집하는 것은 위험한 제안이므로주의하십시오.
$ sudo visudo
vi 편집기가 열리면 다음을 변경하십시오.
주석 처리
Defaults requiretty
# Defaults requiretty
파일의 끝으로 이동하여 추가하십시오
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 명령이 포함 된 쉘 스크립트를 실행하면 예상대로 실행되지 않을 수 있습니다. 이 문제를 해결하려면 따라
간단한 단계 :
우분투 기반 시스템에서 "$ sudo visudo"를 실행하십시오.
그러면 / etc / sudoers 파일이 열립니다.
- jenkins 사용자가 이미 해당 파일에 있으면 다음과 같이 수정하십시오.
젠킨스 ALL = (ALL) NOPASSWD : ALL
파일을 저장
젠킨스 직업을 다시 시작
오류 메시지가 다시 표시되지 않아야합니다. :)
이 오류는 일부 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@info
in /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
감사합니다!
'development' 카테고리의 다른 글
tbody 내부에 세로 스크롤이있는 100 % 너비의 HTML 테이블 (0) | 2020.02.25 |
---|---|
속성 별 Java 8 구별 (0) | 2020.02.25 |
.NET / C #-char []를 문자열로 변환 (0) | 2020.02.25 |
HTML 버튼 또는 JavaScript를 클릭 할 때 파일 다운로드를 트리거하는 방법 (0) | 2020.02.25 |
명령 줄에서 Xcode“빌드 및 아카이브” (0) | 2020.02.25 |