linux - Arch Linux - 如何通过命令行静默安装 Firefox 扩展(没有 install.rdf 文件)

标签 linux firefox terminal firefox-addon xpi

我正在开发 Arch Linux 操作系统,其中使用 Firefox 91.10.0esr(即 Firefox ESR),并且我正在寻找一种使用终端静默安装 Firefox 插件的方法。我知道通过调用下载的插件 .xpi 来安装它们的方法 firefox-esr <addon-name>.xpi但它会打开 Firefox 并要求进一步确认安装。

我的目的是仅通过命令行执行 .xpi 文件的安装,而不与浏览器 GUI 交互,并避免进一步安装确认(浏览器打开的弹出窗口上的“添加”按钮)。

根据多个来源(即 https://askubuntu.com/questions/73474/how-to-install-firefox-addon-from-command-line-in-scripts ),其中针对包含 install.rdf 的插件解释了该过程。文件,管理这个案例很容易。

我的问题与那些不包含 install.rdf 的 .xpi 文件有关包含应用程序 ID 的文件。

例如,如果我们考虑 FoxyProxy 插件,我们下载并提取它:

mkdir foxyproxy && cd foxyproxy
wget https://addons.mozilla.org/firefox/downloads/file/3611407/foxyproxy_standard-7.5.1.xpi
unzip foxyproxy_standard-7.5.1.xpi

在提取的文件中,没有install.rdf包含扩展名的常用十六进制 ID 的文件。 我能看到的唯一 ID 位于 manifest.json 内不具有十六进制格式的文件。以FoxyProxy为例,我尝试使用它的ID <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5731382f2e2725382f2e1732253e34793f793d223930" rel="noreferrer noopener nofollow">[email protected]</a>通过使过程如下:

mkdir -p /usr/share/mozilla/extensions/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e0868f989990928f9899a085928983ce88ce8a958e87" rel="noreferrer noopener nofollow">[email protected]</a>

mkdir -p /home/user/.mozilla/extensions/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ddbbb2a5a4adafb2a5a49db8afb4bef3b5f3b7a8b3ba" rel="noreferrer noopener nofollow">[email protected]</a>

然后将 .xpi 的所有解压内容复制到这些目录之一中,但没有成功。

是否可以通过 CLI 安装这种没有 install.rdf 的插件文件?

最佳答案

TL;DR

运行此config_firefox.sh脚本:

#!/bin/bash
sudo mkdir -p /etc/firefox/policies
sudo cp policies.json /etc/firefox/policies/policies.json

哪个副本(以下 policies.json 文件,您必须将其放在与 config_firefox.sh 脚本相同的文件夹中):

{
  "policies": {
    "Extensions": {
      "Install": [
        "https://addons.mozilla.org/firefox/downloads/file/3551054/ublock_origin-latest.xpi"
      ]
    },
    "ExtensionUpdate": true,
    "DisableTelemetry": true,
    "DisableFirefoxStudies": true,
    "EnableTrackingProtection": {
      "Value": true,
      "Locked": false,
      "Cryptomining": true,
      "Fingerprinting": true,
      "EmailTracking": true,
      "Exceptions": []
    }
  }
}

进入:`/etc/firefox/policies/policies.json 并重新启动 Firefox。 (您不必再单击“接受”任何内容,它们会自动安装。

回答 XY 问题,不起作用:

此脚本从 manifest.json 获取扩展 ID .xpi 内的文件文件:(但是,如果我将 .xpi 文件导出到: /home/<username>/snap/firefox/common/.mozilla/firefox/<profilename>.default/extensions ,Firefox 不会自动安装它们。

#!/bin/bash

# Constants
#FIREFOX_PATH=~/.mozilla/firefox
FIREFOX_PATH=~/snap/firefox/common/.mozilla/firefox/
echo "FIREFOX_PATH=$FIREFOX_PATH"
FIREFOX_PROFILE=$(cat ${FIREFOX_PATH}/profiles.ini | grep "Path=" | cut -d= -f2)
echo "FIREFOX_PROFILE=$FIREFOX_PROFILE"
FIREFOX_PROFILE_PATH=${FIREFOX_PATH}/${FIREFOX_PROFILE}
#read -p "FIREFOX_PROFILE_PATH=$FIREFOX_PROFILE_PATH"
FIREFOX_EXT_PATH=${FIREFOX_PROFILE_PATH}/extensions
#FIREFOX_EXT_PATH=${FIREFOX_PATH}/extensions
echo "FIREFOX_EXT_PATH=$FIREFOX_EXT_PATH"
mkdir -p "$FIREFOX_EXT_PATH"

install_firefox_extensions () {
    echo  ">>> Installing Firefox extensions ..."
    mkdir -p /tmp/firefox-install-extensions
    cd /tmp/firefox-install-extensions

    install_extension "uBlock"\
        https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/addon-607454-latest.xpi
    exit 5
    install_extension "uMatrix"\
        https://addons.mozilla.org/firefox/downloads/latest/umatrix/addon-613250-latest.xpi
    install_extension "Vimperator"\
        https://addons.mozilla.org/firefox/downloads/file/450078/vimperator-latest-fx.xpi
    install_extension "Tab Groups"\
        https://addons.mozilla.org/firefox/downloads/latest/tab-groups-panorama/addon-671381-latest.xpi
    install_extension "Cookies Manager+"\
        https://addons.mozilla.org/firefox/downloads/latest/cookies-manager-plus/addon-92079-latest.xpi
    rm -rf /tmp/firefox-install-extensions
}


get_rhs_of_line_till_character() {
    local line=$1
    local character=$2
    
    rhs=$(cut -d "$character" -f2- <<< "$line")
    echo "$rhs"
}

get_extension_id(){
    local keyword="$1"
    
    local ext_uid=$(unzip -p addon.xpi manifest.json | grep "$keyword" | head -n 1)
    
    # If not is None, get everything after:'"id": "' and drop last quotation and comma.
    if [ "$ext_uid" != "" ]; then
        local first_cut=$(get_rhs_of_line_till_character "$ext_uid" ":")
        #echo "first_cut=$first_cut"
        local second_cut=$(get_rhs_of_line_till_character "$first_cut" '"')
        #echo "second_cut=$second_cut"
        local trim_tail=${second_cut::-2}
        #echo "trim_tail=$trim_tail"
        echo "$trim_tail"
    fi
}

manual_assert_file_exists() {
    local filepath="$1"
    if [ ! -f "$filepath" ]; then
        echo "The file: $filepath does not exist."
        exit 29
    fi
}

install_extension () {
    local ext_name=$1
    local ext_url=$2

    echo ">>> Installing ${ext_name} ..."

    rm addon.xpi
    wget --quiet -O addon.xpi "${ext_url}"
    STATUS=$?
    if [ $STATUS -ne 0 ]; then
        echo ">>>> error downloading $ext_name"
    fi
    manual_assert_file_exists "addon.xpi"

    
    local xpi_id=$(get_extension_id "id")
    if [ "$xpi_id" == "" ]; then
        xpi_id=$(get_extension_id "short_name")
    fi
    if [ "$xpi_id" == "" ]; then
        echo "Error, did not find xpi-id for:$ext_name"
    fi
    echo "xpi_id=$xpi_id"

    cp -f addon.xpi "${FIREFOX_EXT_PATH}/${xpi_id}.xpi"
    unzip addon.xpi -d "${FIREFOX_EXT_PATH}/${xpi_id}"
}

install_firefox_extensions


#echo ">>>> changing default search to DuckDuckGo"
#while [ ! -f "$FIREFOX_PROFILE/search.json.mozlz4" ]
#do
#   echo ">>>> waiting for search.json.mozlz4 to be created..."
#   sleep 1
#done

关于linux - Arch Linux - 如何通过命令行静默安装 Firefox 扩展(没有 install.rdf 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72572010/

相关文章:

css - 使用相对位置时框阴影的差异

linux - 如何将用于列出重复文件的区分大小写的脚本转换为不区分大小写?

c - 编译C代码的脚本

linux - 如何在 Red Hat 7.3 启动时运行 shell 脚本

linux - 在 Linux Centos 7 下安装 tcl/tk 以与 Perl 5 一起使用 - 缺少一个步骤?

firefox - 如何在 Firefox 中屏蔽来自 WebRTC 的 IP 泄漏?

Javascript 不在本地页面上运行

linux 两个文件夹之间的公共(public)文件

c - 为什么从 usb char 设备读取卡住?

c - 如何将 ./a.out 的结果存储到文本文件