Làm cách nào tôi có thể đọc văn bản, ví dụ: tên người dùng và mật khẩu từ từng dòng tệp trong Python? Ví dụ, tôi có thể đạt được điều này trong shell/bash:
#!/bin/bash
AUTH='/authentication/account.txt'
U=$[sed -n 1p ${AUTH}]
P=$[sed -n 2p ${AUTH}]
và bên trong tệp /Authentication/account.txt là tên người dùng và mật khẩu của tôi theo dòng như thế này:
username
userpass
Martineau
Huy hiệu vàng 116K2525 gold badges161 silver badges286 bronze badges
Hỏi ngày 3 tháng 8 năm 2017 lúc 0:35Aug 3, 2017 at 0:35
1
Bạn không nên lưu trữ chi tiết đăng nhập chưa được mã hóa trong các tệp văn bản.
Tuy nhiên, đây là một giải pháp rất đơn giản: dù sao:
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
Đã trả lời ngày 3 tháng 8 năm 2017 lúc 0:42Aug 3, 2017 at 0:42
Syd Lambertsyd LambertSyd Lambert
1.33714 huy hiệu bạc15 huy hiệu đồng14 silver badges15 bronze badges
8 ví dụ mã Python được tìm thấy liên quan đến "đọc mật khẩu". Bạn có thể bỏ phiếu cho những người bạn thích hoặc bỏ phiếu cho những người bạn không thích và đi đến dự án gốc hoặc tệp nguồn bằng cách theo các liên kết trên mỗi ví dụ. read password". You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example.
ví dụ 1
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data
Ví dụ 2
def read_password[]: # type: [] -> Text if sys.stdin.isatty[]: password = getpass.getpass[] else: password = stdin.readline[].rstrip[] return password
Ví dụ 3
def read_password_file[filepath]: """ Read and return the user/password file. """ try: with open[filepath, 'r'] as fd: lines = fd.readlines[] fd.close[] return lines except IOError: raise ConfigurationError["Can't open password file for reading."]
Ví dụ 4
def readPasswordLists[self]: """ Read passwords from all files in the given directory :return: """ for file in os.listdir["./passlists"]: if file.endswith[".txt"]: passFile = os.path.join["./passlists", file] with open[passFile, 'r'] as fh: self.passwords += fh.read[].splitlines[]
Ví dụ 5
def read_password[pass_file]: if not os.path.isfile[pass_file]: logger.error['Password file: {} not found'. format[pass_file]] raise IOError passwords = [] with open[pass_file, 'r'] as pass_file: for password in pass_file: password = password.strip[] if password: passwords.append[password] return passwords
Ví dụ 6
def read_password[user]: """ Read password from a password DB """ # Using an sqlite db for demo purpose db = sqlite3.connect['passwd.db'] cursor = db.cursor[] try: passwd=cursor.execute["select password from passwds where user='%[user]s'" % locals[]].fetchone[][0] return hashlib.sha1[passwd.encode['utf-8']].hexdigest[] except TypeError: pass
Ví dụ 7
def read_password[] -> str: """ Read a password from the user """ info[green, "> ", end=""] return getpass.getpass[prompt=""]
Ví dụ 8
username
userpass
0 Tôi thích đóng góp cho nguồn mở, nhưng tôi muốn giữ mật khẩu của mình cho riêng mình! Python là một ngôn ngữ keo tuyệt vời để tự động hóa các tác vụ và gần đây tôi đã sử dụng nó để đăng nhập vào máy chủ web của mình bằng SFTP và tự động hóa phân tích nhật ký, quản lý tệp và cập nhật phần mềm. Các tập lệnh Python tôi đang làm việc cần biết thông tin đăng nhập của mình, nhưng tôi muốn cam kết chúng kiểm soát nguồn và chia sẻ chúng trên GitHub để tôi phải cẩn thận sử dụng một chiến lược nhằm giảm thiểu rủi ro vô tình rò rỉ các bí mật này lên Internet . Python is a great glue language for automating tasks, and recently I've been using it to log in to my web server using SFTP and automate log analysis, file management, and software updates. The Python scripts I'm working on need to know my login information, but I want to commit them to source control and share them on GitHub so I have to be careful to use a strategy which minimizes risk of inadvertently leaking these secrets onto the internet.
Bài đăng này khám phá các tùy chọn khác nhau để quản lý thông tin đăng nhập trong các tập lệnh Python trong kho công cộng. Có nhiều cách khác nhau để quản lý thông tin đăng nhập với Python, và tôi đã rất ngạc nhiên khi biết về một số cách mới khi tôi đang nghiên cứu chủ đề này. Bài đăng này xem xét các tùy chọn phổ biến nhất, bắt đầu với sự không an toàn nhất và làm việc theo cách của nó theo các phương pháp được đánh giá cao nhất để quản lý bí mật. There are many different ways to manage credentials with Python, and I was surprised to learn of some new ones as I was researching this topic. This post reviews the most common options, starting with the most insecure and working its way up to the most highly regarded methods for managing secrets.
Mật khẩu văn bản đơn giản trong mã
Nguy hiểm: Không bao giờ làm điều này Never do this
Bạn có thể đặt một mật khẩu hoặc khóa API trực tiếp trong tập lệnh Python của mình, nhưng ngay cả khi bạn có ý định xóa nó sau này, luôn có cơ hội bạn sẽ vô tình cam kết kiểm soát nguồn mà không nhận ra, gây rủi ro bảo mật mãi mãi. Phương pháp này là phải tránh bằng mọi giá!
username
userpass
1Mật khẩu bị che khuất trong mã
Nguy hiểm: Không bao giờ làm điều này Never do this
Bạn có thể đặt một mật khẩu hoặc khóa API trực tiếp trong tập lệnh Python của mình, nhưng ngay cả khi bạn có ý định xóa nó sau này, luôn có cơ hội bạn sẽ vô tình cam kết kiểm soát nguồn mà không nhận ra, gây rủi ro bảo mật mãi mãi. Phương pháp này là phải tránh bằng mọi giá!
username
userpass
2username
userpass
3username
userpass
4Mật khẩu bị che khuất trong mã
Một ý tưởng ít khủng khiếp hơn là làm xáo trộn mật khẩu văn bản đơn giản bằng cách lưu trữ chúng dưới dạng chuỗi 64 cơ sở. Bạn sẽ không biết mật khẩu chỉ bằng cách nhìn thấy nó, nhưng bất kỳ ai có chuỗi đều có thể dễ dàng giải mã nó. Các trang web như //www.base644decode.org rất hữu ích cho việc này. This method is prone to mistakes. Ensure the text file is never committed to source control.
Mật khẩu trong các tệp văn bản đơn giản
username
userpass
5Cảnh báo: Phương pháp này dễ bị lỗi. Đảm bảo tệp văn bản không bao giờ được cam kết kiểm soát nguồn.
Bạn có thể lưu trữ tên người dùng/mật khẩu trên hai dòng đầu tiên của tệp văn bản đơn giản, sau đó sử dụng Python để đọc nó khi bạn cần.
Nếu tệp văn bản nằm trong thư mục kho lưu trữ, bạn nên sửa đổi def read_password[prompt]:
while True:
try:
data = getpass[prompt]
except EOFError:
# Ctrl-d was pressed?
print[]
continue
except KeyboardInterrupt:
print[]
raise SystemExit[1]
else:
# The assumption is that, since Python 3 return a Unicode string
# from input[], it has Done The Right Thing with respect to
# character encoding.
return data
2 để đảm bảo nó không được theo dõi bởi điều khiển nguồn. Có một rủi ro là bạn có thể quên làm điều này, để lộ thông tin đăng nhập của bạn trực tuyến! Một ý tưởng tốt hơn có thể là đặt tệp bí mật bên ngoài thư mục kho lưu trữ của bạn hoàn toàn.
Có những thư viện làm cho điều này dễ dàng hơn. Một ví dụ là Python Decouple thực hiện rất nhiều logic này một cách duyên dáng và thậm chí có thể kết hợp các cài đặt từ nhiều tệp [ví dụ:
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data3 so với các tệpdef read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data4] cho các môi trường có thể hưởng lợi từ các tùy chọn cấu hình nâng cao hơn. Xem các ghi chú bên dưới về các thư viện trợ giúp mà các biến môi trường và các tệpdef read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data4 This method is prone to mistakes. Ensure the secrets module is never committed to source control.
Mật khẩu trong các mô -đun Python
Tương tự như một tệp văn bản thuần túy không được theo dõi bởi điều khiển nguồn [lý tưởng bên ngoài thư mục kho lưu trữ hoàn toàn], bạn có thể lưu trữ mật khẩu dưới dạng các biến trong mô -đun Python sau đó nhập nó.
username
userpass
7username
userpass
6Nếu tệp bí mật của bạn nằm trong một thư mục tối nghĩa, bạn sẽ phải thêm nó vào đường dẫn của mình để mô -đun có thể được tìm thấy khi nhập.
Đừng đặt tên cho mô -đun của bạn
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data6 vì mô -đun Bí mật là một phần của thư viện tiêu chuẩn và có thể sẽ được nhập vào thay thế. This method may store plain text passwords in your command history.
Mật khẩu như đối số chương trình
Cảnh báo: Phương pháp này có thể lưu trữ mật khẩu văn bản thuần túy trong lịch sử lệnh của bạn.Đây không phải là một ý tưởng tuyệt vời vì mật khẩu được nhìn thấy trong văn bản đơn giản trong bảng điều khiển và cũng có thể được lưu trữ trong lịch sử lệnh. Tuy nhiên, bạn không có khả năng vô tình cam kết mật khẩu để kiểm soát nguồn.
username
userpass
8username
userpass
9f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
0Nhập mật khẩu vào bảng điều khiển
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
1Bạn có thể yêu cầu người dùng nhập mật khẩu của họ vào bảng điều khiển, nhưng các ký tự sẽ được hiển thị khi chúng được nhập.
Python có một mô -đun GetPass trong thư viện tiêu chuẩn được thực hiện để nhắc người dùng về mật khẩu làm đầu vào bảng điều khiển. Không giống như
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data7, các ký tự không hiển thị vì mật khẩu được gõ.
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
2Đây là một phương pháp thú vị. Nó nhanh và đơn giản, nhưng hơi kỳ quặc. Các nhược điểm là [1] nó yêu cầu mật khẩu phải ở trong bảng tạm có thể đưa nó đến các chương trình khác, [2] nó yêu cầu cài đặt thư viện không đạt tiêu chuẩn và [3] nó sẽ không dễ dàng hoạt động trong môi trường máy chủ.
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
3Lưu ý rằng tôi tin tưởng pyperclip nhiều hơn clipboard [đó chỉ là một nhà phát triển khác kết thúc pyperclip]
Chạy sau khi sao chép mật khẩu vào bảng tạm:
Tôi thấy kỹ thuật này đặc biệt hữu ích khi tên người dùng và mật khẩu được lưu trữ trong trình quản lý mật khẩu.
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
4f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
5Quản lý mật khẩu với Keyring
Gói Keyring cung cấp một cách dễ dàng để truy cập dịch vụ Keyring của hệ thống từ Python. Trên MacOS, nó sử dụng Keychain, trên Windows, nó sử dụng khóa thông tin Windows và trên Linux, nó có thể sử dụng dịch vụ bí mật của Kwallet hoặc Gnome của KDE.
Nhược điểm của Keyrings là [1] nó yêu cầu một thư viện không đạt tiêu chuẩn, [2] triển khai có thể là đặc trưng của OS, [3] nó có thể không dễ dàng hoạt động trong môi trường đám mây.
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
6f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
7f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
8Mật khẩu trong các biến môi trường
Các biến môi trường là một trong những cách tốt hơn để quản lý thông tin đăng nhập với Python. Có nhiều bài viết về chủ đề này, bao gồm cả cách đặt các biến môi trường và làm việc với các biến môi trường trong Python. Các biến môi trường là một trong những phương pháp quản lý thông tin ưu tiên khi làm việc với các nhà cung cấp đám mây.
Hãy chắc chắn khởi động lại phiên giao diện điều khiển của bạn sau khi chỉnh sửa các biến môi trường trước khi thử đọc chúng từ bên trong Python.
f=open["/authentication/account.txt","r"]
lines=f.readlines[]
username=lines[0]
password=lines[1]
f.close[]
9Có nhiều thư viện trợ giúp như Python-Dotenv và Python Decouple có thể sử dụng các tệp
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data4 cục bộ để đặt các biến môi trường động khi chương trình của bạn chạy. Như đã lưu ý trong các phần trước, khi lưu trữ mật khẩu theo văn bản đơn giản trong cấu trúc tệp của kho lưu trữ của bạn, hãy cực kỳ cẩn thận khi không cam kết các tệp này để kiểm soát nguồn!
Ví dụ
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data4 Tệp:
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data0
Gói
def read_password[]: # type: [] -> Text if sys.stdin.isatty[]: password = getpass.getpass[] else: password = stdin.readline[].rstrip[] return password0 có thể tải các biến
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data4 dưới dạng biến môi trường khi tập lệnh Python chạy:
def read_password[prompt]: while True: try: data = getpass[prompt] except EOFError: # Ctrl-d was pressed? print[] continue except KeyboardInterrupt: print[] raise SystemExit[1] else: # The assumption is that, since Python 3 return a Unicode string # from input[], it has Done The Right Thing with respect to # character encoding. return data1
Tài nguyên bổ sung
- Sử dụng các tệp .ENV cho các biến môi trường trong các ứng dụng Python
- Biến môi trường so với bí mật trong Python
- Cách đặt các biến môi trường
- Làm việc với các biến môi trường trong Python
- Cách đặt và nhận các biến môi trường trong Python
- Python-DOTENV đọc các cặp giá trị khóa từ tệp .ENV và có thể đặt chúng thành các biến môi trường. Nó giúp phát triển các ứng dụng theo các nguyên tắc 12 yếu tố.
- Python Decouple giúp bạn sắp xếp các cài đặt của mình để bạn có thể thay đổi tham số mà không phải triển khai lại ứng dụng của mình.
Làm thế nào để bạn quản lý thông tin đăng nhập trong Python? Nếu bạn muốn chia sẻ phản hồi hoặc phương pháp sáng tạo mà bạn sử dụng mà tôi chưa thảo luận ở trên, hãy gửi email cho tôi và tôi có thể đưa các đề xuất của bạn vào tài liệu này.