python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件
楔子
我们使用Python避免不了和Linux打交道,而有时我们需要执行一些shell命令。如果在本地的话,那么可以通过调用os.system或者subprocess.Popen来执行,但如果我们希望远程执行其它机器上的shell命令,这个时候该怎么做呢?下面我们就来推荐一个第三方库paramiko,看看如何使用Python远程操作其它机器。
paramiko
网络传输是遵循协议的,比如SSH,paramiko则是实现了SSHv2协议的一个Python第三方库(底层使用的是cryptography)。有了paramiko之后,我们便可以通过Python使用SSH协议来连接远程服务器执行操作,和xshell本质上是类似的。
注意:我们在Python代码中是直接通过SSH协议对远程服务器执行操作,而不是调用ssh命令对远程服务器进行操作。
既然要使用,那么首先要安装,直接pipinstallparamiko即可。
paramiko包含两大核心组件:SSHClient和SFTPClient
SSHClient的作用类似于Linux下的ssh命令,是对SSH会话的封装,通常用于执行远程命令。
SFTPClient的作用类似于Linux下的sftp命令,是对SFTP客户端的封装,用于实现远程文件的操作。比如:文件上传,下载、修改文件权限等操作。
下面我们就来介绍它们的用法。
SSHClient的使用
首先创建一个客户端实例,client=paramiko.SSHClient(),然后这个client下有很多方法。
connect:实现远程服务器的连接与认证
defconnect( self, hostname, port=SSH_PORT, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True, passphrase=None, disabled_algorithms=None, ): """"""
里面参数很多,但常用的参数如下:
- hostname:连接的目的主机,这个参数是必须的
- port=SSH_PORT:指定的端口,默认是22
- username=None:登陆的用户
- password=None:用户密码
- pkey=None:通过私钥进行身份验证
- key_filename=None:一个文件名或文件列表,指定私钥文件
- timeout=None:可选的tcp连接超时时间
- allow_agent=True:是否允许连接到ssh代理,默认为True
- look_for_keys=True:是否在~/.ssh中搜索私钥文件,默认为True,表示允许
- compress=False:是否打开压缩
set_missing_host_key_policy:当远程服务器没有本地秘钥或HostKeys对象时的应对策略,目前支持三种:
- AutoAddPolicy:自动添加主机名以及主机秘钥到本地HostKeys对象,不依赖load_system_host_key的配置,即新建立ssh连接时不需要再输入yes或no进行确认
- WarningPolicy:用于记录一个未知的主机秘钥的Python警告、并且接收;所以它的功能和AutoAddPolicy是类似的,只不过会提示这是新连接
- RejectPolicy:自动拒绝未知的主机名和秘钥,依赖load_system_host_key的配置,该选项为默认选项
所以我们一般都会将策略改成AutoAddPolicy,不然还需要在本地进行配置。
exec_command:远程执行的具体Linux命令
open_sftp:在当前ssh会话的基础上创建一个sftp会话,该方法会返回一个SFTPClient对象,可以执行文件的上传、下载等操作。我们后面在SFTPClient的时候会说。
下面我们来演示一下:
importparamiko #实例化SSHClient client=paramiko.SSHClient() #自动添加策略,保存服务器的主机名和密钥信息;如果不添加,那么不再本地know_hosts文件中的主机将无法连接 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接SSH服务端,通过用户名和密码进行认证 #该过程会创建一个session,它是client和server保持连接的对象 client.connect(hostname='47.94.174.89',port=22,username='root',password='xxxxxxx') #执行远程命令,该方法会打开一个paramiko.Channel对象(类socket,一种安全的SSH传输通道) #会返回三个值,分别是stdin(标准输入)、stdout(标准输出)、stderr(错误输出) stdin,stdout,stderr=client.exec_command("ls/") #打印执行结果,显然我们要通过stdout来查看,我们可以调用stdout.read获取执行的结果 #但是返回的是字节,所以需要先获取对应的编码,然后再进行decode print(stdout.read().decode("utf-8")) """ bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var """ #最后关闭SSHClient对象 client.close()
还是很简单的,如果我们输入了一条错误的命令,那么stdout里面就不会有内容了,因为错误信息会保存是在stderr中。
importparamiko client=paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='47.94.174.89',port=22,username='root',password='xxxxxxx') stdin,stdout,stderr=client.exec_command("xxxxx") print(stderr.read().decode("utf-8")) """ bash:xxxxx:commandnotfound """ client.close()
SFTPClient的使用
SFTPClient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,可以实现远程文件的操作,例如:上传、下载、查看权限和状态等等。
importparamiko #创建一个Transport对象,使用时会同步创建一个paramiko.Channel对象 #参数传递一个由IP和PORT组成的元组即可 transport=paramiko.Transport(("47.94.174.89",22)) #连接ssh,通过username和password transport.connect(username="root",password="xxxxxxx") #获取SFTPClient实例,它便相当于Linux下的sftp,我们通过它可以进行文件的一些操作 sftp=paramiko.SFTPClient.from_transport(transport)
以上我们便得到的sftp,那么它都支持哪些操作呢?
- put(self,localpath,remotepath,callback=None,confirm=True):将本地文件上传到服务器,callback表示回调函数,上传成功后调用;confirm表示是否调用stat方法检查文件状态,返回ls-l的结果
- get(self,remotepath,localpath,callback=None):将文件从服务器下载到本地
- mkdir(self,path,mode=o777):在服务器上创建目录,mode表示权限,默认为511(o777是一个变量,等于511)
- rmdir(self,path):删除服务器上的目录
- remove(self,path):删除服务器上的文件
- rename(self,oldpath,newpath):对服务器上目录进行重命名
- stat(self,path):查看文件或目录的状态
- listdir(self,path='.'):列出服务器目录下的文件
- getcwd(self):查看工作区,也就是当前所在路径
- chmod(self,path,mode):改变权限
- chown(self,path,uid,gid):改变用户和组
- chdir(self,path):改变工作区
常用的大概以上这些,我们来演示一下。
#1.改变工作区 sftp.chdir("/usr/local/bin") #2.查看工作区 print(sftp.getcwd())#/usr/local/bin sftp.chdir("/root") print(sftp.getcwd())#/root """ 如果不调用sftp.chdir(path)的时候,那么打印sftp.getcwd()时结果为None 但我们知道登陆Linux时,默认会在/root目录(对于root用户而言) 对于当前的sftp而言也确实如此,只不过打印sftp.getcwd()的时候结果为None罢了 """ #3.列出当前目录下的文件 print(sftp.listdir("/usr/local"))#['lib','lib64','games','aegis',...] #4.查看文件或目录状态 print(sftp.stat("/root/.ssh/authorized_keys")) """ -rw-------100016Dec13:26? """ #5.改变权限 sftp.chmod("/root/.ssh/authorized_keys",0o777) print(sftp.stat("/root/.ssh/authorized_keys")) """ -rwxrwxrwx100016Dec13:26? """ #6.创建目录 print("dir"insftp.listdir("/root"))#False sftp.mkdir("/root/dir",mode=0o777) print("dir"insftp.listdir("/root"))#True #7.删除目录 sftp.rmdir("/root/dir") print("dir"insftp.listdir("/root"))#False #8.删除文件 sftp.remove("/root/1.py") #9.下载文件 sftp.get("/root/makefile",r"makefile") #10.上传文件 sftp.put("dockerfile","/root/dockerfile") #最后关闭sftp和transport sftp.close() transport.close()
当然我们在介绍SSHClient的时候说过,还可以通过open_sftp的方式来创建sftp客户端。
importparamiko client=paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='47.94.174.89',port=22,username='root',password='xxxxxxx') #这种方式创建也是可以的 sftp=client.open_sftp()
以上就是python基于paramiko库远程执行SSH命令,实现sftp下载文件的详细内容,更多关于pythonparamiko库的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。