当前位置: 首页 > 科技观察

大吉巴教你远程执行Linux脚本和命令

时间:2023-03-14 09:09:25 科技观察

如果你需要在Linux服务器上执行一系列命令(比如搭建LNMP环境),我应该马上想办法写一个Shell脚本,并且然后扔上去执行下面的检查结果。但是,我一向懒惰,不想用这种方式去执行Shell和一些重复的命令。于是就想到了一种在本地直接在服务器端执行脚本的方法,想到了异端。这时,某giba告诉我,有一个叫paramiko的Python库,打开了我新世界的大门。对于paramiko安装直接pip或者PyCharm,这里就不多说了。如果您觉得自己对Python语法了解不多,请不要担心。可以使用paramiko简单的执行Shell命令查看结果和上传下载文件。重复性工作。Paramiko实现了SSHv2协议(底层使用密码学),包括两个核心组件:SSHClient和SFTPClient。SSHClient是对SSH会话的封装,用于执行远程命令,SFTPClient是对SFTP客户端的封装,用于实现远程文件操作。下面先举两个例子,大家应该明白怎么用了,最后开始正片。SSHClient实例:#-*-coding:utf-8-*-importparamikoclient=paramiko.SSHClient()#实例化SSHClientclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())#自动添加策略,保存主机名和密钥信息server,如果不添加,本地know_hosts文件中不再记录的hosts将无法连接client.connect(hostname='192.168.23.134',port=22,username='ftoz',password='123456')#连接SSH服务器,使用用户名和密码进行身份验证#打开一个Channel并执行命令stdin,stdout,stderr=client.exec_command('ls')#stdout是正确的输出,stderr是错误的输出,以及有一个变量的值为#PrintexecutionResultprint(stdout.read().decode('utf-8'))#CloseSSHClientclient.close()output:explainhere:client=paramiko.SSHClient(),client.set_missing_host_key_policy(paramiko.AutoAddPolicy())你可以理解为固定姿势。client.connect(hostname='192.168.1.105',port=22,username='ftoz',password='123456')这里是你的linux变量是地址,端口(共65535个端口,但是ssh默认是22端口)、登录名、密码。stdin,stdout,stderr=client.exec_command('df-h')以下是您需要执行的核心shell命令。这三个变量不需要按照这个姿势走,想怎么弄就怎么弄,但是按照顺序知道里面包含的数据是什么就行了(重点是输出和错误)。connect():实现远程服务器连接和认证,参数为:hostnametargethostport=SSH_PORTspecifiedportusername=Noneauthenticationusernamepassword=Noneauthenticationuserpasswordpkey=NoneprivatekeymethodisusedidentityVerifykey_filename=None文件名或文件列表,指定私钥文件timeout=Noneoptionaltcpconnectiontimeoutallow_agent=True,是否允许连接sshagent,默认为True允许在~/.ssh中查找look_for_keys=True查找私钥文件,默认True允许compress=False,是否启用压缩。set_missing_host_key_policy():这个是设置know_hosts文件中没有记录远程服务器时的响应策略。(可以理解为避免报错),参数为:AutoAddPolicy自动将主机名和主机密钥添加到本地的HostKeys对象中,不依赖于load_system_host_key的配置。即当建立新的ssh连接时,不需要输入yes或no进行确认。WarningPolicy用于记录未知主机密钥的python警告。而accept,功能类似AutoAddPolicy,但是会提示新连接RejectPolicy自动拒绝未知主机名和密钥,具体取决于load_system_host_key的配置。这是默认选项exec_command():这是写你需要执行的命令。然后你就可以把输出拿出来,做一些关于做什么(ke)和做什么(pa)的事情。这是一个简单的例子。SFTPClient常用方法:t=paramiko.Transport(('192.168.23.134',22))#获取Transport实例t.connect(username='ftoz',password='123456')#连接SSH服务器,使用密码ftp=paramiko.SFTPClient.from_transport(t)sftp.put("F:\S12312.txt","/home/ftoz/zxc12312.txt")#执行上传动作sftp.get("/home/ftoz/zxc12312.txt","F:\S12312.txt")#执行下载动作t.close()SFTPClient作为sftp客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、permission,statusfrom_transport(cls,t)创建连接的SFTP客户端通道put(localpath,remotepath,callback=None,confirm=True)上传本地文件到服务器参数confirm:是否调用stat()方法检查文件status,returnls-lget(remotepath,localpath,callback=None)的结果从服务器下载文件到本地mkdir()创建服务器上的目录remove()删除服务器上的目录rename()重命名服务器上的目录stat()检查服务器文件状态listdir()列出服务器目录中的文件,最后养成用client.close()关闭的好习惯。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!