paramiko 是python三方的ssh模块,通过socket实现了ssh的功能。
安装下载paramiko模块
pip install paramiko
使用paramiko模块登录Centos7,实现简单的Linux命令操作
import paramiko
# 创建一个ssh的客户端(对象实例化)
ssh = paramiko.SSHClient()
# 创建ssh连接的白名单(实现对服务器访问时,取消询问的效果)
known_hosts = paramiko.AutoAddPolicy()
# 加载白名单到ssh中
ssh.set_missing_host_key_policy(known_hosts)
# 连接我的Centos7服务器
ssh.connect(
hostname = "10.10.21.73", # 主机
port = 22, # 端口号
username= "root", # 用户名
password= "q1q1q1" # 密码
)
# 执行命令
stdin,stdout,stderr = ssh.exec_command("ls /")
# ssh.exec_command() 返回三个类文件对象
# stdin 是写权限的文件对象,标准输入
# stdin 是读权限的文件对象,标准输出
# stderr 是读权限的文件对象,标准错误,特殊的输出
# 查看执行的结果
result = stdout.read().decode()
print(result)
# 关闭连接,释放内存
ssh.close()
基于面向对象的多线程实现ssh登录
Pyhton 多线程模块threading通过Thread类构建新的线程
Thread类当做提供了run方法用于子类继承重写
当run方法被修改,在线程调用start的时候,会调用run的功能作为线程的功能。
import paramiko
import threading
# 定义一个多线程的paramiko类
class ParamikoThreading(threading.Thread): # 继承多线程模块的Thread
def __init__(self,command,host,username,password,port=22):
self.host = host # 初始化主机
self.username = username # 初始化用户名
self.password = password # 初始化密码
self.port = port # 初始化端口号
self.command = command # 初始化命令代码
super(ParamikoThreading,self).__init__() # 继承父类的属性和方法
# 重写父类中的run方法
def run(self):
ssh = paramiko.SSHClient()
know_host = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(know_host)
ssh.connect(
hostname = self.host,
port = self.port,
username = self.username,
password = self.password
)
#执行命令
stdin,stdout,stderr = ssh.exec_command(self.command)
#stdin 标准格式的输入,是一个写权限的文件对象
#stdout 标准格式的输出,是一个读权限的文件对象
#stderr 标准格式的错误,是一个读权限的文件对象
print("=================================================")
print("ip:%s\ncommand:%s\nresult:\n"%(self.host,self.command))
print("-------------------------------------------------")
print(stdout.read().decode()) #读出执行的结果
print("=================================================")
ssh.close() #关闭连接
if __name__ == "__main__":
# 存储多个主机(服务器)
pool = [
dict(host = "10.10.21.73",username = "root", password = "123"),
dict(host = "10.10.21.130",username = "root", password = "123")
]
# 执行命令
command = "ls"
# 存储线程对象
t_pool = []
for host in pool:
# 根据for循环遍历结果创建线程
t = ParamikoThreading(
host = host.get("host","localhost"),
username = host.get("username","root"),
password = host.get("password","123"),
command = command
)
# 将创建的线程存储到列表中
t_pool.append(t)
# 启动线程
for t in t_pool:
t.start()
# 优先执行自己的线程
for t in t_pool:
t.join()
交互式编程(实现Centos中类似的画面效果)
import paramiko
# 创建一个ssh的客户端(对象实例化)
ssh = paramiko.SSHClient()
# 创建ssh连接的白名单(实现对服务器访问时,取消询问的效果)
known_hosts = paramiko.AutoAddPolicy()
# 加载白名单到ssh中
ssh.set_missing_host_key_policy(known_hosts)
# 连接我的Centos7服务器
ssh.connect(
hostname = "10.10.21.73", # 主机
port = 22, # 端口号
username= "root", # 用户名
password= "q1q1q1" # 密码
)
# 实例化一个terminal
shell = ssh.invoke_shell()
# 命令执行的等待时间
shell.settimeout(1)
# 输入命令并回车(\n作用是使命令生效)
command = input(">>>") + "\n"
# 发送命令
shell.send(command)
# 制定死循环,实现输入输出交互式功能
while True:
try:
recv = shell.recv(512).decode() # 接收返回的信息
if recv:
print(recv)
else:
continue
except:
command = input(">>>") + "\n"
shell.send(command)
ssh.close()
效果展示:
paramiko实现文件的上传和下载
import paramiko
trans = paramiko.Transport(
sock=(
"10.10.21.73",22
)
)
trans.connect(
username = "root",
password = "q1q1q1"
)
sftp = paramiko.SFTPClient.from_transport(trans)
# put 上传
# sftp.put("python_paramiko.py","/opt/python.py")
# get 下载
sftp.get("/root/aaa.tar","aaa.tar")
sftp.close()