分類
Linux 软件

AFWall+ 安卓可用的iptables

安卓手機如果root了,便可以通過AFWall+Github項目地址)來使用iptables管控網絡。

在安卓上使用DNSCrypt

由於TCP旁路阻斷技術的應用,DNSCrypt已經不能為日常使用網絡帶來太多方便,所以僅僅是記錄一下使用方法而已。先安裝好AFWall+並根據自己的喜好定製軟件的聯網規則,然後啟用iptables。我們使用Termux來至執行iptabls命令。根據自己的手機系統下載dnscrypt-proxy,比如我的就是dnscrypt-proxy-android_arm64-2.0.17.zip。如果不知道自己的手機系統,可以運行uname -a,如果出現aarch64就跟我一樣下載android_arm64版本就行。下載後解壓到/data/data/com.termux/files/home/opt/dns目錄里。複製一份文件夾里的配置文件即cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml就可以了,配置也可以參考Fedora使用DNSCrypt。下面的文件我是放在家目錄下的,文件名是dns.sh,記得加上執行權限。

remove127(){
  /system/bin/iptables -t nat -D OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53
}
add127(){
  /system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
}
startDns(){
  /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy -config /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy.toml > /dev/null 2>1 &
  echo "starting dns"
  sleep 15
}
stopDns(){
  pkill dnscrypt-proxy
  echo "killed dns"
}
test(){
  var1=$(su -c "/system/bin/iptables -C OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53")
}
status(){
  vt1="$(ps -ef | grep dnscrypt-proxy | wc -l)"
  if [[ $vt1 = "2" ]]; then
    dnsproxyStatus="1"
  else
    dnsproxyStatus="0"
  fi
  vt2="$(/system/bin/iptables -t nat -L | grep 127.0.0.1:53 | wc -l)"
  if [[ $vt2 = "2" ]]; then
    iptablesStatus="1"
  else
    iptablesStatus="0"
  fi
}
if [[ $1 = "1" ]]; then
  echo "start"      
  remove127              
  sleep 5                
  startDns       
  add127
elif [[ $1 = "2" ]]; then
  echo "restart"        
  remove127
  stopDns         
  sleep 3           
  startDns               
  add127 
elif [[ $1 = "0" ]]; then
  echo "stop"
  remove127
  stopDns
elif [[ $1 = "s" ]]; then
  status
  echo "dns: $dnsproxyStatus | iptables: $iptablesStatus"
else
  status
  if [[ $dnsproxyStatus = "1" ]]; then
    echo "$(date) dns ok" >> /data/data/com.termux/files/home/log.log
  else
    remove127
    stopDns
    remove127
    sleep 5
    startDns
    add127
    echo "$(date) dns started" >> /data/data/com.termux/files/home/log.log
  fi
  
fi
#使用說明
#首先切換的超級用戶
su
#查看當前狀態,1代表開啟,0代表關閉
./dns.sh s
#關閉dnscrypt-proxy
./dns.sh 0
#開啟dnscrypt-proxy
./dns.sh 1
#重新啟動dnscrypt-proxy
./dns.sh 2

啟動完成後可以通過dnsleaktest.com來查看當前的本機的dns。本來腳本還做了自啟動的適配,但是無論是Termux的自動啟動還是Magisk的自動啟動,都不太好用就算了。

本文更新於 2019/08/08。

分類
方法

Android套用日文字體

據說有的手機(三星,LG,HTC)可以直接選擇系統字體,真好,但是索尼不行(更正:港版不行,日版可以)。我只是修改了系統的字體配置文件,讓顯示簡體中文時,首先套用日語SomcUDGothic-Regular.ttf字體,如果沒有再用回原來的NotoSansCJK-Regular.ttc字體。這樣不會出現口口口,但時畢竟字體差異在那裡,如果追求完美顯示的話,這個方法是不合適的。

#備份原始文件
cp /system/etc/fonts.xml /system/etc/fonts.xml.bak
vi /system/etc/fonts.xml
#添加如下三行到<family lang="zh-Hans">前。
    <family lang="zh-Hans">
        <font weight="400" style="normal">SomcUDGothic-Regular.ttf</font>
    </family>
#重啟手機即可

本文更新於 2020/08/30。

分類
程序

python查詢aqicn的空氣質量數據

#!/data/data/com.termux/files/usr/bin/python
# -*- coding: utf8 -*-

