使用pexpect执行SSH操作时,.expect方法字符转义及匹配问题求助
问题解决思路
首先,你犯了一个核心错误:你通过SSH登录的是shobhit普通用户,而非root用户,所以登录后不会直接出现root@worker01:~#的提示符,这才是匹配失败的根本原因。
修正步骤:
- 先匹配普通用户的提示符(普通用户提示符结尾一般是
$,root用户是#) - 如果需要执行root权限命令,先通过
su root或sudo -i切换到root用户,再匹配root提示符 - 正则里的
#不是特殊元字符,不需要转义;$是正则行尾符,要匹配提示符里的$需要转义,建议用**原始字符串(r'')**避免双重转义的麻烦
修正后的代码示例:
#!/usr/bin/python3 import pexpect # 启动SSH连接 child = pexpect.spawn('ssh shobhit@xxx.xx.xx.xx') # 匹配密码输入提示 child.expect(r'shobhit@.*password:') child.sendline('y@9') print('Logged In') # 匹配普通用户的提示符 child.expect(r'shobhit@.*:~\$') # 切换到root用户(替换为你的root密码) child.sendline('su root') child.expect(r'Password:') child.sendline('your_root_password') # 匹配root用户的提示符 child.expect(r'root@.*:~#') # 执行hostname命令 child.sendline('hostname') # 匹配命令执行后的提示符,获取输出内容 child.expect(r'root@.*:~#') # 解码bytes为字符串,去除多余换行和空格 print(child.before.decode().strip()) print('Got Hostname') # 退出root回到普通用户 child.sendline('exit') child.expect(r'shobhit@.*:~\$') # 退出SSH连接 child.sendline('exit') print('Logged Out')
额外注意点:
child.before是bytes类型,必须用decode()转换成字符串才能正常显示- 用原始字符串
r''定义正则,可以避免Python字符串的转义冲突 - 如果不需要切换root,直接在普通用户下执行
hostname,对应的提示符匹配改成shobhit@.*:~\$即可
内容的提问来源于stack exchange,提问作者Lalit Kumar Singh
相关产品推荐
相关产品推荐

