использование Python Paramiko для ssh: sudo: нет tty и не указана программа askpass

Я хочу использовать paramiko для ssh в кучу удаленных узлов и запустить некоторую командную строку с root priviledge

у меня есть ключ 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
все работает отлично
каковы возможные причины ?
спасибо!

27
задан misteryes
18.03.2023 12:05 Количество просмотров материала 2506
Распечатать страницу

3 ответа

в наличии sudoers конфигурация, обычно присутствует следующая строка:

Defaults requiretty

это и безопасно и что вам нужно в большинстве случаев использования.

в вашем случае вам нужно переопределить это значение по умолчанию для конкретного пользователя, поэтому вы напишете ниже:

Defaults:niky !requiretty

кроме того, вам нужно определить строку, позволяющую niky называть sudo без пароль:

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

эта строка означает, что пользователь niky разрешено выполнить /bin/ls as root in remote.nity.com без ввода пароля.

дополнительная ссылка может быть найдена в здесь.

2
отвечен dawud 2023-03-19 19:53

FYI-может помочь вам в вашем поиске-Примечание Вы получите ту же ошибку в простой SSH, если вы инкапсулировать одну команду SSH внутри другого, например:

localhost в$ СШ user1@host1.example.com -с судо Су - anotheruser СШ user2@host2.example2.com /работа/это/исполняемый'

(Почему бы не SSH непосредственно в поле назначения? Ну, может быть, ключи SSH настроены только между host1 и host2, или сеть маршрутизируется, чтобы запретить доступ к host2 без перемещения через host1. Может, тебе нельзя. коснуться sudoers или любого другого файла на host2... общие в производстве envs.).

в любом случае, вы можете запускать команды, отличные от sudo, используя выше, но префикс sudo не вызывает "нет tty".

Как это исправить с помощью команды Bare ssh? Сдать в -т ех: имя localhost$ СШ user1@host1.example.com -с судо Су - anotheruser СШ -Т user2@host2.example2.com /работа/это/исполняемый'

теперь удаленный sudo работает нормально внутри SSH, никаких жалоб на tty. Тот -Т-выделил он.

Итак, вопрос в том, как эмулировать опцию "- t " внутри объекта Paramiko? Вот вам и ответ.

этот блог пытается объяснить, но, возможно, мог бы потратить больше времени на пример " sudo: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

(извинения за мою точку зрения в правильном направлении вместо идеального ответа... Я все еще ищу эту информацию сам фактически.)

1
отвечен Crossfit_and_Beer 2023-03-19 22:10

две вещи, которые вы найдете полезными:

  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 over paramiko вопросы.

1
отвечен ArtOfWarfare 2023-03-20 00:27

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх