1)实现了ssh协议
2)实现ssh远程控制
3)实现sftp功能
import paramiko #安装后导入模块
#创建实例
ssh = paramiko.SSHClient()
#相当于在询问是否接受服务器秘钥时自动回答yes
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.59.112',username='root',password='211314')
"""
a.标准输入 用于实现交互式命令
b.标准输出 保存命令的正确执行结果
c.标准错误输出 保存命令的错误信息
"""
a ,b ,c = ssh.exec_command('mkdir /root/newdir')
print(str(b.read()))
ssh.close
案例代码,查看多台服务器的磁盘使用率(此代码演示查看192.168.59.131-132)
import paramiko
import sys
def sshExecCMD(ip , uesrname , password ):
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
print("请求%s:" % ip)
try:
ssh_client.connect(hostname=ip ,username=uesrname ,password=password)
except Exception as e:
print("服务器%s连接失败!!!" % ip)
print(e)
sys.exit()
stdin ,stdout ,stderr = ssh_client.exec_command("df -h")
print(stdout.read().decode("utf-8"))
ssh_client.close()
if __name__ == '__main__':
for i in range(131, 133):
server = {
'192.168.59.' + str(i): {
"username": "root",
"password": "211314",
#"port": 22
}
}
for ip, info in server.items():
sshExecCMD(
ip=ip,
uesrname=info.get("username"),
password=info.get("password"),
#port=info.get("port")
)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/usr/bin/python3.7 /root/PycharmProjects/pythonProject/webone.py
请求192.168.59.131:
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 4.4G 3.7G 744M 84% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 1.9G 12K 1.9G 1% /var/lib/kubelet/pods/33185cf6-cdfe-4e1e-9a31-e8de94263fa3/volumes/kubernetes.io~secret/flannel-token-xkp6d
tmpfs 1.9G 12K 1.9G 1% /var/lib/kubelet/pods/846866a4-0983-4977-946b-0d91e5576b90/volumes/kubernetes.io~secret/kube-proxy-token-nxmps
overlay 4.4G 3.7G 744M 84% /var/lib/docker/overlay2/c585e004fd183248031ba2bd41ceaeca30aba69e4c29842c61c5b33caace5827/merged
shm 64M 0 64M 0% /var/lib/docker/containers/2bf609ddce0c66f1313210b63aa03997ac073b56466a3426504b2ce6005c0193/mounts/shm
overlay 4.4G 3.7G 744M 84% /var/lib/docker/overlay2/0e1cf81dbe957116a576033c11cb2d470517eac9daf8071488a43826e7740d7c/merged
overlay 4.4G 3.7G 744M 84% /var/lib/docker/overlay2/6cff54918ae7b8ba0f9acc38ae2481aa9602039a4471c01f651a301df163a01a/merged
shm 64M 0 64M 0% /var/lib/docker/containers/94f5576393ba10fc9e7515d5c70722e3738ebed8ebf1a4d98bcde259f15ff50a/mounts/shm
overlay 4.4G 3.7G 744M 84% /var/lib/docker/overlay2/c709ceeb38a5fe3f310466607d79d74f6cde1bf0089384f214a7322d3d366207/merged
tmpfs 378M 0 378M 0% /run/user/0
请求192.168.59.132:
服务器192.168.59.132连接失败!!!
[Errno None] Unable to connect to port 22 on 192.168.59.132
进程已结束,退出代码为 0
paramiko上传下载文件
#coding:utf-8
import paramiko
def sshFile():
#与服务器创建ssh连接
ssh_conn = paramiko.Transport(("192.168.59.128", 22))
ssh_conn.connect(username="root", password="211314")
#基于ssh连接创建ftp客户端
ftp_client = paramiko.SFTPClient.from_transport(ssh_conn)
#下载文件 上传和下载要保证客户端和服务端的文件名一致 ./.*?/name == ..*?name
ftp_client.get('/etc/hosts',r'E:learndjhosts')
#上传文件
#ftp_client.put(r"E:learndjhosts","/mnt/hosts")
ssh_conn.close()
if __name__ == '__main__':
sshFile()
paramiko往多个服务器上传案例
# coding:utf-8
import paramiko
import os
# localfile:本地文件夹名
# remotedir:服务器目录名称
def sshPutFile(ip, port, username, password, localfile, remotedir):
# 创建ssh链接
ssh_conn = paramiko.Transport((ip, port))
ssh_conn.connect(username=username, password=password)
# 获取源文件的文件名
file_name = os.path.basename(localfile)
# 处理服务器目录名称 /etc/
if not remotedir.endswith("/"):
remotedir = remotedir + "/"
system_file = remotedir + file_name
ftp_client = paramiko.SFTPClient.from_transport(ssh_conn)
ftp_client.put(localfile, system_file)
ssh_conn.close()
if __name__ == '__main__':
servers = {
"192.168.59.128":{
"username": "root",
"password": "211314",
"port": 22
},
"192.168.59.130": {
"username": "root",
"password": "211314",
"port": 22
},
"192.168.59.131": {
"username": "root",
"password": "211314",
"port": 22
}
}
source_file = input("源文件名称(绝对路径):")
server_dir = input("服务器目录路径:")
for ip,info in servers.items():
sshPutFile(
ip= ip,
port= info.get("port"),
username= info.get("username"),
password= info.get("password"),
localfile = source_file,
remotedir= server_dir,
)
查看是否上传成功,根据需求写获取ip的方式,此方式仅供参考,配置数量较大是可以采用多线程的方式增加效率。



