我正在参加「掘金·启航计划」
最近的日常运维业务中,经常需要在大量linux机器上处理一些东西去处理一些几乎重复的步骤,美其名曰配置环境,实则重复业务太多,一天也只能干这一件事。为了能够简化重复业务,我进行了方式探究。
这里向大家分享使用Python中的paramiko库进行远程服务器的操作,方便大家后续运行维护时使用。
分析日常业务,可以将这个问题分解为3个方面,执行命令,上传文件,下载文件。
建立与关闭连接
import paramiko
hostname = 'some_ip'
port = 22
username = 'root'
password = 'pwd'
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh_client.connect(hostname=hostname, port=port, username=username, password=password)
ssh_client.close()
其中,hostname是主机的IP,port是用于连接的端口,一般为22,username和password是登陆机器的账户和密码,需要确保用户具有执行后续步骤的权限。在下面建立了一个ssh客户端ssh_client,设置了自动添加ssh证书,并进行了连接,设置自动证书是为了不要询问ssh key的添加。
执行命令并查看结果
stdin, stdout, stderr = ssh_client.exec_command("ls")
res, err = stdout.read(), stderr.read()
result = res if res else err
print(str(result, encoding='utf-8'))
命令一般分为输入流、输出流和错误流,将命令的结果分为这三个部分,得到的是二进制,将其转换编码可以正常查看。
还可以通过数据判断命令是否成功。
上传文件
上传文件常用于向主机发送配置文件、软件包等功能,在前面建立连接的基础上,通过获取transport来建立文件连接。
tran=ssh_client.get_transport()
sftp=paramiko.SFTPClient.from_transport(tran)
sftp.put(r'te.py', '/root/te.py')
sftp.close()
这里分为两个步骤,先获取transport,再通过transport建立sftp客户端,需要注意的是,put的本地路径和远程路径都是文件路径,而不是文件夹路径,第一个是本地路径,第二个是远程路径。如果上传到的文件夹还不存在,需要先执行命令去创建。
下载文件
下载文件常用于收集一些机器上的日志,或者命令的执行结果等功能。与上一节的功能基本类似,使用sftp的get方法。
sftp.get('/root/te.py','xxx.py')
这里也是需要将这个文件名全部写出来。第一个参数是远程的路径,第二个是本地的。
结合这几个部分,我们只要先制定好流程,通过命令与上下传文件结合的方式,批量布置机器。