如何通过Robot Framework Process库执行SSH命令及问题排查
问题描述
通过Robot Framework执行SSH命令测试网络中断,遇到以下问题:
- 目标命令:
ssh it@128.0.0.1 sudo ifconfig ens192 down,手动执行正常(目标IP无法ping通),但通过Run Process执行时报错:/bin/sh: ssh it@128.0.0.1 sudo ifconfig ens192 down: command not found - 尝试在命令中添加PATH参数后,报错:
/bin/sh: ssh it@128.0.0.1 PATH=/usr/sbin sudo ifconfig ens192 down: No such file or directory - 补充环境信息:
- it用户由
useradd it创建并复制主目录内容 - 已配置sudoers允许it免密执行ifconfig
- 已完成SSH免密登录配置
- SSH会话中基础命令异常:
ls偶尔可用,echo无法执行,无法查看$PATH
- it用户由
核心原因
你在使用Run Process时错误地给整个命令加上了单引号,当shell=True时,shell会把带单引号的整个字符串当作一个完整命令去系统路径中查找,而非解析成ssh命令加后续参数,这才是触发"command not found"的根本原因,并非一开始推测的PATH为空问题。
解决方案
1. 修正Run Process的命令格式(优先推荐)
方式1:去掉命令的单引号,直接传入命令字符串
当shell=True时,无需给整个命令加单引号,直接写完整命令即可:
Run Process ssh it@128.0.0.1 sudo ifconfig ens192 down shell=True stdout=stdout stderr=stderr
方式2:拆分命令与参数,不依赖shell(更安全规范)
Run Process支持直接拆分命令和参数,不需要启用shell,这种方式能避免shell解析的问题:
Run Process ssh it@128.0.0.1 sudo ifconfig ens192 down stdout=stdout stderr=stderr
2. 解决SSH会话PATH缺失问题(若后续仍有命令找不到)
如果确认目标机it用户的PATH确实不包含sudo/ifconfig的路径,可通过以下方式处理:
方式1:使用命令的绝对路径
直接指定sudo和ifconfig的绝对路径(根据实际系统路径调整,通常sudo在/usr/bin,ifconfig在/usr/sbin):
Run Process ssh it@128.0.0.1 /usr/bin/sudo /usr/sbin/ifconfig ens192 down shell=True stdout=stdout stderr=stderr
方式2:在SSH会话中显式设置PATH
通过ssh传递命令时,先设置PATH再执行目标命令,注意用&&连接:
Run Process ssh it@128.0.0.1 'PATH=/usr/bin:/usr/sbin:$PATH && sudo ifconfig ens192 down' shell=True stdout=stdout stderr=stderr
额外排查步骤
- 先测试简单SSH命令,确认Robot Framework能正常与目标机通信并获取PATH:
注意这里Run Process ssh it@128.0.0.1 echo \$PATH shell=True stdout=stdout stderr=stderr Log ${stdout}$PATH要加转义符\,避免被本地shell解析。
内容的提问来源于stack exchange,提问作者remington howell
相关产品推荐
相关产品推荐

