ExASIC
分享让工作更轻松

python自动输入密码的神器:pexpect

有时候我们需要,
自动ssh登陆到远程服务器,并执行某个任务,
或者用putty通过ssh协议与服务器来回传文件

最麻烦的是什么?就是每次都要输入密码……

这种重复性的活儿应该交给脚本来做。我们今天就来介绍python的自动输入密码的神器——pexpect。

什么是pexpect

顾名思义,你一定能猜到与expect有什么联系。还不知道什么是expect?好吧,我们先来科普下:

expect是Don Libes发明的tcl脚本语言的一个扩展。可以用于ssh, ftp, passwd, telnet等互交式应用场景。下面的书是其经典之作,想学习tcl的可以阅读一下。

Exploring Expect: A Tcl-based Toolkit for Automating Interactive Programs (Nutshell Handbooks) 1st Edition

expect

https://www.amazon.com/Exploring-Expect-Tcl-based-Automating-Interactive/dp/1565920902/ref=sr_1_1?ie=UTF8&qid=1534210928&sr=8-1&keywords=expect+don+libes

所以,从名字就可以看出pexpect就是用python实现的类似expect的功能的模块。

下载安装

任性安装法(有网有权限):

tar -zxvf pexpect-4.6.0.tar.gz
cd pexpect-4.6.0
python3 setup.py install --prefix /home/xxx
cd ..

tar -zxvf ptyprocess-0.6.0.tar.gz
cd ptyprocess-0.6.0
python3 setup.py install --prefix /home/xxx
cd ..

脚本示例

示例一:
import sys
import pexpect

child = pexpect.spawn("ssh chenfeng@linuxserver 'ls'", logfile = sys.stdout, encoding="utf-8")

try:
    if(child.expect([pexpect.TIMEOUT, 'password'])):
    child.sendline('12345678')
except:
    print(str(child))

try:
    child.expect([pexpect.TIMEOUT, pexpect.EOF])
except:
    print(str(child))
示例二:
import sys
import pexpect

child = pexpect.spawn("pscp test.png billchen@103.105.57.77:/home/billchen", logfile = sys.stdout, encoding="utf-8")

try:
    if(child.expect([pexpect.TIMEOUT, 'password'])):
        child.sendline('12345678')
except:
    print(str(child))

try:
    child.expect([pexpect.TIMEOUT, pexpect.EOF])
except:
    print(str(child))

你可能还感觉不到上面的示例脚本带来的便利性。但如果你有100台远程服务器,想象一下你一个一个敲密码的样子……

参考资料:
python pexpect 学习与探索
https://www.cnblogs.com/tobecrazy/p/3888575.html

Python利用Pexpect模拟ssh交互
https://www.jianshu.com/p/ea53b74c299c

python pexpect ssh 远程登录服务器
https://blog.csdn.net/AcSuccess/article/details/72867959

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA