Fix snap chromium path collapsing to /usr/bin/snap
readlink/realpath of /snap/bin/chromium becomes /usr/bin/snap, which is not a browser and breaks DrissionPage launch. Keep the snap wrapper path, reject snap host basenames, and prefer real deb chromium binaries.
This commit is contained in:
1 parent
a790a371a8
commit
767516745e
5 files changed
+289
-70
No files matched your search
@@ -342,65 +342,108 @@ step3_sync_deps() {
|
||||
echo -e " ${GREEN}✓${NC} 依赖同步完成"
|
||||
}
|
||||
|
||||
# 是否是合法浏览器可执行路径(拒绝 /usr/bin/snap 这类 snap 软链目标)
|
||||
_is_valid_browser_bin() {
|
||||
local p="$1"
|
||||
local base
|
||||
[ -n "$p" ] || return 1
|
||||
[ -x "$p" ] 2>/dev/null || return 1
|
||||
base="$(basename "$p")"
|
||||
case "$base" in
|
||||
snap|snap-confine|snapd|env|bash|sh|python*|uv)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
# 路径名应像浏览器
|
||||
case "$p" in
|
||||
*chromium*|*chrome*|*Chrome*|*Chromium*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
|
||||
# 解析路径:command -v 或可执行绝对路径
|
||||
# 注意:/snap/bin/chromium 经 readlink -f 会变成 /usr/bin/snap —— 绝不能用那个结果启动浏览器
|
||||
_resolve_bin() {
|
||||
local cand="$1"
|
||||
local p="" real=""
|
||||
if [ -z "$cand" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ -x "$cand" ] 2>/dev/null; then
|
||||
# resolve symlinks when possible
|
||||
if have_cmd readlink; then
|
||||
readlink -f "$cand" 2>/dev/null || echo "$cand"
|
||||
else
|
||||
echo "$cand"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
if have_cmd "$cand"; then
|
||||
local p
|
||||
p="$cand"
|
||||
elif have_cmd "$cand"; then
|
||||
p="$(command -v "$cand" 2>/dev/null || true)"
|
||||
if [ -n "$p" ]; then
|
||||
if have_cmd readlink; then
|
||||
readlink -f "$p" 2>/dev/null || echo "$p"
|
||||
else
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
[ -n "$p" ] || return 1
|
||||
|
||||
# snap 包装器:保留 /snap/bin/chromium,不要 resolve 成 /usr/bin/snap
|
||||
case "$p" in
|
||||
/snap/bin/*)
|
||||
if _is_valid_browser_bin "$p"; then
|
||||
echo "$p"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if have_cmd readlink; then
|
||||
real="$(readlink -f "$p" 2>/dev/null || true)"
|
||||
# readlink 落到 snap 宿主时,回退用原路径(若原路径仍有效)
|
||||
if [ -n "$real" ]; then
|
||||
case "$(basename "$real")" in
|
||||
snap|snap-confine|snapd)
|
||||
if _is_valid_browser_bin "$p"; then
|
||||
echo "$p"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
if _is_valid_browser_bin "$real"; then
|
||||
echo "$real"
|
||||
return 0
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
if _is_valid_browser_bin "$p"; then
|
||||
echo "$p"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
find_chromium_bin() {
|
||||
local candidate p
|
||||
# 优先 deb/系统包路径,snap 放后面(且不 resolve 成 /usr/bin/snap)
|
||||
for candidate in \
|
||||
"${BROWSER_PATH:-}" \
|
||||
chromium \
|
||||
chromium-browser \
|
||||
/usr/bin/chromium \
|
||||
/usr/bin/chromium-browser \
|
||||
/snap/bin/chromium \
|
||||
/usr/lib/chromium/chromium \
|
||||
/usr/lib/chromium-browser/chromium-browser \
|
||||
chromium \
|
||||
chromium-browser \
|
||||
/snap/bin/chromium \
|
||||
"/Applications/Chromium.app/Contents/MacOS/Chromium"; do
|
||||
[ -z "$candidate" ] && continue
|
||||
# if BROWSER_PATH points to chrome, skip in chromium finder
|
||||
case "$candidate" in
|
||||
*google-chrome*|*chrome*)
|
||||
# only accept if path name contains chromium
|
||||
case "$candidate" in
|
||||
*chromium*) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
if p="$(_resolve_bin "$candidate")"; then
|
||||
case "$p" in
|
||||
*google-chrome*) continue ;;
|
||||
*/snap) continue ;;
|
||||
esac
|
||||
# 必须像 chromium
|
||||
case "$p" in
|
||||
*chromium*|*Chromium*)
|
||||
echo "$p"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
echo "$p"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
@@ -409,12 +452,15 @@ find_chromium_bin() {
|
||||
find_chrome_bin() {
|
||||
local candidate p
|
||||
for candidate in \
|
||||
google-chrome-stable \
|
||||
google-chrome \
|
||||
/usr/bin/google-chrome-stable \
|
||||
/usr/bin/google-chrome \
|
||||
google-chrome-stable \
|
||||
google-chrome \
|
||||
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; do
|
||||
if p="$(_resolve_bin "$candidate")"; then
|
||||
case "$(basename "$p")" in
|
||||
snap) continue ;;
|
||||
esac
|
||||
echo "$p"
|
||||
return 0
|
||||
fi
|
||||
@@ -424,24 +470,46 @@ find_chrome_bin() {
|
||||
|
||||
# 选中浏览器并 export,供 register_cli / create_browser_options 使用
|
||||
select_and_export_browser() {
|
||||
local chromium_bin="" chrome_bin=""
|
||||
local chromium_bin="" chrome_bin="" user_path=""
|
||||
chromium_bin="$(find_chromium_bin 2>/dev/null || true)"
|
||||
chrome_bin="$(find_chrome_bin 2>/dev/null || true)"
|
||||
|
||||
# 用户显式 BROWSER_PATH 优先
|
||||
if [ -n "${BROWSER_PATH:-}" ] && [ -x "${BROWSER_PATH}" ]; then
|
||||
SELECTED_BROWSER="$BROWSER_PATH"
|
||||
case "$SELECTED_BROWSER" in
|
||||
*chromium*) SELECTED_BROWSER_KIND="chromium" ;;
|
||||
*) SELECTED_BROWSER_KIND="chrome" ;;
|
||||
esac
|
||||
elif [ -n "$chromium_bin" ]; then
|
||||
SELECTED_BROWSER="$chromium_bin"
|
||||
SELECTED_BROWSER_KIND="chromium"
|
||||
elif [ -n "$chrome_bin" ]; then
|
||||
SELECTED_BROWSER="$chrome_bin"
|
||||
SELECTED_BROWSER_KIND="chrome"
|
||||
else
|
||||
# 用户显式 BROWSER_PATH 优先,但必须通过校验(拒绝 /usr/bin/snap)
|
||||
if [ -n "${BROWSER_PATH:-}" ]; then
|
||||
user_path="$(_resolve_bin "$BROWSER_PATH" 2>/dev/null || true)"
|
||||
if [ -z "$user_path" ] && _is_valid_browser_bin "$BROWSER_PATH"; then
|
||||
user_path="$BROWSER_PATH"
|
||||
fi
|
||||
if [ -n "$user_path" ]; then
|
||||
SELECTED_BROWSER="$user_path"
|
||||
case "$SELECTED_BROWSER" in
|
||||
*chromium*|*Chromium*) SELECTED_BROWSER_KIND="chromium" ;;
|
||||
*) SELECTED_BROWSER_KIND="chrome" ;;
|
||||
esac
|
||||
else
|
||||
echo -e " ${YELLOW}⚠${NC} 忽略无效 BROWSER_PATH=${BROWSER_PATH}(常见于 snap 解析成 /usr/bin/snap)"
|
||||
unset BROWSER_PATH
|
||||
user_path=""
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "${SELECTED_BROWSER:-}" ] || [ -z "${user_path:-}" ]; then
|
||||
if [ -n "$chromium_bin" ]; then
|
||||
SELECTED_BROWSER="$chromium_bin"
|
||||
SELECTED_BROWSER_KIND="chromium"
|
||||
elif [ -n "$chrome_bin" ]; then
|
||||
SELECTED_BROWSER="$chrome_bin"
|
||||
SELECTED_BROWSER_KIND="chrome"
|
||||
else
|
||||
SELECTED_BROWSER=""
|
||||
SELECTED_BROWSER_KIND="none"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 二次校验:绝不能导出 snap 宿主
|
||||
if ! _is_valid_browser_bin "$SELECTED_BROWSER"; then
|
||||
echo -e " ${RED}✗${NC} 浏览器路径无效: $SELECTED_BROWSER"
|
||||
SELECTED_BROWSER=""
|
||||
SELECTED_BROWSER_KIND="none"
|
||||
return 1
|
||||
@@ -453,7 +521,6 @@ select_and_export_browser() {
|
||||
export BROWSER_PATH="$SELECTED_BROWSER"
|
||||
export CHROMIUM_PATH="$SELECTED_BROWSER"
|
||||
else
|
||||
# 仅 Chrome:不写 BROWSER_PATH 强制,但打印警告;Python 侧也会提示
|
||||
export BROWSER_PREFER="${BROWSER_PREFER:-chrome}"
|
||||
export BROWSER_PATH="$SELECTED_BROWSER"
|
||||
fi
|
||||
|
||||
Reference in new issue
Block a user