#aqicn空氣質量 #https://aqicn.org/api/
#v2 同時指定多個監測站,已防止單個站點很久不更新數據
import json,requests,sys,time

#token從https://aqicn.org/data-platform/token/獲取,只需郵箱即可
token = 'YourToken'
#預設為當前IP位置,可自行指定基站,幫助 --help
stationList = ["@5851","@5855","@5860"]

def getAqi(station):    
    aqiUrl = "https://api.waqi.info/feed/"+station+"/?token="+token
    try:
        res = requests.get(aqiUrl)
        a = res.json()
        if a['status']=="ok":            
            if time.time() - a['data']['time']['v'] < 86400:
                return a
            else:
                return {"status":a['data']['city']['name']+"的數據已過期。"}
        else:
            res = requests.get(aqiUrl)
            a = res.json()
            return a
    except:
        return {"status":"net error"}

def searchStation(keyword):
    searchUrl = "https://api.waqi.info/search/?token="+token+"&keyword="+keyword
    try:
        res = requests.get(searchUrl)
        a = res.json()
        res = []
        if a['status']=="ok":
            for s in a['data']:
                resT={}
                resT['uid']=s['uid']
                resT['name']=s['station']['name']
                resT['aqi']=s['aqi']+" ("+s['time']['stime']+")"
                res.append(resT)
            return res
        else:
            return a
    except:
        return {"status":"net error"}
def processAqi(aqiJson):
    s=aqiJson
#     print(json.dumps(s, indent=4))
    res={}
    if s['status']=="ok":
        res['cityName']=s['data']['city']['name']
        res['time']=s['data']['time']['s']
        res['aqi']=s['data']['aqi']
        try:
            res['pm25']=s['data']['iaqi']['pm25']['v']
        except:
            res['pm25']="N/A"
        try:
            res['pm10']=s['data']['iaqi']['pm10']['v']
        except:
            res['pm10']="N/A"
        try:
            res['temp']=s['data']['iaqi']['t']['v']
        except:
            res['temp']="N/A"
        try:
            res['humidity']=s['data']['iaqi']['h']['v']
        except:
            res['humidity']="N/A"
        try:
            res['wind']=s['data']['iaqi']['w']['v']
        except:
            res['wind']="N/A"
    else:
        res=s
    return res

def main():
    global station
    if len(sys.argv)==1:
        for station in stationList:
            res = processAqi(getAqi(station))
            print(json.dumps(res, indent=2, ensure_ascii=False))
    elif len(sys.argv)==2:
        station = str(sys.argv[1])
        if station == "--help":
            res={"@5851":"根據觀測點編號查詢","Nanyang":"根據城市名稱查詢",
                 "here":"根據IP查詢","s shenzhen":"查詢深圳觀測點",}
        else:
            res = processAqi(getAqi(station))
        print(json.dumps(res, indent=2, ensure_ascii=False))
    elif len(sys.argv)==3:
        res = searchStation(str(sys.argv[2]))
        print(json.dumps(res, indent=2, ensure_ascii=False))
    
if __name__ == '__main__':
    main()

前天迎來如秋後的第一場中度霧霾。

本文更新於 2018/11/08。

分類
软件

使用GnuPG加密文件

GnuPG加密情景

42想發送一條消息給55,並且這條消息只有55能看到。首先42和55都用GnuPG生成自己的公鑰和私鑰。然後55把公鑰交給42,公鑰怎麼傳遞都行,不需要保密。42使用自己的私鑰和55的公鑰來把消息加密,生成加密的消息發給55。55拿到加密的消息後用自己的私鑰解密即可看到原始消息。

安卓使用OpenKeychain

F-Droid或Google Play下載OpenKeychain,導入已有證書(公鑰私鑰均可導入)或生成新的證書。然後通過二維碼或你喜歡的其他方式分享公鑰。發送者使用接收者的公鑰和自己的私鑰加密文件,然後發送加密文件給接收者,接收者用自己的私鑰解開文件。使用OpenKeychain,不僅可以方便的加密與解密文件和文本,更可與K-9 Mail搭配實現加密的郵件。

命令行使用GnuPG

