From 8979228e0bf1eb90a14596ac3dc41d20b7c0533c Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 13 Dec 2022 14:26:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20ssh=20=E7=A7=81?= =?UTF-8?q?=E9=92=A5=E6=8E=A8=E9=80=81=E7=AD=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/base.py | 22 +++++++++++++--------- apps/common/utils/encode.py | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py index b43d5cccf..9c764477b 100644 --- a/apps/assets/models/base.py +++ b/apps/assets/models/base.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # -import io import os import uuid from hashlib import md5 @@ -18,7 +17,9 @@ from common.utils import random_string from common.utils import ( ssh_key_string_to_obj, ssh_key_gen, get_logger, lazyproperty ) -from common.utils.encode import parse_ssh_public_key_str +from common.utils.encode import ( + parse_ssh_public_key_str, parse_ssh_private_key_str +) from orgs.mixins.models import OrgModelMixin logger = get_logger(__file__) @@ -86,24 +87,27 @@ class AuthMixin: @property def private_key_file(self): - if not self.private_key_obj: + if not self.private_key: + return None + private_key_str = parse_ssh_private_key_str(self.private_key, + password=self.password) + if not private_key_str: return None project_dir = settings.PROJECT_DIR tmp_dir = os.path.join(project_dir, 'tmp') key_name = '.' + md5(self.private_key.encode('utf-8')).hexdigest() key_path = os.path.join(tmp_dir, key_name) if not os.path.exists(key_path): - self.private_key_obj.write_private_key_file(key_path) + with open(key_path, 'w') as f: + f.write(private_key_str) os.chmod(key_path, 0o400) return key_path def get_private_key(self): - if not self.private_key_obj: + if not self.private_key: return None - string_io = io.StringIO() - self.private_key_obj.write_private_key(string_io) - private_key = string_io.getvalue() - return private_key + return parse_ssh_private_key_str(self.private_key, + password=self.password) @property def public_key_obj(self): diff --git a/apps/common/utils/encode.py b/apps/common/utils/encode.py index 11bd9763b..8a2a13c75 100644 --- a/apps/common/utils/encode.py +++ b/apps/common/utils/encode.py @@ -79,7 +79,7 @@ _supported_paramiko_ssh_key_types = ( def ssh_key_string_to_obj(text, password=None): key = None for ssh_key_type in _supported_paramiko_ssh_key_types: - if not isinstance(ssh_key_type, paramiko.PKey): + if not issubclass(ssh_key_type, paramiko.PKey): continue try: key = ssh_key_type.from_private_key(StringIO(text), password=password)