MacOS通过SSH远程修改Raspbian Chromium配置遇sed报错
问题场景
- 部署多台运行Raspbian(Jesse Lite)的设备,开机自动全屏启动Chromium,启动时自动加载的两个标签页地址存储在
/.config/chromium/default/preferences文件中,对应配置段:
{"restore_on_startup":4,"startup_urls":["http://www.example.com/","https://www.example.org"]}
- 设备为无头运行模式,计划通过AppleScript远程修改启动URL,已完成SSH公钥登录Raspberry Pi 400的配置,未掌握sed匹配规则与多层转义逻辑。
- 本地macOS环境测试sed命令(未涉及SSH远程环节)时执行以下命令:
sed -i .new 's/"startup_urls":[".*"]}/"startup_urls":["http://www.example.net","http://www.example.com"]}/g' ~/Library/Application\ Support/Google/Chrome/Default/Secure\ Preferences
- 执行后返回报错:
sed: 1: "s/"startup_urls":[".*"] ...": bad flag in substitute command: '/'
- 需求:获取该问题的解决思路与可落地的实操指引。
报错核心原因
- sed替换命令默认使用
/作为分隔符,本次替换的目标内容(URL字符串)中包含大量/字符,sed会将内容里的/误判为替换命令的分隔标记,解析到后续字符时直接抛出命令格式错误。 - 原有匹配规则
".*"为贪婪匹配模式,若配置行内存在其他带双引号的JSON字段,会出现匹配范围越界,误修改无关配置项。 - macOS自带BSD版sed,Raspbian软件源内置的是GNU版sed,二者
-i(原地修改)参数的语法要求存在差异,本地测试通过的命令直接套用到SSH远程执行场景时容易触发兼容性问题。
实操解决步骤
方案1:修正sed命令(无额外依赖,直接可用)
- 替换sed分隔符:弃用默认的
/作为分隔符,改用配置内容中不会出现的特殊字符(如|、#),从根源上避免分隔符与内容字符冲突。 - 优化匹配正则:将原匹配规则中的
[".*"]调整为\["[^]]*"\],仅匹配从["起始到第一个]结束的数组区间,避免贪婪匹配导致的配置误改。 - 本地macOS环境可直接运行的测试命令:
sed -i .new 's|"startup_urls":\["[^]]*"\]|"startup_urls":["http://www.example.net","http://www.example.com"]|g' ~/Library/Application\ Support/Google/Chrome/Default/Secure\ Preferences
说明:BSD版sed要求
-i参数后必须传入备份文件后缀,上述命令执行后会自动生成后缀为.new的原文件备份,确认修改无误后可手动删除备份;如果不需要备份,可将.new替换为''。
- 适配Raspbian(GNU sed)的SSH远程执行命令:
ssh pi@<你的树莓派IP地址> 'sed -i "s|\"startup_urls\":\[\"[^\]]*\"\]|\"startup_urls\":[\"http://www.example.net\",\"http://www.example.com\"]|g" /.config/chromium/default/preferences'
说明:远程执行时命令外层包裹了双引号,内部的JSON双引号需要添加反斜杠转义,避免本地shell提前解析截断命令。GNU版sed的
-i参数支持直接原地修改,无需强制传入备份后缀。
方案2:使用jq修改JSON配置(更稳定,推荐长期使用)
sed基于正则匹配文本,遇到JSON格式变化、特殊字符时容易出错,若设备允许安装额外工具,优先使用专门的JSON处理工具jq修改配置,完全规避正则匹配、转义相关的问题:
- 先在Raspbian设备上安装jq:
ssh pi@<你的树莓派IP地址> 'apt update && apt install -y jq'
- 执行命令修改启动URL配置:
ssh pi@<你的树莓派IP地址> 'jq ".startup_urls = [\"http://www.example.net\", \"http://www.example.com\"]" /.config/chromium/default/preferences > /tmp/preferences.tmp && mv /tmp/preferences.tmp /.config/chromium/default/preferences'
内容的提问来源于stack exchange,提问作者FL K
相关产品推荐
相关产品推荐

