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

Я пытаюсь использовать модуль pxssh в pexpect для подключения SSH к удаленной системе и сбора данных о времени безотказной работы. Однако всякий раз, когда я ввожу неправильный пароль, сценарий генерирует запрос пароля GUI для openSSH.

Сценарий будет запрашивать большое количество систем и записывать вывод в журнал, поэтому я хочу, чтобы он просто писал заметку в журнале всякий раз, когда соединение SSH терпит неудачу; Я не хочу, чтобы это когда-либо всплывало окно.

Вот текущий код функции:

def getUptime(ipAddr, passwd):
    try:
        os.unsetenv('SSH_ASKPASS')
        ssh = px.pxssh.pxssh()
        ssh.options={"NumberOfPasswordPrompts":"1"}
        ssh.force_password=True
        ssh.options = {'RequestTTY':'Force'}
        ssh.login(ipAddr,"root",passwd,auto_prompt_reset=False)
        ssh.sendline("uptime")
        ssh.prompt()
        uptime = ssh.before.split()
        ssh.logout()
        uptime = ' '.join(uptime[uptime.index('up'):]).split(',')[0].strip('up')
        return(uptime)
    except(px.pxssh.ExceptionPxssh):
        return("SSH connection failed; double-check the password")

Я прошу прощения, если в этом коде есть опечатки, мне пришлось перепечатать его вручную, поскольку Virtualbox не позволяет мне копировать и вставлять из моей среды разработки (SLES 11 x64, если это имеет значение) даже с включенным двунаправленным буфером обмена.

Я пробовал следующие шаги (некоторые из которых видны выше):

  1. Установить ssh.force_password=True
  2. Установите ssh.options = {'RequestTTY':'Force'} (это должно быть эквивалентно использованию «-t» в аргументе SSH CLI, если я понимаю документацию openSSH)
  3. Установить auto_prompt_reset=False
  4. Отредактируйте pxssh.py, чтобы установить «ssh_options» с '' на '-t -x' (я пробовал каждый параметр по отдельности, а затем оба вместе).
  5. Вручную отключите SSH_ASKPASS в оболочке перед запуском скрипта.
  6. Отключите SSH_ASKPASS с помощью os.unsetenv() непосредственно перед вызовом pxssh в скрипте.
  7. Установите для параметра «NumberOfPasswordPrompts» значение «1».

Наблюдаемое поведение, когда он получает неправильный пароль, заключается в том, что он печатает «Ошибка подключения SSH ...», как и ожидалось, но также появляется всплывающее окно пароля openSSH.

Ни один из перечисленных шагов не оказал заметного влияния на производительность скрипта, и большинство моих поисков в Google по этой проблеме указывают на этот связанный вопрос. Если кто-нибудь знает, как я могу на 100% подавить это окно пароля, я был бы очень признателен за помощь.

Всем заранее спасибо за советы.

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

  1. В pxssh.py измените ssh_options с '' на "-o 'NumberOfPasswordPrompts=1'".
  2. В моем сценарии ловите pexpect.EOF вместе с pexpect.pxssh.ExceptionPxssh, чтобы определить, когда пароль не сработал.

Я пока не принимаю это как ответ, потому что мне это кажется очень плохим решением, особенно редактирование pxssh.py. Я попытался установить параметр NumberOfPasswordPrompts в своем скрипте, но это не дало результата, поэтому у меня неправильный синтаксис.

-1
Liesmith 24 Фев 2015 в 02:10
Да, я согласен с вами, что изменение модуля pxssh — это плохое решение. Мне никогда не помогали с этой проблемой. Надеюсь, тебе повезет больше. Может быть, сделать сообщение о том, как обезьяны патч pxssh. Недавно я слышал, как этот термин используется для обозначения подобных проблем. Хотя я не нашел времени, чтобы на самом деле выяснить, что это такое.
 – 
Brandon Nadeau
9 Июл 2015 в 23:02

2 ответа

У меня была эта проблема довольно давно, посмотрите, поможет ли это. Python PXSSH GUI появляется при ошибке входа

Если нет, попробуйте открыть модуль pxsssh в вашей библиотеке Python. Если я правильно помню, есть проблема, описанная в __init__, где все, что вам нужно сделать, это прокомментировать строку и раскомментировать строку.

Редактировать:

В пакете pexpect есть файл pxssh.py, откройте его и посмотрите на строку 115, там должно быть ваше исправление. Вот что вы ищете

Путь: /usr/lib/python2.7/dist-packages/pexpect/pxssh.py

# Comment this line
self.SSH_OPTS = ("-o'RSAAuthentication=no'"
        + " -o 'PubkeyAuthentication=no'")


# Disabling host key checking, makes you vulnerable to MITM attacks.
#                + " -o 'StrictHostKeyChecking=no'"
#                + " -o 'UserKnownHostsFile /dev/null' ")
# Disabling X11 forwarding gets rid of the annoying SSH_ASKPASS from
# displaying a GUI password dialog. I have not figured out how to
# disable only SSH_ASKPASS without also disabling X11 forwarding.
# Unsetting SSH_ASKPASS on the remote side doesn't disable it! Annoying!

# UNCOMMENT THE LINE BELOW 
#self.SSH_OPTS = "-x -o'RSAAuthentication=no' -o 'PubkeyAuthentication=no'"
self.force_password = False
self.auto_prompt_reset = True

Я давно не использовал модуль pxssh. Но я думаю, вы можете переопределить SSH_OPTS, чтобы вам не нужно было физически изменять модуль.

0
Community 20 Июн 2020 в 12:12

Вам вообще не нужно обновлять pxssh.py. Вместо:

ssh = px.pxssh.pxssh()
ssh.force_password = True
ssh.SSH_OPTS = "-o 'NumberOfPasswordPrompts=1'"
1
kittykittybangbang 9 Июл 2015 в 22:14