stdin.write пароль эха во время входа в paramiko ssh - PullRequest
0 голосов
/ 08 февраля 2019

Сценарий, предоставленный TechJS: (https://stackoverflow.com/users/5252192/techjs) в их ответе на ( Как запустить sudo с paramiko? (Python) ), прекрасно работает для меня.

ОднакоПосле добавления информации он отображает пароль в командной строке, и я знаю, что это не очень хорошая идея. Я представляю его из stdin.write (), но я не знаю, как это сделать по-другому.

Может кто-нибудьпредложить более безопасный способ хранения и ввода пароля сервера? Я все еще новичок и хотел бы получить хороший урок по правильному протоколу защиты паролей в этих ситуациях:)

Большое спасибо всем без исключения!

import paramiko
import re
import <passwords file> #did chmod 400 for this file

ssh_client= None
server_address='<removed for security>'
server_username='<removed for security>'
server_pass = <password file>.<this server password from passwords file>
command = "<removed for security>"

def main(command, server_address, server_username, server_pass):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=server_address,
                username=server_username,
                password=server_pass)
        session = ssh.get_transport().open_session()
        session.set_combine_stderr(True)
        session.get_pty()
        session.exec_command("sudo bash -c \"" + command + "\"")
        stdin = session.makefile('wb', -1)
        stdout = session.makefile('rb', -1)
        stdin.write(server_pass + '\n')
        stdin.flush()
        print(stdout.read().decode("utf-8"))

    except Exception as e:
        print("The following error has occurred during your requested process")
        print(e.message)    
    finally:
        if ssh:
            session.close()
            ssh.close()


if __name__ == '__main__':
    main(command, server_address, server_username, server_pass)

1 Ответ

0 голосов
/ 11 февраля 2019

После долгих исследований я считаю, что у меня есть приемлемый ответ, однако, пожалуйста, отнеситесь к нему со скептицизмом, так как я НЕ эксперт в этой области.Вам сообщили.

Это также НЕ устранило проблему печати с stdin, но я только что удалил функцию print () все вместе, чтобы устранить проблему.Этот ответ предназначен ТОЛЬКО для защиты паролем.

tl: dr вот ответ https://alexwlchan.net/2016/11/you-should-use-keyring/, но я объясню более подробно и приведу ниже примеры моего кода, используемого для хранения и использования паролей, поканикогда не переписывайся с ними.

ДЛИННЫЙ ОТВЕТ: Python имеет пакет, специально созданный для этой цели, называемый keyring ().Это позволяет хранить и вызывать пароли с относительной безопасностью.Он работает с вашими учетными данными, поэтому, к сожалению, если кто-то получит доступ к вашей учетной записи, он будет иметь доступ к этой информации, но без этого вы должны быть теоретически безопасны (или настолько безопасны, насколько можно предположить)

Keyring() плюс пакет, называемый getpass (), позволяет пользователю вводить пароль в свою систему без фиксации его в виде простого текста и, таким образом, предотвращать случайную утечку через общий доступ к файлам или тому подобное.

Вот очень простой скриптЯ написал, чтобы автоматически подсказать вам ваш выбор и сохранить пароль без необходимости хранить его в виде простого текста

import keyring
import getpass

def main():

    system = input('System:')
    username = input('Please input username:')
    keyring.set_password(system,username,getpass.getpass())
    print('The password for ' +username+' in '+system+' has been set.\nPlease do not misplace, you will not be able to recover at this point.\nFor misplaced passwords, please resubmit new entry with the same details, it will overwrite the previous entry.')

if __name__=='__main__':
    print('Please input the system in which the password will be used,\nand corresponding username.')
    main()

(если вы используете Python 2, тогда он должен быть raw_input ())

Это делается совершенно другим сценарием, поэтому вам НЕ НУЖНО ИМЕТЬ ИХ ВМЕСТЕ, запустите один сценарий, чтобы установить пароль, и с этого момента вызов основного пароля очень прост в вашем основном сценарии.

passwd = keyring.get_password('<system you inputed>','<username you inputed>')

И все готово!

ps У меня лично естьпоместил bash-файл в мою переменную PATH, которая запускает этот скрипт, так что, если мне когда-нибудь понадобится создать пароль, его можно будет сделать из любого каталога на машине, что укрепит хорошие процедуры безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...