有时候我们需要,
自动ssh登陆到远程服务器,并执行某个任务,
或者用putty通过ssh协议与服务器来回传文件
最麻烦的是什么?就是每次都要输入密码……
这种重复性的活儿应该交给脚本来做。我们今天就来介绍python的自动输入密码的神器——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
所以,从名字就可以看出pexpect就是用python实现的类似expect的功能的模块。
任性安装法(有网有权限):
下载源码包(pexpect-4.6.0.tar.gz, ptyprocess-0.6.0.tar.gz)
安装
第4行:
spawn作用是运行子程序,比如ssh登陆命令:ssh chenfeng@linuxserver 'ls',其中ls是ssh登陆后自动执行的命令,执行完命令自动退出ssh。
logfile = sys.stdout的作用是把ssh执行的输出结果实时打印到当前终端。默认情况是看不到ssh的执行结果的。
encoding="utf-8",是指定把ssh的byte类型自动转换成string类型。
第7、8行:
expect是作用检测ssh的输出,是否包含‘password'字符串。一旦检测到了'password',就调用sendline来发送密码‘12345678’。
第13行:
EOF是检测ssh命令退出。
第4行:
用putty的pscp命令来传文件:pscp test.png billchen@103.105.57.77:/home/billchen
第7、8行:
检测到password提示字符串后,自动回复密码。
你可能还感觉不到上面的示例脚本带来的便利性。但如果你有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