Мое первое клиент-серверное приложение. Это простой скрипт Python, который получает список запущенных процессов из Server_1
и записывает его в файл с именем datetime на Server_2
каждые 5 секунд.
Я планирую преобразовать этот код в одну или две функции, возможно, одну для защиты соединения и одну для реализации логики.
Я также ничего не знаю о передовых методах обеспечения безопасности и ищу подсказки. Любые отзывы по любому аспекту кода приветствуются.
import os
import paramiko
from time import sleep
from datetime import datetime
SERVER_1 = os.getenv('HOST_1') or ""
SERVER_1_PASS = os.getenv('PASS_1') or ""
SERVER_2 = os.getenv('HOST_2') or ""
SERVER_2_PASS = os.getenv('PASS_2') or ""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(SERVER_1, username="root", password=SERVER_1_PASS)
ssh2 = paramiko.SSHClient()
ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh2.connect(SERVER_2, username="root", password=SERVER_2_PASS)
while True:
now = datetime.now()
dt_string = now.strftime("%d-%m-%YT%H:%M:%S")
stdin, stdout, stderr = ssh.exec_command("ps -aux")
processes = stdout.readlines()
output = [line.strip() for line in processes]
ftp = ssh2.open_sftp()
try:
file = ftp.file(dt_string, "a", -1)
file.write('n'.join(output))
file.flush()
ftp.close()
except IOError as e:
print("Could not write to file")
print(e)
sleep(5)
```
1 ответ
SERVER_1_PASS = os.getenv('PASS_1') or "" SERVER_2_PASS = os.getenv('PASS_2') or ""
Я не думаю, что передавать секреты в среду — хорошая идея — это слишком легко читается другими процессами. Вместо этого лучше хранить их в файле, доступном только пользователю. Поскольку мы используем SSH, у нас даже уже есть такой файл ($HOME/.ssh/config
), хотя лучше было бы использовать аутентификацию с открытым ключом.
ssh.connect(SERVER_1, username="root", password=SERVER_1_PASS)
Ой — зачем нам подключаться как root
? Для этого у нас должен быть выделенный пользователь с минимальным уровнем возможностей для выполнения задачи.
Что значит connect()
делать, когда SERVER_1
это пустая строка (по умолчанию, если она не передана в среде)? Это то, чего мы хотим, или в этом случае следует сделать ошибку?