/
ssh_paramiko.py
78 lines (63 loc) · 2.52 KB
/
ssh_paramiko.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
__author__ = 'Oleg Butovich'
__copyright__ = '(c) Oleg Butovich 2013-2017'
__licence__ = 'MIT'
import os
from proxmoxer.backends.base_ssh import ProxmoxBaseSSHSession, BaseBackend
try:
import paramiko
except ImportError:
import sys
sys.stderr.write("Chosen backend requires 'paramiko' module\n")
sys.exit(1)
class ProxmoxParamikoSession(ProxmoxBaseSSHSession):
def __init__(self, host,
username,
password=None,
private_key_file=None,
port=22,
timeout=5,
sudo=False):
self.host = host
self.username = username
self.password = password
self.private_key_file = private_key_file
self.port = port
self.timeout = timeout
self.sudo = sudo
self.ssh_client = self._connect()
def _connect(self):
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if self.private_key_file:
key_filename = os.path.expanduser(self.private_key_file)
else:
key_filename = None
ssh_client.connect(self.host,
username=self.username,
allow_agent=(not self.password),
look_for_keys=True,
key_filename=key_filename,
password=self.password,
timeout=self.timeout,
port=self.port)
return ssh_client
def _exec(self, cmd):
if self.sudo:
cmd = 'sudo ' + cmd
session = self.ssh_client.get_transport().open_session()
session.exec_command(cmd)
stdout = session.makefile('rb', -1).read().decode()
stderr = session.makefile_stderr('rb', -1).read().decode()
return stdout, stderr
def upload_file_obj(self, file_obj, remote_path):
sftp = self.ssh_client.open_sftp()
sftp.putfo(file_obj, remote_path)
sftp.close()
class Backend(BaseBackend):
def __init__(self, host, user, password=None, private_key_file=None, port=22, timeout=5, sudo=False):
self.session = ProxmoxParamikoSession(host, user,
password=password,
private_key_file=private_key_file,
port=port,
timeout=timeout,
sudo=sudo)