Fedora似乎時預裝了GnuPG和GnuPG2,我們可以用gpg和gpg2來使用它。Termux可以使用pkg install gunpg,用法是一樣的,而且版本是最新版。Fedora26比最新版還差一個小版本。我樂於追新,所以這裡都用gpg2。順便提一下,GnuPG念做“格努皮即”。關於GNU有興趣的朋友可以到GNU作業系統與自由軟體運動了解下。

把證書從OpenKeychain導出並導入Fedora的GnuPG2

#手機上選擇要備份的證書,右上角菜單,備份證書
#抄下來44位密碼,勾選已抄下,按一下保存備份
#然後把生成的文件backup_YYYY-MM-DD.pgp傳送的Fedora
#在Fedora上備份文件的所在目錄執行
gpg2 --decrypt backup_YYYY-MM-DD.pgp | gpg2 --import
#按照提示輸入剛剛抄下來44位密碼
#列出已有的密鑰,最長那串就是ID
gpg2 --list-keys
#編輯密鑰
gpg2 --edit-key [ID]
#由於我們是物理傳輸過來的,所以不用對比指紋了,直接trust
trust
5
y
save
#這樣就可以了

使用 GnuPG2 加密和解密文件

#將 A.txt 加密
gpg2 --encrypt -r [email protected] A.txt
#可選參數還有
# --sign 加密者信息
# --armor 把文件加密成 ASCII 文件

#解密 A.txt.gpg
gpg --decrypt A.txt.gpg > A.txt

其他GnuPG2常用命令

##生成一對密鑰
gpg2 --full-generate-key
#密鑰種類默認RSA和RSA即可
#RSA密鑰長度默認2048即可
#過期日期默認0即永久,後面會講撤銷方法
#繼續輸入名字、郵箱和注釋
#然後就開始生成密鑰了,這時可以做些移動鼠標敲擊鍵盤的動作幫助程序獲取隨機數
#Termux可能要一兩分鐘,Fedora貌似20秒就搞定了
##導入導出刪除撤銷密鑰
#列出已有的密鑰
gpg2 --list-keys
#列出密鑰的指紋
gpg2 --fingerprint
#為密鑰生成撤銷證書
gpg2 --gen-revoke fred42 > revoke_fred42.txt
#導出一把公鑰,-a表示轉換為可打印字符
gpg2 --export -a fred42 > public.key
#導出一把私鑰,-a表示轉換為可打印字符
gpg2 --export-secret-key fred42 > private.key
#導入一把密鑰
gpg2 --import public.key
#刪除一把公鑰
gpg2 --delete-key fred42
#刪除一把私鑰
gpg2 --delete-secret-key fred42
##使用密鑰服務器上傳搜索與下載公鑰
#Please blame the wall

我的公鑰指紋:F296 FC4F B714 BA14 6366 FEDF 15F7 F20A 33D8 3525和公鑰:

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
Gck=
=CXuU
-----END PGP PUBLIC KEY BLOCK-----

使用GnuPG生成隨機密碼

生成一個16位的隨機密碼

gpg2 --gen-random -a 0 16 | head -c 16

也可將下面代碼存為password.sh,運行./password.sh 16來獲得。

