为KDE桌面环境快速设置系统代理

自己使用代理最主要的目的就是访问 Google,所以使用校园网时一般不需要开代理,电脑连接手机热点时才需要。
而 ArchLinux 的extra/firefox不会跟随系统代理,开关代理的切换过程就变得十分麻烦。

目的

通过 shell 脚本依次完成:

Shadowsocks

官方源里的community/shadowsocks直接通过systemd启动即可:
$ sudo systemctl start [email protected]

KDE 系统代理设置

之前用qdbus执行过一些操作,例如:

所以尝试寻找通过qdbus修改系统设置的方法,未找到,但在Changing system settings from CLI发现了可以利用kwriteconfig修改配置文件来修改系统设置。

直接在Google上搜索kde proxy settings file,可以找到很久以前的回答Change proxy from terminal..or where is proxy settings file?,看到其中提到了~/.kde[5]/share/config/kioslaverc
现在已经是kde5了,诸多配置文件默认目录都切换到了~/.config,成功找到~/.config/kioslaverc,里面存储的正是系统代理设置。

在系统设置中手动切换不同的代理模式,观察文件内容的更改,可以发现[Proxy Settings]ProxyType不同值的含义如下:

所以想要修改系统代理模式,将ProxyType换成自己需要的值即可。例如使用代理自动配置 URL:
$ kwriteconfig5 --file $HOME/.config/kioslaverc --group "Proxy Settings" --key "ProxyType" 2

Firefox 代理设置

ArchWiki: Firefox可以看到火狐的用户配置文件保存在~/.mozilla/firefox/xxxxxxxx.default/,然后在firefox proxy settings via command line找到代理设置具体保存在prefs.js中。

打开prefs.js可以看到提示:

// Mozilla User Preferences

// DO NOT EDIT THIS FILE.
//
// If you make changes to this file while the application is running,
// the changes will be overwritten when the application exits.
//
// To change a preference value, you can either:
// - modify it via the UI (e.g. via about:config in the browser); or
// - set it within a user.js file in your profile.

那么只需要手动创建user.js文件,里面的设置就会在 Firefox 启动时覆盖prefs.js中的内容:

例如使用自动代理配置的 URL:
$ echo 'user_pref("network.proxy.type", 2);' > $HOME/.mozilla/firefox/*.default/user.js

最终结果

#!/bin/bash
#########################################################################
# File Name: proxy.sh
# Author: nian
# Blog: https://whoisnian.com
# Mail: [email protected]
# Created Time: 2019年03月30日 星期六 01时13分25秒
#########################################################################

SSCONFIGNAME="example"

function usage(){
    echo "usage: proxy.sh [command]"
    echo "  st    start proxy"
    echo "  ed    end proxy"
}

function proxy_start(){
    echo "Start..."
    sudo systemctl start shadowsocks@$SSCONFIGNAME
    kwriteconfig5 --file $HOME/.config/kioslaverc --group "Proxy Settings" --key "ProxyType" 2
    echo 'user_pref("network.proxy.type", 2);' > $HOME/.mozilla/firefox/*.default/user.js
    echo "Done."
}

function proxy_end(){
    echo "End..."
    sudo systemctl stop shadowsocks@$SSCONFIGNAME
    kwriteconfig5 --file $HOME/.config/kioslaverc --group "Proxy Settings" --key "ProxyType" 0
    echo 'user_pref("network.proxy.type", 5);' > $HOME/.mozilla/firefox/*.default/user.js
    echo "Done."
}

if [ $# -ge 1 ]
then
    if [ $1 = "st" ]
    then
        proxy_start
    elif [ $1 = "ed" ]
    then
        proxy_end
    else
        usage
    fi
else
    usage
fi