ssh에 Python Paramiko 사용 : sudo : tty 없음 및 askpass 프로그램 없음


5

paramiko원격 노드를 묶어 ssh로 사용 하고 rootpriviledge로 일부 명령 줄을 실행 하고 싶습니다.

내 홈 디렉토리에 ssh 키가 있으므로 원격 노드로 ssh 할 때 비밀번호를 입력 할 필요가 없습니다.

그러나 다음 스크립트를 실행할 때 :

    def connect(hostname):
                    ssh = paramiko.SSHClient()
                    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())               
                    ssh.connect(hostname, username='niky', pkey=paramiko.RSAKey.from_private_key(open('id_rsa'), 'passwd'), timeout = 240.0)                return ssh          



    def run(hostname):
            ssh = connect(hostname)
            (stdin, stdout, stderr) = ssh.exec_command("sudo ls")
            res = stderr.readlines()
            print hostname+': '+''.join(str(elem) for elem in res)+'\n'

    run(remote.nity.com)

다음과 같은 오류가 발생했습니다.

remote.nity.com: sudo: no tty present and no askpass program specified

모든 것이 잘 작동 sudo하기 전에 추가하지 않으면 ls잠재적 인 이유는 무엇입니까? 감사!


sudo를 실행하는 사용자는 sudoers 파일에 NOPASSWORD 지시문을 사용하여 실행중인 명령을 실행할 수
없어야

답변:


2

스톡 sudoers구성에는 일반적으로 다음 줄이 있습니다.

Defaults requiretty

이것은 안전하고 대부분의 사용 사례에서 필요한 것입니다.

귀하의 경우 특정 사용자에 대해이 기본값을 재정의해야하므로 다음과 같이 작성하십시오.

Defaults:niky !requiretty

또한 비밀번호없이 niky전화를 걸 수있는 회선을 정의해야 sudo합니다.

niky remote.nity.com = (root)NOPASSWD: /bin/ls

이 광고는 사용자가 있다는 것을 의미 niky실행시킨다 /bin/lsrootremote.nity.com암호 없이도.

자세한 내용은 여기를 참조 하십시오 .


1

참고로-검색에 도움이 될 수 있습니다. 하나의 SSH 명령을 다른 SSH 명령 안에 캡슐화하면 일반 SSH에서 SAME 오류가 발생합니다.

localhost $ ssh user1@host1.example.com -C 'sudo su-다른 사용자 ssh user2@host2.example2.com / run / this / executable'

(대상 상자에 직접 SSH를 사용하지 않는 이유는 무엇입니까?) 아마도 SSH 키가 host1과 host2 사이에만 설정되거나 네트워크가 host1을 통해 이동하지 않고 host2 액세스를 금지하도록 라우팅되었을 수 있습니다. host2의 다른 파일 ... 프로덕션 환경에서 공통).

어쨌든 위의 방법을 사용하여 sudo 이외의 명령을 실행할 수 있지만 sudo 접두사가 붙으면 "tty tty 없음"이 발생합니다.

bare ssh 명령으로 어떻게이 문제를 해결합니까? -t를 전달하십시오 (예 : localhost $ ssh user1@host1.example.com -C 'sudo su-anotheruser ssh -t user2@host2.example2.com / run / this / executable'

이제 원격 sudo는 SSH 내에서 잘 실행되며 tty에 대한 불만은 없습니다. -t가 할당했습니다.

따라서 문제는 Paramiko 객체 내부의 "-t"옵션을 어떻게 에뮬레이트합니까? 당신의 대답이 있습니다.

이 블로그는 설명을 시도하지만 'sudo'예제에 더 많은 시간을 보냈을 수 있습니다. http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

(완벽한 대답 대신 올바른 방향으로의 요점에 대한 사과 ... 실제로 그 정보를 실제로 검색하고 있습니다).


링크 한 블로그는 paramiko에서 문제없이 sudo를 사용하는 사람을 보여줍니다.
ArtOfWarfare

1

유용한 두 가지 :

  1. exec_command의 선택적 인수를 사용 get_pty합니다. 다음과 같이 사용할 수 있습니다.

    (stdin, stdout, stderr) = ssh.exec_command("sudo ls", get_pty = True)
    
  2. stdin줄 바꿈을 사용 하여 비밀번호를에 입력 하고 플러시하여 전달되도록합니다. 이렇게하면 암호를 묻는 메시지가 표시 될 때 암호를받을 수 있습니다 (실제로 묻 었는지 여부를 확인하기 위해 더 정교한 작업을 수행 할 수 있습니다. 단순히 암호를 입력해도 항상 문제가되지는 않습니다).

    stdin.write('passwd' + '\n')
    stdin.flush()
    

종합하면, 당신의 sudo초과 paramiko문제를 해결해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.