usando python Paramiko para ssh: sudo: no tty presente e nenhum programa askpass especificado

5

Eu quero usar paramiko para ssh em vários nós remotos e executar alguma linha de comando com root priviledge

Eu tenho a chave ssh no meu diretório inicial e, portanto, não preciso inserir a senha quando ssh nesses nós remotos

mas ao executar o seguinte script:

    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)

Eu recebi o seguinte erro:

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

se eu não adicionar sudo antes de ls tudo funciona bem Quais são as possíveis razões? obrigado!

    
por misteryes 10.04.2013 / 01:32

3 respostas

2

Na configuração de estoque sudoers , a seguinte linha geralmente está presente:

Defaults requiretty

Isso é seguro e o que você precisa na maioria dos casos de uso.

No seu caso, você precisa substituir esse padrão para um usuário específico, portanto, escreva abaixo:

Defaults:niky !requiretty

Além disso, você precisa definir uma linha permitindo que niky chame sudo sem senha:

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

Esta linha significa que o usuário niky tem permissão para executar /bin/ls como root em remote.nity.com sem exigir uma senha.

Outras referências podem ser encontradas em aqui .

    
por 10.04.2013 / 15:07
1

FYI - pode ajudá-lo em sua pesquisa - note que você obtém o MESMO erro no SSH simples se você encapsular um comando SSH dentro de outro, ex:

localhost $ ssh [email protected] -C sudo su - outro usuário ssh [email protected] / run / this / executable '

(Por que não SSH diretamente na caixa de destino? Bem, talvez as chaves SSH sejam configuradas apenas entre host1 e host2, ou a rede é roteada para proibir o acesso host2 sem viajar pelo host1. Talvez você não tenha permissão para tocar sudoers ou qualquer outro arquivo no host2 ... comum em envs de produção.).

Em qualquer caso, você pode executar comandos não-sudo usando o acima, mas o prefixo com sudo causa "no tty present".

Como você corrige isso com o comando bare ssh? Passe no -t, ex: localhost $ ssh [email protected] -C sudo su - outro usuário ssh -t [email protected] / executar / este / executável '

Agora o sudo remoto roda bem dentro do SSH, sem reclamações sobre o tty. O -t alocou-o.

Então a questão é, como é que se emula a opção "-t" dentro do objeto Paramiko? Aqui está sua resposta.

Este blog tenta explicar, mas talvez possa ter passado mais tempo no exemplo 'sudo': link

(Desculpas para o meu ponto na direção certa, em vez de uma resposta perfeita ... Eu ainda estou procurando por essa informação na verdade).

    
por 26.07.2013 / 20:27
1

Duas coisas que você achará úteis:

  1. exec_command aceita um argumento opcional de get_pty . Você pode usá-lo assim:

    (stdin, stdout, stderr) = ssh.exec_command("sudo ls", get_pty = True)
    
  2. Jogue a senha em stdin , com uma linha de retorno e liberação para garantir que ela seja entregue. Isso garante que ele receba a senha se ela pedir (você poderia fazer algo mais sofisticado para verificar se ela realmente pedia ou não ... simplesmente ativá-la sempre não causou problemas para mim ainda).

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

Juntos, eles devem corrigir seus problemas de sudo over paramiko .

    
por 26.04.2016 / 04:30