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

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命令(无额外依赖,直接可用)

  1. 替换sed分隔符:弃用默认的/作为分隔符,改用配置内容中不会出现的特殊字符(如|、#),从根源上避免分隔符与内容字符冲突。
  2. 优化匹配正则:将原匹配规则中的[".*"]调整为\["[^]]*"\],仅匹配从["起始到第一个]结束的数组区间,避免贪婪匹配导致的配置误改。
  3. 本地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替换为''。

  1. 适配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修改配置,完全规避正则匹配、转义相关的问题:

  1. 先在Raspbian设备上安装jq:
ssh pi@<你的树莓派IP地址> 'apt update && apt install -y jq'
  1. 执行命令修改启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:03:23