背景说明:

我们在开发服务器或运维过程中,需要登录Linux进行下载数据、上传数据、执行脚本等操作。如果你习惯了windows系统,不希望用使用Xshell或者Mobax或者Linux操作系统进行操作,那么python提供了一个非常方便的第三方库,供您在windows下远程登录Linux。这里总结了一下非公钥密钥操作linux的几种方法:

关注“测试开发自动化” 弓中皓,获取源码)


1. 远程登陆

import paramiko

ssh = paramiko.SSHClient() # 创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机。即:解决问题:如果之前没有,连接过的ip,会出现选择yes
# 连接服务器(根据自己的情况选择)
ssh.connect(hostname='192.168.xxx.xxx', username='xxx', password='xxx') # 用户名和密码登录
stdin, stdout, stderr = ssh.exec_command('ls -lh')
result = stdout.read().decode('utf-8') # 获取命令结果
print(result) # 输出返回的结果
ssh.close() # 关闭连接

2. 文件上传下载

方法一:关注“测试开发自动化” 弓中皓,获取源码)

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.xxx.xxx', username='xxxx', password='xxxx')

sftp = ssh.open_sftp()
sftp.put(r'D:\xxxx\xxxx.sh', '/home/xxxx/xxxx.sh') # 将windows文件上传至Linux
sftp.get('/home/xxxx/xxxx.sh', r'D:\xxxx\xxxx.sh') # 将Linux文件下载至windows

sftp.close()

stdin, stdout, stderr = ssh.exec_command('sh /home/xxxx/xxxx.sh') # 运行sh文件
result = stdout.read().decode('utf-8')
print(result)
ssh.close()

方法二:关注“测试开发自动化” 弓中皓,获取源码)

import paramiko

#获取Transport实例
tran = paramiko.Transport("192.168.xxx.xxx", 22)
#连接SSH服务端
tran.connect(username="xxx", password="xxx")
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
#设置上传的本地/远程文件路径
localpath= r"D:\xxxx\xxxx.py" #本地文件路径
remotepath= r"/home/xxxx/xxxx.py" #上传对象保存的文件路径
#执行上传动作
sftp.put(localpath, remotepath)
# 执行下载动作
sftp.get(remotepath, localpathwen)
tran.close()

3. sudo权限:

关注“测试开发自动化” 弓中皓,获取源码)

import paramiko

hostname = "192.168.xxx.xxx"
username = 'ubuntu'
password = 'ubuntu'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, username=username, password=password)

stdin, stdout, stderr = ssh.exec_command('sudo reboot', get_pty=True) # sudo权限
stdin.write('ubuntu'+'\n') # 输入密码

result = stdout.read().decode('utf-8')
print(result)
ssh.close()

4. 批量链接

关注“测试开发自动化” 弓中皓,获取源码)

import paramiko
from paramiko.ssh_exception import NoValidConnectionsError
from paramiko.ssh_exception import AuthenticationException


def connect(cmd, hostname,port=22,username='root',passwd='westos'):
##1.创建一个ssh对象
client = paramiko.SSHClient()
#2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
##自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#3.连接服务器
try:
client.connect(hostname=hostname, port=port, username=username, password=passwd)
print('正在连接主机%s......'%(hostname))

except NoValidConnectionsError as e: ###用户不存在时的报错
print("连接失败")
except AuthenticationException as t: ##密码错误的报错
print('密码错误')
else:
#4.执行操作
stdin,stdout, stderr = client.exec_command(cmd)
#5.获取命令执行的结果
result=stdout.read().decode('utf-8')
print(result)
#6.关闭连接
finally:
client.close()

# 为提高效率,此处建议使用多线程
connect('ls -h', hostname='192.168.20.184', username='mech_mind_sdk', passwd='mechmind')
connect('ls -h', hostname='192.168.20.52', username='mechmind', passwd='mechmind')

如果对您有帮助,点个关注再走吧!!!