导航:首页 > 编程语言 > python原生ssh模块

python原生ssh模块

发布时间:2025-06-10 18:47:29

A. 如何python3.4使用pexpect来实现SSH登陆

Pexpect 是 Don Libes 的 Expect 语言的一个 Python
实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect
的使用范围很广,可以用来实现与 ssh、ftp 、telnet
等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

在shell里面用过pexpect的人,相信都会很熟悉这种工具,pexpect是expect的python的一个实现,利用python来操作某些交互式的自动化任务是非常方便的。

如何在linux下安装?
1,使用wget https://pypi.python.org/pypi?:action=show_md5&digest= 下载
2,使用tar -zxvf pexpect-3.3.tar.gz解压
3,使用python setup.py install进行安装
ok,上面的步骤,执行完成之后,我们就可以来写个demo测试一下了,另外注意兼容问题,散仙的python是3.4,所以要下载支持python3.4的pexpect,如果你的python版本是2.x那么就要下载2.x的pexpect来使用。
下面是散仙模拟SSH登陆一台机器并打印磁盘情况,然后退出的例子:
#!/usr/local/python3.4/bin/python3.4
import pexpect
ip="192.168.46.22"
name="root"
pwd="abc"
#发送命令执行交互
child=pexpect.spawn('ssh %s@%s' % ("root",ip) )
#
child.expect ('password:')
child.sendline(pwd)
child.expect('$')
child.sendline('df -h')
#发送命令
child.sendline("exit")
child.interact()
#关闭pexpect
child.close()

执行结果如下:
Last login: Wed Oct 22 18:35:08 2014 from 192.168.46.31
exit[root@ganglia ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_ganglia-lv_root 30G 3.6G 25G 13% /
tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 485M 32M 428M 7% /boot
[root@ganglia ~]# exit
logout
Connection to 192.168.46.22 closed.
[root@master 2012]#
本文只是一个简单的例子,可能觉得没有必要使用python来完成,但当系统管理规模一旦大起来的话,使用python来自动化管理是非常轻松的一件事。

B. 纯干货!python 在运维中的应用 (一):批量 ssh/sftp

日常工作中需要大量、频繁地使用ssh到服务器查看、拉取相关的信息或者对服务器进行变更。目前公司大量使用的shell,但是随着逻辑的复杂化、脚本管理的精细化,shell已经不满足日常需求,于是我尝试整合工作中的需求,制作适合的工具。 由于管理制度的缺陷,我以工作流程为核心思考适合自己的运维方式,提升工作效率,把时间留给更有价值的事情。 完整代码在最后,请大家参考。

生产:4000+物理服务器,近 3000 台虚拟机。

开发环境:python3.6、redhat7.9,除了paramiko为第三方模块需要自己安装,其他的直接import即可。

批量执行操作是一把双刃剑。批量执行操作可以提升工作效率,但是随之而来的风险不可忽略。

风险案例如下:

挂载很多数据盘,通常先格式化硬盘,再挂载数据盘,最后再写入将开机挂载信息写入/etc/fstab文件。在批量lsblk检查硬盘信息的时候发现有的系统盘在/sda有的在/sdm,如果不事先检查机器相关配置是否一致直接按照工作经验去执行批量操作,会很容易造成个人难以承受的灾难。

在执行批量操作时按照惯例:格式化硬盘->挂载->开机挂载的顺序去执行,假设有的机器因为某些故障导致格式化硬盘没法正确执行。在处理这类问题的时候通常会先提取出失败的ip,并再按照惯例执行操作。运维人员会很容易忽略开机挂载的信息已经写过了,导致复写(这都是血和泪的教训)。

所以,为了避免故障,提升工作效率,我认为应当建立团队在工作上的共识,应当遵守以下原则:

当然,代码的规范也应当重视起来,不仅是为了便于审计,同时也需要便于溯源。我认为应当注意以下几点:

1、ssh no existing session,sftp超时时间设置:

在代码无错的情况下大量ip出现No existing session,排查后定位在代码的写法上,下面是一个正确的示例。由于最开始没考虑到ssh连接的几种情况导致了重写好几遍。另外sftp的实例貌似不能直接设置连接超时时间,所以我采用了先建立ssh连接再打开sftp的方法。

2、sftp中的get()和put()方法仅能传文件,不支持直接传目录:

不能直接传目录,那换个思路,遍历路径中的目录和文件,先创建目录再传文件就能达到一样的效果了。在paramiko的sftp中sftp.listdir_attr()方法可以获取远程路径中的文件、目录信息。那么我们可以写一个递归来遍历远程路径中的所有文件和目录(传入一个列表是为了接收递归返回的值)。

python自带的os模块中的os.walk()方法可以遍历到本地路径中的目录和文件。

3、多线程多个ip使用sftp.get()方法时无法并发。

改成多进程即可。

4、多个ip需要执行相同命令或不同的命令。

由于是日常使用的场景不会很复杂,所以借鉴了ansible的playbook,读取提前准备好的配置文件即可,然后再整合到之前定义的ssh函数中。


同时,我们还衍生出一个需求,既然都要读取配置,那同样也可以提前把ip地址准备在文件里。正好也能读取我们返回的执行程序的结果。

参数说明:

密码认证:

公钥认证:

可以配合 grep,awk 等命令精准过滤。

个人认为 Python 在初中级运维工作中的性质更像是工具,以提升工作效率、减少管理成本为主。可以从当前繁琐的工作中解脱出来,去 探索 更有价值的事情。python 本质上并不会减少故障的产生,所以在不同的阶段合理利用自身掌握的知识解决当前最重要的痛点,千万不要本末倒置。

阅读全文

与python原生ssh模块相关的资料

热点内容
g300s怎么编程 浏览:768
我的世界手机版命令方块指令力量 浏览:739
辽宁小学生编程班 浏览:122
androidjni入门 浏览:616
三菱数控车床怎样编程 浏览:785
把一个文件解压到目录下 浏览:154
程序员学唱歌 浏览:703
社区看病的下的什么app 浏览:469
女生爱命令 浏览:650
安卓为什么没有广告 浏览:892
服务器2m是什么意思 浏览:995
什么app可以玩数字货币 浏览:835
linux常用命令root 浏览:353
什么是io编程 浏览:891
江恩pdf 浏览:914
程序员为什么越来越喜欢用笔记 浏览:998
c盘uu文件夹能删掉吗 浏览:590
小金龙app有什么用 浏览:813
捂脸编程图片大全 浏览:214
文件目录加密方法 浏览:698