Chrome 113+版本下通过Bash获取navigator.userAgent的问题求助
Chrome 113版本切换到新无头模式(--headless=new)后,原REPL交互逻辑发生变化,直接通过echo管道传递命令时,Chrome还未完成初始化准备,导致命令无法被接收,进而卡住等待输入。以下是几种可行的解决方法:
方法1:延迟发送命令(无需额外工具)
通过sleep给Chrome预留初始化时间,再发送命令和退出指令:
{ sleep 2; echo "navigator.userAgent"; echo "quit"; } | /opt/google/chrome/chrome --headless=new --repl --remote-allow-origins=* | perl -pe 's/^>>> //; s/HeadlessChrome/Chrome/g' | jq -r '.result.value'
- 可根据实际情况调整
sleep时长(1-3秒均可),确保Chrome完成REPL初始化; echo "quit"会让Chrome执行完命令后自动退出,避免持续卡住。
方法2:直接执行脚本输出结果(无需REPL)
绕开REPL,通过加载数据URI直接执行脚本并提取结果:
/opt/google/chrome/chrome --headless=new --dump-dom "data:text/html,<script>document.write(navigator.userAgent.replace('HeadlessChrome','Chrome'))</script>" | sed -e 's/<html><head><\/head><body>//' -e 's/<\/body><\/html>//'
- 利用
--dump-dom输出页面渲染后的内容,再通过sed剔除多余HTML标签,仅保留UserAgent字符串; - 无需依赖
jq和perl,命令更简洁。
方法3:用Expect工具精确控制交互(最可靠)
安装expect工具监听Chrome的REPL提示符,确保命令在正确时机发送:
- 安装expect:
sudo apt update && sudo apt install expect -y
- 创建
get_user_agent.exp脚本:
#!/usr/bin/expect spawn /opt/google/chrome/chrome --headless=new --repl --remote-allow-origins=* expect ">>> " send "navigator.userAgent\r" expect ">>> " send "quit\r" expect eof
- 赋予执行权限并运行:
chmod +x get_user_agent.exp ./get_user_agent.exp | perl -pe 's/^>>> //; s/HeadlessChrome/Chrome/g' | jq -r .result.value
- Expect会等待Chrome输出
>>>提示符后再发送命令,完全避免时机匹配问题,稳定性最高。
内容的提问来源于stack exchange,提问作者Mario Palumbo
相关产品推荐
相关产品推荐

