使用Expect遍历文件向远端设备下发命令出现权限错误求助
问题解决方案
第一步:验证登录身份是否正确
你遇到的Permission denied报错90%以上的概率是Expect脚本并未真正登录到root用户,只是你误以为登录成功:
- 在Expect脚本中执行
chmod命令前,先插入执行whoami的逻辑,打印命令返回结果,确认返回值为root而非其他普通用户 - 检查Expect的提示符匹配规则,避免出现普通用户提示符包含
#字符、密码输入匹配失败未捕获等问题,导致脚本实际停留在登录验证阶段、并未进入root的shell环境
第二步:验证赋权操作是否生效
在Expect脚本中执行完chmod 777 /var/root/file.txt后,立即执行ls -l /var/root/file.txt,确认返回的权限位为rwxrwxrwx,且无chmod相关报错。如果chmod本身就返回权限不足,可直接确定当前登录用户并非root。
第三步:排查非交互式SSH会话限制
如果前两步验证都正常,说明问题出在远端设备对SSH非交互式会话的访问限制:
- 检查SELinux状态:在远端执行
sestatus,如果状态为Enforcing,执行ls -Z /var/root/file.txt查看文件安全上下文,和交互式登录时查询的结果对比,若不一致执行restorecon /var/root/file.txt修复即可 - 检查SSH配置:查看
/etc/ssh/sshd_config中PermitRootLogin参数是否为yes,如果设置为forced-commands-only或prohibit-password会限制非交互式root会话的操作权限;同时检查/etc/pam.d/sshd中是否有pam_access等限制非交互式会话访问的模块配置
替代方案(可规避路径/权限问题)
不需要提前上传命令文件到远端,直接在本地逐行读取命令文件内容,通过Expect发送命令前先执行cd /远端/目标工作目录切换到对应路径,所有涉及路径的命令统一写绝对路径,即可解决最初的本地相对路径错误问题,省去文件上传、赋权的步骤。
内容的提问来源于stack exchange,提问作者martindale
相关产品推荐
相关产品推荐

