You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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')

额外注意点:

  1. child.before是bytes类型,必须用decode()转换成字符串才能正常显示
  2. 用原始字符串r''定义正则,可以避免Python字符串的转义冲突
  3. 如果不需要切换root,直接在普通用户下执行hostname,对应的提示符匹配改成shobhit@.*:~\$即可

内容的提问来源于stack exchange,提问作者Lalit Kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:20:27