Ubuntu运行xfreerdp远程桌面脚本报sed错误、Invalid sigil异常
排查思路
- 先拆解报错定位问题层级:前两条sed报错明确提示找不到
/cert:tofu、/v:HOST_CONN文件,说明这两个本应传给xfreerdp的连接参数,被错误传给sed当作待读取的文件路径;最后一条是xfreerdp的参数校验报错,说明程序收到的启动参数缺项、格式不符合要求,没有读到完整的连接配置。 - 顺着参数传递问题核对脚本语法:查看xfreerdp启动行的管道符位置就能定位根因——shell解析命令时碰到管道符
|会直接把前后内容拆成两个独立进程执行,前半段启动xfreerdp,后半段启动sed,原本跟在sed语句后面的/cert、/v连接参数自然全被划到sed的入参列表里。 - 关于“12小时前还能正常运行、脚本无修改”的原因:Ubuntu默认开启后台自动安全更新,近期xfreerdp包升级后新增了严格的参数格式校验逻辑,旧版本对参数格式容错性高,写法存在瑕疵也能勉强识别连接,新版本参数不符合规则会直接抛错退出。
修复方案
直接替换脚本中错误的xfreerdp启动行,将从配置文件提取密码的逻辑用$()命令替换符包裹,作为/p:参数的取值传入,修正后的完整启动行如下:
xfreerdp /size:"1800x950" /u:"user" /d:company /p:"$(grep pass ~/.mad | sed "s/.*=//")" /cert:tofu /v:HOST_CONN
修正点说明:
- 把
grep pass ~/.mad | sed "s/.*=//"整段取密码的逻辑放进$()内,告知shell优先执行这段命令,将输出结果作为密码值传给/p参数 - 给命令替换整体加双引号包裹,避免密码中存在特殊字符时被shell拆分为多个参数
- 管道符现在位于命令替换括号内部,不会再把后续的xfreerdp连接参数切分给sed处理
修改完成后直接执行./agenda.sh验证即可,正常情况下sed找不到文件的报错会消失,xfreerdp会直接拉起远程桌面连接流程。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

