Прежде чем я углублюсь в детали, я уже пытался решить этот вопрос из а> безуспешно.
Я пытаюсь использовать модуль 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, если это имеет значение) даже с включенным двунаправленным буфером обмена.
Я пробовал следующие шаги (некоторые из которых видны выше):
- Установить
ssh.force_password=True
- Установите
ssh.options = {'RequestTTY':'Force'}
(это должно быть эквивалентно использованию «-t» в аргументе SSH CLI, если я понимаю документацию openSSH) - Установить
auto_prompt_reset=False
- Отредактируйте pxssh.py, чтобы установить «ssh_options» с '' на '-t -x' (я пробовал каждый параметр по отдельности, а затем оба вместе).
- Вручную отключите SSH_ASKPASS в оболочке перед запуском скрипта.
- Отключите SSH_ASKPASS с помощью
os.unsetenv()
непосредственно перед вызовом pxssh в скрипте. - Установите для параметра «NumberOfPasswordPrompts» значение «1».
Наблюдаемое поведение, когда он получает неправильный пароль, заключается в том, что он печатает «Ошибка подключения SSH ...», как и ожидалось, но также появляется всплывающее окно пароля openSSH.
Ни один из перечисленных шагов не оказал заметного влияния на производительность скрипта, и большинство моих поисков в Google по этой проблеме указывают на этот связанный вопрос. Если кто-нибудь знает, как я могу на 100% подавить это окно пароля, я был бы очень признателен за помощь.
Всем заранее спасибо за советы.
Возможное решение Я обнаружил, что могу предотвратить появление окна, выполнив следующие действия:
- В pxssh.py измените ssh_options с
''
на"-o 'NumberOfPasswordPrompts=1'"
. - В моем сценарии ловите
pexpect.EOF
вместе сpexpect.pxssh.ExceptionPxssh
, чтобы определить, когда пароль не сработал.
Я пока не принимаю это как ответ, потому что мне это кажется очень плохим решением, особенно редактирование pxssh.py. Я попытался установить параметр NumberOfPasswordPrompts в своем скрипте, но это не дало результата, поэтому у меня неправильный синтаксис.
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, чтобы вам не нужно было физически изменять модуль.
Вам вообще не нужно обновлять pxssh.py. Вместо:
ssh = px.pxssh.pxssh()
ssh.force_password = True
ssh.SSH_OPTS = "-o 'NumberOfPasswordPrompts=1'"
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.