背景说明:
我们在开发服务器或运维过程中,需要登录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.xxx.xxx', username='Xxxx', passwd='xxx') connect('ls -h', hostname='192.168.xxx.xxx', username='xxxx', passwd='xxxx')
如果对您有帮助,点个关注再走吧!!!
文章知识点与官方知识档案匹配,可进一步学习相关知识