Python--paramiko

article/2025/10/14 20:34:24

Paramiko

  paramiko模块,基于SSH用于连接远程服务器并执行相关操作。

 

一、安装

1 pip3 install paramiko

二、使用

SSHClient

用于连接远程服务器并执行基本命令

基于用户名密码连接:

import paramiko# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果
result = stdout.read()# 关闭连接
ssh.close()
import paramikotransport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', password='123')ssh = paramiko.SSHClient()
ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()transport.close()SSHClient 封装 TransportSSHClient 封装 Transport

基于私钥进行连接

import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key)# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()# 关闭连接
ssh.close()
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')transport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient()
ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')transport.close()SSHClient 封装 TransportSSHClient 封装 Transport

基于私钥字符进行连接

import paramiko
from io import StringIOkey_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8
NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans
H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e
7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC
tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP
c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A
ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+
c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh
IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8
S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz
zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6
01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC
OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl
HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq
UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65
lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA
539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM
WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH
C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8
RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg
9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/
pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj
98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw
DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI
+MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0=
-----END RSA PRIVATE KEY-----"""private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
transport = paramiko.Transport(('10.0.1.40', 22))
transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient()
ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')
result = stdout.read()transport.close()print(result)基于私钥字符进行连接

SFTPClient

用于连接远程服务器并执行上传下载

基于用户名密码上传下载:

import paramikotransport = paramiko.Transport(('hostname',22))
transport.connect(username='wupeiqi',password='123')sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')transport.close()

基于公钥上传下载

import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')transport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', pkey=private_key )sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')transport.close()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuidclass SSHConnection(object):def __init__(self, host='172.16.103.191', port=22, username='wupeiqi',pwd='123'):self.host = hostself.port = portself.username = usernameself.pwd = pwdself.__k = Nonedef create_file(self):file_name = str(uuid.uuid4())with open(file_name,'w') as f:f.write('sb')return file_namedef run(self):self.connect()self.upload('/home/wupeiqi/tttttttttttt.py')self.rename('/home/wupeiqi/tttttttttttt.py', '/home/wupeiqi/ooooooooo.py)self.close()def connect(self):transport = paramiko.Transport((self.host,self.port))transport.connect(username=self.username,password=self.pwd)self.__transport = transportdef close(self):self.__transport.close()def upload(self,target_path):# 连接,上传file_name = self.create_file()sftp = paramiko.SFTPClient.from_transport(self.__transport)# 将location.py 上传至服务器 /tmp/test.pysftp.put(file_name, target_path)def rename(self, old_path, new_path):ssh = paramiko.SSHClient()ssh._transport = self.__transport# 执行命令cmd = "mv %s %s" % (old_path, new_path,)stdin, stdout, stderr = ssh.exec_command(cmd)# 获取命令结果result = stdout.read()def cmd(self, command):ssh = paramiko.SSHClient()ssh._transport = self.__transport# 执行命令stdin, stdout, stderr = ssh.exec_command(command)# 获取命令结果result = stdout.read()return resultha = SSHConnection()
ha.run()Demodemo
1 # 对于更多限制命令,需要在系统中设置
2 /etc/sudoers
3   
4 Defaults    requiretty
5 Defaults:cmdb    !requiretty
import paramiko
import uuidclass SSHConnection(object):def __init__(self, host='192.168.11.61', port=22, username='alex',pwd='alex3714'):self.host = hostself.port = portself.username = usernameself.pwd = pwdself.__k = Nonedef run(self):self.connect()passself.close()def connect(self):transport = paramiko.Transport((self.host,self.port))transport.connect(username=self.username,password=self.pwd)self.__transport = transportdef close(self):self.__transport.close()def cmd(self, command):ssh = paramiko.SSHClient()ssh._transport = self.__transport# 执行命令stdin, stdout, stderr = ssh.exec_command(command)# 获取命令结果result = stdout.read()return resultdef upload(self,local_path, target_path):# 连接,上传sftp = paramiko.SFTPClient.from_transport(self.__transport)# 将location.py 上传至服务器 /tmp/test.pysftp.put(local_path, target_path)ssh = SSHConnection()
ssh.connect()
r1 = ssh.cmd('df')
ssh.upload('s2.py', "/home/alex/s7.py")
ssh.close()

堡垒机

堡垒机执行流程:

  1. 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
  2. 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
  3. 用户选择服务器,并自动登陆
  4. 执行操作并同时将用户操作记录

注:配置.brashrc实现ssh登陆后自动执行脚本,如:/usr/bin/python /home/wupeiqi/menu.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-from sqlalchemy import create_engine, and_, or_, func, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, DateTime
from sqlalchemy.orm import sessionmaker, relationshipBase = declarative_base()  # 生成一个SqlORM 基类class Host(Base):__tablename__ = 'host'id = Column(Integer, primary_key=True, autoincrement=True)hostname = Column(String(64), unique=True, nullable=False)ip_addr = Column(String(128), unique=True, nullable=False)port = Column(Integer, default=22)class HostUser(Base):__tablename__ = 'host_user'id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(64), unique=True, nullable=False)AuthTypes = [('p', 'SSH/Password'),('r', 'SSH/KEY'),]auth_type = Column(String(16))cert = Column(String(255))host_id = Column(Integer, ForeignKey('host.id'))__table_args__ = (UniqueConstraint('host_id', 'username', name='_host_username_uc'),)class Group(Base):__tablename__ = 'group'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(64), unique=True, nullable=False)class UserProfile(Base):__tablename__ = 'user_profile'id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(64), unique=True, nullable=False)password = Column(String(255), nullable=False)class Group2UserProfile(Base):__tablename__ = 'group_2_user_profile'id = Column(Integer, primary_key=True, autoincrement=True)user_profile_id = Column(Integer, ForeignKey('user_profile.id'))group_id = Column(Integer, ForeignKey('group.id'))__table_args__ = (UniqueConstraint('user_profile_id', 'group_id', name='ux_user_group'),)class Group2HostUser(Base):__tablename__ = 'group_2_host_user'id = Column(Integer, primary_key=True, autoincrement=True)host_user_id = Column(Integer, ForeignKey('host_user.id'))group_id = Column(Integer, ForeignKey('group.id'))__table_args__ = (UniqueConstraint('group_id', 'host_user_id', name='ux_group_host_user'),)class UserProfile2HostUser(Base):__tablename__ = 'user_profile_2_host_user'id = Column(Integer, primary_key=True, autoincrement=True)host_user_id = Column(Integer, ForeignKey('host_user.id'))user_profile_id = Column(Integer, ForeignKey('user_profile.id'))__table_args__ = (UniqueConstraint('user_profile_id', 'host_user_id', name='ux_user_host_user'),)class AuditLog(Base):__tablename__ = 'audit_log'id = Column(Integer, primary_key=True, autoincrement=True)action_choices2 = [(u'cmd', u'CMD'),(u'login', u'Login'),(u'logout', u'Logout'),]action_type = Column(String(16))cmd = Column(String(255))date = Column(DateTime)user_profile_id = Column(Integer, ForeignKey('user_profile.id'))host_user_id = Column(Integer, ForeignKey('host_user.id'))

表结构示例:

实现过程

1.前戏

import paramiko
import sys
import os
import socket
import select
import getpasstran = paramiko.Transport(('10.211.55.4', 22,))
tran.start_client()
tran.auth_password('wupeiqi', '123')# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()#########
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
#########chan.close()
tran.close()

肆意妄为1

import paramiko
import sys
import os
import socket
import select
import getpass
from paramiko.py3compat import utran = paramiko.Transport(('10.211.55.4', 22,))
tran.start_client()
tran.auth_password('wupeiqi', '123')# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()while True:# 监视用户输入和服务器返回数据# sys.stdin 处理用户输入# chan 是之前创建的通道,用于接收服务器返回信息readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)if chan in readable:try:x = u(chan.recv(1024))if len(x) == 0:print('\r\n*** EOF\r\n')breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in readable:inp = sys.stdin.readline()chan.sendall(inp)chan.close()
tran.close()
#!/usr/bin/env python
# -*- coding:utf-8 -*-import paramiko
import sys
import os
import socket
import select
import getpass
from paramiko.py3compat import udefault_username = getpass.getuser()
username = input('Username [%s]: ' % default_username)
if len(username) == 0:username = default_usernamehostname = input('Hostname: ')
if len(hostname) == 0:print('*** Hostname required.')sys.exit(1)tran = paramiko.Transport((hostname, 22,))
tran.start_client()default_auth = "p"
auth = input('Auth by (p)assword or (r)sa key[%s] ' % default_auth)
if len(auth) == 0:auth = default_authif auth == 'r':default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')path = input('RSA key [%s]: ' % default_path)if len(path) == 0:path = default_pathtry:key = paramiko.RSAKey.from_private_key_file(path)except paramiko.PasswordRequiredException:password = getpass.getpass('RSA key password: ')key = paramiko.RSAKey.from_private_key_file(path, password)tran.auth_publickey(username, key)
else:pw = getpass.getpass('Password for %s@%s: ' % (username, hostname))tran.auth_password(username, pw)# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()while True:# 监视用户输入和服务器返回数据# sys.stdin 处理用户输入# chan 是之前创建的通道,用于接收服务器返回信息readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)if chan in readable:try:x = u(chan.recv(1024))if len(x) == 0:print('\r\n*** EOF\r\n')breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in readable:inp = sys.stdin.readline()chan.sendall(inp)chan.close()
tran.close()完整示例(一)完整示例(一)

肆意妄为2

import paramiko
import sys
import os
import socket
import select
import getpass
import termios
import tty
from paramiko.py3compat import utran = paramiko.Transport(('10.211.55.4', 22,))
tran.start_client()
tran.auth_password('wupeiqi', '123')# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()# 获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
try:# 为tty设置新属性# 默认当前tty设备属性:#   输入一行回车,执行#   CTRL+C 进程退出,遇到特殊字符,特殊处理。# 这是为原始模式,不认识所有特殊符号# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器tty.setraw(sys.stdin.fileno())chan.settimeout(0.0)while True:# 监视 用户输入 和 远程服务器返回数据(socket)# 阻塞,直到句柄可读r, w, e = select.select([chan, sys.stdin], [], [], 1)if chan in r:try:x = u(chan.recv(1024))if len(x) == 0:print('\r\n*** EOF\r\n')breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in r:x = sys.stdin.read(1)if len(x) == 0:breakchan.send(x)finally:# 重新设置终端属性termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)chan.close()
tran.close()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import sys
import os
import socket
import getpass
import termios
import tty
import select
from paramiko.py3compat import udef interactive_shell(chan):# 获取原tty属性oldtty = termios.tcgetattr(sys.stdin)try:# 为tty设置新属性# 默认当前tty设备属性:#   输入一行回车,执行#   CTRL+C 进程退出,遇到特殊字符,特殊处理。# 这是为原始模式,不认识所有特殊符号# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器tty.setraw(sys.stdin.fileno())tty.setcbreak(sys.stdin.fileno())chan.settimeout(0.0)while True:r, w, e = select.select([chan, sys.stdin], [], [])if chan in r:try:x = u(chan.recv(1024))if len(x) == 0:sys.stdout.write('\r\n*** EOF\r\n')breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in r:x = sys.stdin.read(1)if len(x) == 0:breakchan.send(x)finally:# 重新设置终端属性termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)def run():hostname = input('请输入主机名: ')tran = paramiko.Transport((hostname, 22,))tran.start_client()username = input('请输入用户名: ')auth = input('请输入密码进行验证(p) 或 (r)sa Key进行验证?')if auth == 'r':path = input('请输入RSA key 路径: ')try:key = paramiko.RSAKey.from_private_key_file(path)except paramiko.PasswordRequiredException:password = getpass.getpass('RSA key password: ')key = paramiko.RSAKey.from_private_key_file(path, password)tran.auth_publickey(username, key)else:pw = getpass.getpass('请输入密码 %s@%s: ' % (username, hostname))tran.auth_password(username, pw)# 打开一个通道chan = tran.open_session()# 获取一个终端chan.get_pty()# 激活器chan.invoke_shell()interactive_shell(chan)chan.close()tran.close()if __name__ == '__main__':run()基于Passwd或者RSA进行登陆操作基于Passwd或者RSA进行登陆操作
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import sys
import os
import socket
import getpass
import termios
import tty
import select
from paramiko.py3compat import udef interactive_shell(chan):# 获取原tty属性oldtty = termios.tcgetattr(sys.stdin)try:# 为tty设置新属性# 默认当前tty设备属性:# 输入一行回车,执行# CTRL+C 进程退出,遇到特殊字符,特殊处理。# 这是为原始模式,不认识所有特殊符号# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器tty.setraw(sys.stdin.fileno())tty.setcbreak(sys.stdin.fileno())chan.settimeout(0.0)while True:r, w, e = select.select([chan, sys.stdin], [], [])if chan in r:try:x = u(chan.recv(1024))if len(x) == 0:sys.stdout.write('\r\n*** EOF\r\n')breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in r:x = sys.stdin.read(1)if len(x) == 0:breakchan.send(x)finally:# 重新设置终端属性termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)def run():db_dict = {'c1.salt.com': {'root': {'user': 'root', 'auth': 'r', "cert": 'key路径'},'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'},},'c2.salt.com': {'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'},},}for row in db_dict.keys():print(row)hostname = input('请选择主机: ')tran = paramiko.Transport((hostname, 22,))tran.start_client()for item in db_dict[hostname].keys():print(item)username = input('请输入用户: ')user_dict = db_dict[hostname][username]if username['auth'] == 'r':key = paramiko.RSAKey.from_private_key_file(user_dict['cert'])tran.auth_publickey(username, key)else:pw = user_dict['cert']tran.auth_password(username, pw)# 打开一个通道chan = tran.open_session()# 获取一个终端chan.get_pty()# 激活器chan.invoke_shell()interactive_shell(chan)chan.close()tran.close()if __name__ == '__main__':run()提示用户选择主机和用户提示用户选择主机和用户
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import sys
import os
import socket
import getpass
import termios
import tty
import select
from paramiko.py3compat import udef interactive_shell(chan):# 获取原tty属性oldtty = termios.tcgetattr(sys.stdin)try:# 为tty设置新属性# 默认当前tty设备属性:# 输入一行回车,执行# CTRL+C 进程退出,遇到特殊字符,特殊处理。# 这是为原始模式,不认识所有特殊符号# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器tty.setraw(sys.stdin.fileno())tty.setcbreak(sys.stdin.fileno())chan.settimeout(0.0)log = open('handle.log', 'a+', encoding='utf-8')flag = Falsetemp_list = []while True:r, w, e = select.select([chan, sys.stdin], [], [])if chan in r:try:x = u(chan.recv(1024))if len(x) == 0:sys.stdout.write('\r\n*** EOF\r\n')break# 如果用户上一次点击的是tab键,则获取返回的内容写入在记录中if flag:if x.startswith('\r\n'):passelse:temp_list.append(x)flag = Falsesys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in r:# 读取用户在终端数据每一个字符x = sys.stdin.read(1)if len(x) == 0:break# 如果用户点击TAB键if x == '\t':flag = Trueelse:# 未点击TAB键,则将每个操作字符记录添加到列表中,以便之后写入文件temp_list.append(x)# 如果用户敲回车,则将操作记录写入文件if x == '\r':log.write(''.join(temp_list))log.flush()temp_list.clear()chan.send(x)finally:# 重新设置终端属性termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)def run():db_dict = {'c1.salt.com': {'root': {'user': 'root', 'auth': 'r', "cert": 'key路径'},'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'},},'c2.salt.com': {'root': {'user': 'root', 'auth': 'r', "cert": 'key路径'},'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'},},}for row in db_dict.keys():print(row)hostname = input('请选择主机: ')tran = paramiko.Transport((hostname, 22,))tran.start_client()for item in db_dict[hostname].keys():print(item)username = input('请输入用户: ')user_dict = db_dict[hostname][username]if username['auth'] == 'r':key = paramiko.RSAKey.from_private_key_file(user_dict['cert'])tran.auth_publickey(username, key)else:pw = user_dict['cert']tran.auth_password(username, pw)# 打开一个通道chan = tran.open_session()# 获取一个终端chan.get_pty()# 激活器chan.invoke_shell()interactive_shell(chan)chan.close()tran.close()if __name__ == '__main__':run()提示用户选择主机和用户(记录操作日志)提示用户选择主机和用户(记录操作日志)

更多参见:paramoko源码 https://github.com/paramiko/paramiko 

武沛齐:http://www.cnblogs.com/wupeiqi/p/5699254.html

Alex堡垒机:http://www.cnblogs.com/alex3714/articles/5286889.html 


http://chatgpt.dhexx.cn/article/AfR4oHei.shtml

相关文章

Python笔记之paramiko模块安装和使用示例

一、paramiko模块简介 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,基于linux中的ssh服务 。paramiko是第三方模块,需要我们单独安装。通过paramiko模块,我们可以利用python代码程序实现对…

【Python-自动化】paramiko模块

文章目录 运维自动化Python一、模块介绍二、模块应用1.使用paramiko模块,通过ssh协议连接服务器2.解决首次连接known_hosts问题3、执行命令exec_command方法扩展:使用try异常捕获 4、多台服务器执行命令5、从服务器上传下载文件--SFTPClient方法6、多台服…

HttpClient和HtmlUnit的比较总结以及使用技巧(一)

大家在做爬虫、网页采集、通过网页自动写入数据时基本上都接触过这两个组件(权且称之为组件吧),网上入门资料已经很多了,我想从实际的应用角度谈谈我对于这两个组件的看法,并记录在博客中,以便日后翻阅&…

htmlUnit的读取js渲染的页面

htmlUnit的读取js渲染的页面 我这边有个这么的需求,要求前端每次上版本的时候,有一个版本号。然后后端去爬前端,比较禅道的版本发布计划,如果发布计划和生产上的版本号不一致,就告警。 这个跟后端的jar包&#xff0c…

HtmlUnit

HtmlUnit是什么?看下介绍: A java GUI-Less browser, which allows high-level manipulation of web pages, such as filling forms and clicking links; just getPage(url), find a hyperlink, click() and you have all the HTML, JavaScript, and A…

HtmlUnit使用

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。是junit的扩展之一,它采用…

【转】 HtmlUnit简介

HtmlUnit简介: 引自 http://www.javaeye.com/topic/166702 HtmlUnit 是 JUnit 的扩展测试框架之一。HtmlUnit 将返回文档模拟成 HTML,这样您便可以直接处理这些文档了。HtmlUnit 使用例如 table、form 等标识符将测试文档作为 HTML 来处理。它同样需要遵…

HtmlUnit(Java) - 快速入门学习 - 无界面浏览器

文章目录 1. 概述2. 注意2.0 js解析问题2.1 关闭HtmlUnit日志 3. 使用3.1 抓取IT之家周榜内容 - 单页面3.2 抓取IT之家周榜第九篇文章的内容 - 双页面3.3 模拟用户操作 - (这个功能个人感觉非常非常的鸡肋,只能用于非常简单的JS,但是一般网站…

【零基础】快速入门爬虫框架HtmlUnit

迅速的HtmlUnit htmlunit是一款开源的web页面分析工具,理论上来说htmlunit应用于网页的自动化测试,但是相对来说更多人使用它来进行小型爬虫的快速开发。使用htmlunit进行爬虫开发不仅是其运行速度快,更重要的是此框架上手更为容易&#xff0…

保研之路——哈深计算机预推免

哈深计算机预推免 个人情况高校复试参与情况哈工深计算机学院直硕(7.20)结语 嗯!抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴,希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去(除了时…

哈工大计算机学院统一复试划线,哈工大计算机专业,复试比例101%,擦线党没戏了...

原标题:哈工大计算机专业,复试比例101%,擦线党没戏了 这几天哈工大各院系公布了复试线及复试名单,其中「计算机学院」的复试考生比例居然是101%。 哈工大2020年计算机专业的考研复试线为320分(学术学位),以及专业学位的…

【2024考研】哈工大计算机考研854会改成408吗?优缺点分析?怎么复习?哈工大卓越工程师学院点击就送吗?

文章目录 1.哈工大计算机考研专业课的发展历史2.哈工大卓越工程师学院点击就送吗?3.哈工大计算机854会改成408吗?4.哈工大计算机854的优缺点分析4.1 优点4.2 缺点 5.哈工大计算机854怎么复习?5.1 计算机系统(CSAPP)复习指导5.2 计算机网络复习…

【考研】哈尔滨工业大学计算机考研854复习资料

哈尔滨工业大学计算机考研854复习资料 0. 考研初试&复试经验贴1. 初试专业课复习资料资源1.1 复习资料下载1.2 复习资料清单 2. 初试专业课复习资料使用指南2.1 CSAPP资料2.2 数据结构资料2.3 计算机网络资料 更新历史: 2022年4月22日完成初稿2022年5月7日加入…

计算机排名哈工大第三,国内计算机高校排名:哈工大稳坐第2,浙江大学第3,西电第8...

QS世界大学计算机H指数(H指数为混合量化指标,可用于评估研究人员的学术产出量和学术产出水平)前50名中,中国有9所(包括香港大学3所)上榜,前100名中有清华大学、哈工大学、浙江大学等14所世界一流大学建设高校,学校有西安电子科技大…

哈工大深圳计算机就业质量报告,多所高校公布毕业生平均年薪,南京大学和哈工大(深圳)数据亮眼...

原标题:多所高校公布毕业生平均年薪,南京大学和哈工大(深圳)数据亮眼 对于高中学子而言,在将来报考大学时,除了根据自己的兴趣爱好之外,还比较关注对应高校的就业率以及就业质量。毕竟将来大学毕业后还是要走向社会就业的。所以就业后的薪资待遇就成了大家乐意关注的一个点…

哈工大2021秋机器学习期末试题

哈工大2021秋机器学习期末试题 刚刚经历了机器学习复习和考试,这过程简直是太折磨了。 这门课的期末考试往年题还是很有参考价值的。所以我在考试的时候抽了点时间把期末题记了一下,希望能对学弟、学妹(如果有的话)考前复习有所…

哈尔滨工程大学计算机学院保研政策,哈工大保研条件(哈工大2019保研政策)

哈工大保研条件(哈工大2019保研政策) 2020-05-08 10:50:43 共10个回答 去年保研的确实增加了,主要是总校的增加了(40%多),深圳和威海的基本上变化不大,保研率没有超过40%.但是值得特别注意的是,复试中取消了前25%免除笔试的原则.以至于好多总校和威海前25%的同学虽进入复试,却因…

2020哈工大(威海)计算机夏令营面试

2020哈工大威海计算机夏令营面试 6月底收到哈工大(威海)的入营通知,当时我正在参加中南大学的夏令营,因为我校往届也有好多学长学姐保研到哈威,所以入营概率相对较大,也算是我夏令营拿到的为数不多的入营,另外三个分别…

哈工程计算机系保研率,武汉理工VS哈工程,20保研率哈工程高,哪所值得考?学长精准分析...

对于国内的很多工科高校,由于主打的专业都是国民经济不可或缺的专业,但由于近几年实体经济不景气,很多考生都转而报考计算机相关专业、财经类专业,以前很吃香的航空航天类、电气类、材料类专业都不再受热捧,但这类学校…

哈师大计算机学院宿舍,新生攻略|哈师大所有的“秘密”都在这了

原标题:新生攻略|哈师大所有的“秘密”都在这了 你好,我是哈师大17级的新生,我想全面的了解一下咱们学校,应该去哪了解呀? 这你可算是问对人了,听说最近哈尔滨师范大学学生会的官方微信平台出了非常全的新生攻略呢,快关注它们的公众号(hsdxsh)看看吧! 哇!这么棒!我要…