#!/bin/bash
if [ $# -eq 0 ]
then echo "請指定待生成密碼的長度"
else gpg2 --gen-random -a 0 $1 | head -c $1
echo ""
fi

本文更新於 2020/10/30。

分類
方法

Root the Xperia X Compact

先說一下速成方案,電腦是win7,手機是港版F5321,刷的是德國o2 34.4.A.2.85/R2E。然後使用Magisk獲得Root和Busybox。

  1. 按需要進行備份,我就是新機,所以沒有備份。
  2. 下載Xperia X Compact的驅動。手動安裝驅動的方式是,開始/控制面板/設備管理器。樹行圖中選擇根PC,然後在操作菜單選擇添加過時硬件/手動選擇/顯示所有設備/從磁盤安裝/瀏覽。找到解壓出的inf文件安裝即可。
  3. 下載或升級FlashTool,安裝完畢後運行其安裝目錄下的Drivers/Flashtool-drivers.exe,選擇前兩個即Flashmode Drivers和Fashboot Drivers安裝。安裝後可能需要重啟電腦。然後打開FlashTool,點擊XF圖標下載系統盤,文件約有1.7GB。
  4. 打開[stock 8.0][Unlocked bl][34.4.A.2.19; ...32; ...85] Root and Recovery (3 clicks),下載Modded boot img for 34.4.A.2.85、Updated TWRP with working decryption和 serajr's zip。打開Magisk v16.0 - Root & Universal Systemless Interface,下載Latest Magisk。然後將DRM-Fix_System_Mode.zip和Magisk-v16.0.zip複製到手機的外置sd卡。
  5. 手機關機,按住音量減,插入usb線,待FlashTool顯示Flashmode已連接,鬆開音量鍵。然後點擊Flashtool左上角的雷電標誌(Flash),選擇FlashMode,Firmwares里選中下載好的系統,Wipe全部選中,Exclude全部不選,安後按下Flash開始刷機。
  6. 刷機完畢,拔出USB線,關閉FlashTool,不要將手機開機。然後按住音量加鍵並插入USB線,此時進入fastboot模式。在下载文件夹按住Shift键,然后右键单击空白处选择打開命令行工具,然后執行fastboot flash boot boot85.img和fastboot flash recovery twrp-3.2.1-v7.img。然後拔出USB線。
  7. 同時按下電源鍵和音量減鍵,等到手機振動一下,迅速放開電源鍵但保持音量減鍵按下,直到TWRP出現。找到外部SD卡里的DRM-Fix_System_Mode.zip和Magisk-v16.0.zip,刷進手機。開機。打开Magisk,安装Busybox模块即可。

刷後感

手機是港版,為什麼要刷德版呢?因為論壇里提供的img只有.85的,沒有.70的。由於.85有本月的安全更新,所以xposed是用不了的。論壇也有提供自製img的方法,但是我用兩台電腦測試修改.70的img,均報錯。用報錯的img進行刷機貌似失敗,所以用了論壇里的.85img。在第一次操作的時候試圖去備份TA,依然失敗。解鎖bootloader倒是成功了,但這不是必須的。獲得root只是第一部,要想正常使用還需要更多的調教,請參考Xperia X Compact with Android 8

Magisk安裝新模塊後bootloop

#進入TWRP:同時按下電源鍵和音量減鍵,等到手機振動一下,迅速放開電源鍵但保持音量減鍵按下,直到TWRP出現
#Go to "advanced" and then click on "terminal command"
cp /data/magisk.img /data/magisk.img.bk
mkdir /mktmp
mount -o loop /data/magisk.img /mktmp
#查看已安裝的模塊
ls /mktmp
#刪除可疑模塊
rm -rf /mktmp/xxxx
umount /mktmp
#返回,重啟手機即可

本文更新於 2018/07/10。

分類
方法

Xperia X Compact with Android 8

請參考Root the Xperia X Compact來安裝Flashtool和Xperia X Compact驅動,安裝後就可以使用adb命令來調試手機了。

手機上開啟調試模式

設置/系統/關於手機/(最下方)Build number,點擊版本號7次即可開啟開發者選項。在系統菜單里,進入開發者選項,找到Debugging類目下的USB debugging開關,打開它。手機用USB連接電腦就可以了。注意此種模式連接電腦有被安裝病毒軟件風險,所以不要隨便以這種狀態連接任何不明設備。用完後記得關閉調試開關。

去除Wifi標誌上的叉號

出現叉號是因為谷歌的聯通性檢測網址無法被訪問。可以自行搭建一個這樣的服務,v2ex也有提供,這裡使用高通中國(https://www.qualcomm.cn/generate_204)聯通性檢測網址。

2021-10-26 開始高通中國的聯通性測試不行了,所以我自建了一個,順便還能檢查服務器是不是掛了。當然也歡迎大家使用,地址如下:(注意實際請求是到 Cloudflare 的服務器)

adb shell "settings put global captive_portal_https_url https://manchuria.eu.org/generate_204"
adb shell "settings put global captive_portal_http_url https://manchuria.eu.org/generate_204"

禁用或刪除不使用的自帶軟件

universal-android-debloater 提供了更加方便又安全的禁用自帶軟件的辦法,請先參考它。

如果root了,有很多軟件可以選擇,如link2sd。未root可以使用下面命令來實現,參考自:Which Apps are safe to remove after Root

#通過adb打開手機終端
adb shell
#查看所有app
pm list packages | more
#禁用startupflagservice,可以解決手機自動重啟
pm disable-user com.sonyericsson.startupflagservice
#禁用warrantytime,可以去掉開機後的狀態欄提示
pm disable-user com.sonyericsson.warrantytime
#更多可禁用app可參考上面鏈接
#查看已禁用的app
pm list packages -d
#退出終端
exit
#卸載What's New命令
adb uninstall --user 0 com.sonymobile.entrance

換機

大概去年 9 月份的時候,手機的移動信號忽然開始不穩定。一開始是偶爾沒有數據網絡,後來直接「無服務」了。我用聯通和電信卡做測試,以及重新刷機(原裝系統和第三方系統),都未能解決,所以判斷是硬件除了問題。於是又從網上買了一個 Xperia X Compact ,由於日版較港版便宜一些,於是這次買了日版,用了一年多了,也挺好的。沒有移動信號的手機則專門用來短期旅行的時候看地圖和紀錄 GPS 位置用,再也不用擔心手機沒電了。

由於是日版機,所以也就沒有 Root,但是微信和銀行應用又不得不用,好在有 Shelter 。Shelter 可以隔離您的老大哥應用,對於不常用的應用還可以方便的凍結掉。

順帶一提,之前的二手港版機大概是四百多塊,而這個日版大概是三百多塊。我和 Emanon 都是用這款小屏手機,目前都運行良好。之所以買這個手機其實有諸多考慮:比如這款手機屏幕小,4.6";拍照方便,有獨立對焦攝影鍵,視頻防抖也不錯;使用二手機可以為環保事業作出微弱貢獻;資料安全一丟丟,沒有百度等底層服務。不過從 DNS 記錄中可以看到,手機偶爾會連接索尼的服務器,域名包含 geoip、update 等字樣。我家以及我的手機有配置 dns-proxy,所以一些可疑的域名請求都被攔截了,如果是國內廠商,我就不知道該怎麼攔截了;當然還有一點就是能夠在網上買的到。這些電子垃圾從日本倒賣過來,應該是不合法的,隨着經濟下行政策收緊,不知道那家店能做到什麼時候。20200809

本文更新於 2024/04/02。

分類
软件

使用ExifTool處理文件元數據

ExifTool是一款由Phil Harvey開發的獨立於平台的命令行工具,用於處理文件的元數據,例如照片的拍攝日期等。Fedora可以通過下面命令安裝使用。

#安裝ExifTool
sudo dnf install perl-Image-ExifTool
#把DIR文件夾中的文件的拍攝日期增加4小時
exiftool "-DateTimeOriginal+=4" DIR
# -overwrite_original 可不產生.JPG_original原始文件
#修改後會產生.JPG_original原始文件,新文件較原始文件小是因為ExifTool壓縮了Exif信息
#如果修改日期有誤,可以通過這個命令恢復圖片原始文件
for file in *.JPG_original;do mv "$file" "$(basename "$file" .JPG_original).JPG"; done
#Linux重命名DIR文件夾中的名字為拍攝日期
exiftool -overwrite_original -d %y%m%d_%H%M%S%%-c.%%e "-filename<DateTimeOriginal" DIR
#Windows重命名DIR文件夾中的名字為拍攝日期
"D:\Program Files\portable\exiftool.exe" -d %y%m%d_%H%M%S%%-c.%%e "-filename<DateTimeOriginal" E:\Image\DIR
#Windows中重命名DIR文件夾中的mov視頻名字為拍攝日期
"D:\Program Files\portable\exiftool.exe" -ext mov -d %y%m%d_%H%M%S%%-c.%%e "-filename<DateTimeOriginal" E:\Image\DIR
#Windows中重命名DIR文件夾中的gopro拍攝的mp4視頻名字為拍攝日期
"D:\Program Files\portable\exiftool.exe" -ext mp4 -d %y%m%d_%H%M%S%%-c.%%e "-filename<MediaCreateDate" E:\Image\DIR

#查看MOV文件中的可用時間標籤
"D:\Program Files\portable\exiftool.exe"  -time:all -a -G0:1 -s  E:\Image_55\DIR\LA090570.MOV
#清除當前文件夾中所有exif數據
exiftool -all= *

##GPS 相關
#以 json 方式輸出所有 gps 相關標籤
exiftool -struct -j -a -n "-gps*" E:\Image\a.JPG
#把照片的位置設置爲 GCJ-02 座標系統,並指定經緯度
exiftool -exif:gpsmapdatum=GCJ-02 -exif:gpslatitude=22.12345 -exif:gpslongitude=114.12345 E:\Image\a.JPG

本文更新於 2021/05/10。