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

Python足以远程连接服务器

时间:2023-03-12 23:58:34 科技观察

简介在日常工作中,经常需要通过SSH连接到多个远程服务器来完成各种任务。当需要操作的服务器很多,需要执行的任务涉及到很多命令时,如果可以通过自动化的方式模拟SSH连接和命令执行的繁琐过程,大大提高了工作效率。在这篇文章中,我将带大家学习如何使用Python中一个非常强大的fabric库来自动化常见的远程服务器连接管理操作:1.使用fabric玩转远程服务器管理。基于强大的paramiko、invoke等库,fabric构建了一整套简单易用的API,让我们可以用简单的语句来应对各种常见的远程服务器操作。使用pipinstallfabric完成安装。本文演示对应版本为2.6。1、连接远程服务器,执行终端命令建立和保持与远程服务器的连接,我们需要实例化fabric.Connection(),它的基本参数是:"host:"str类型,格式为'username@host:port',其中':port'部分可以省略,默认端口为22"connect_kwargs:"dict类型,用于传入连接所需的其他参数,常用的有:其他可用参数你可以去到https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.connect的参数了解更多信息。"password:"str类型,使用密码连接时,用于传入host参数对应的密码"pkey:"str类型,使用私钥连接时,用于设置对应的key"timeout:"float类型,用于设置TCP连接的超时时间(单位:秒)"config:"fabric.Config类型,用于设置更复杂的功能参数,参见https://docs.fabfile.org/en/2.6/apidetails/config.html首先看一个基础的例子:fromfabricimportConnection#建议更改ssh连接需要的参数user='username'host='hostaddress'password='password'#使用fabric.Connection快速创建一个connectionc=Connection(host=f'{user}@{host}',connect_kwargs=dict(passwordpassword=password))#使用run方法直接执行传入命令c.run('pwd');可以看到,很简单连接服务器执行指定命令的过程就完成了,通过stdout属性可以保存run()方法执行的命令打印的结果:#hide=True抑制run()进程自动打印执行结果output=c.run('df-h',hide=True).stdoutprint(output)学习了fabric的基本用法之后,我们来学习一些进阶内容:2.配置sudo命令自动预填众所周知的密码,对于非root用户,在执行一些权限较高的命令时需要加上sudo前缀,而在session时需要手动输入当前用户的密码是第一次执行。在fabric中,有两种方法可以实现这一步的自动化:(1)方法一:通过invoke.Responder,我们可以配合invoke.Responder实现当命令行返回密码输入提示时,自动输入并执行指定的command:frominvokeimportResponder#配置命令行内容监控规则sudopass=Responder(pattern=f'\[sudo\]passwordfor{user}:',response=password+'\n')#注意需要设置pty=Truec.run('sudopwd',pty=真,观察者=[sudopass]);(2)方法二:使用fabric.Config设置sudo密码除了前面的方法,我们还可以使用fabric.Config在创建连接时一次性预先配置sudo密码。后面需要执行sudo命令时,使用sudo()方法代替run()方法:fromfabricimportConfig#Pre-configurethesudopasswordconfig=Config(overrides={'sudo':{'password':password}})c=Connection(host=f'{user}@{host}',connect_kwargs={'password':password},configconfig=config)c.sudo('pwd');3、远程文件传输很多朋友都知道可以使用pscp和xshell类工具在服务器和本地之间手动传输文件。我们还可以在fabric中自动执行这些任务:(1)将文件从本地上传到服务器。使用put()方法将指定的本地文件上传到服务器。指定位置,远程参数对应服务器目标存储位置:c=Connection(host=f'{user}@{host}',connect_kwargs={'password':password})#创建示例文件withopen('file_transfer.txt','w')asd:d.write('1')#使用put方法上传到服务器c.put('file_transfer.txt',remote='/home/feffery/')#打印上传文件的内容c.run('cat/home/feffery/file_transfer.txt');(2)从服务器下载指定文件到本地反之,当我们需要从服务器到本地,我们可以使用get()方法:c=Connection(host=f'{user}@{host}',connect_kwargs={'password':password})#Appendthelinetotheendof文件c.run('echo"\n2">>file_transfer.txt')c。get('/home/feffery/file_transfer.txt')print(打开('file_transfer.txt').read())