分類
方法 软件

在安卓手機上使用xprivacy保護隱私

使用xprivacy需要root權限和xposed框架。獲取root權限和安裝xposed框架請參考https://forum.xda-developers.com/

以下內容機翻自yannick.12的貼子,原文地址https://forum.xda-developers.com/showpost.php?p=68744809&postcount=7

讓我們舉一個簡單的例子, 比如位置。

首先, 讓我們假設第二列是未選中的。這是最容易理解的情況。然後會發生什麼取決於第一列。

第一列-如果它選中, 那麼xprivacy將始終拒絕訪問的位置, 並把xprivacy里設置的假冒資訊給應用程式。

然而, 如果第一列沒有被選中, 那麼應用程式將能夠獲取您的實際位置。

這就是你對一個應用程式權限做出的回答, 它的答案是 "可以使用這個許可權嗎?" 總是相同的 (無論是 "總是" 還是 "從不")。第二列未選中, 第一列選項告訴應用程式是或否。

第二列控制您在xprivacy中看到的彈窗。如果選中第二列, 您將得到一個彈窗, 詢問是否允許該應用程式獲得許可權 (是否選中了第一列)。

彈窗有四種情況-"允許", "拒絕", "不知道", "哎呀我超時"。

"哎呀, 我超時了" 將給app第一列的答案。

如果您在彈窗中按一下 "允許", 然後 xprivacy 取消勾選設置中的第二列, 再取消勾選第一列, 並讓應用程式訪問您的真實位置。除非重新勾選 xprivacy 設置中的第二列, 否則彈窗不會再次出現。

如果你點擊 "拒絕" 然後 xprivacy 取消勾選第二列, 勾選第一列並給應用程式假位置。然後, 你將不會看到彈出。

如果您按一下 "不知道", 那麼我認為 * xprivacy 拒絕訪問 (無論第一列是否未選中), 並將第二列保留為選中狀態, 因此下次將再次詢問。

我怎麼發現的?嗯, 我不是從常見問題解答中讀到的!我昨天剛剛下載 xprivacy , 我發現它令人難以置信的困難。最後, 我下載了一個應用程式, 它顯示出你的 gps 位置, 沒有別的, 我只是測試。以上是我的總結。我希望它能幫助別人, 因為我希望我昨天讀過這個帖子。

請注意, 其他許可權的工作方式可能稍有不同。例如, 它不可能完全虛擬一整套互聯網資訊。您可以通過查看 xprivacy 設置來快速瞭解哪些資料可以偽造。例如, 你可以偽造你的電話號碼和你的 MAC 位址。但正如我已經說過, 你不能假冒你的互聯網, 你也不能偽造你的存儲-這是一個很好的主意, 因為如果你假裝讓一個應用程式寫到您的 SD 卡, 然後假裝讓它讀它, 它不能找到它剛剛寫過的東西, 這勢必會導致麻煩, 可能會比你剛拒絕它的時候更麻煩。


2021年更新:由於維護一個安全的 root 過的安卓系統越來越困難,而我也隨著年齡的增加而喪失了一部分好奇心,所以我現在使用開源應用 Shelter 來將自己不信任的應用隔離到獨立的區域。Shelter 雖不如 xprivacy 功能強大,但對於基本的隱私防護(通訊錄、地理位置、手機內的文件資料、避免應用後台運行)是沒有問題的。安裝使用也非常簡單方便,推薦大家試用。

本文更新於 2021/02/05。

分類
程序

使用xtrabackup備份mysql數據庫

本文主要記錄下使用percona xtrabackup 2.4來備份mysql數據。最終效果是實現mysql所在主機定時進行全量備份和增量備份並自動刪除舊備份文件。另有一台數據存儲機,定時通過ssh抓取各個mysql主機上的備份文件,保存更長時間後刪除舊文件。

用到的軟件和技術有:xtrabackup(免費的mysql備份程序),qpress(xtrabackup壓縮需要的依賴,據說壓縮比很高),python3.5(ssh的遠程抓取,因為我不會bash)。

mkdir -p /root/42/script
cd /root/42/script
#安裝qpress
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xf qpress-11-linux-x64.tar
mv qpress /usr/local/bin/
#centos6安裝xtrabackup
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install libev -y
yum install percona-xtrabackup-24 -y
#新建backup.sh(來源未知)內容如下:
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 
BACKUP_BASE_DIR="/data/backup/xtrabackup"
INC_BASE_LIST="${BACKUP_BASE_DIR}/inc_list.txt"
XTRABACKUP_PATH="/usr/bin/innobackupex"
 
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=127.0.0.1
MYSQL_USERNAME=root
MYSQL_PASSWORD=""
 
LOCK_FILE="/tmp/innobackupex.lock"
THREAD=3
 
mkdir -p ${BACKUP_BASE_DIR}
CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M)"
[[ -d ${CURRENT_BACKUP_PATH} ]] && CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M-%S)"
 
print_help(){
    echo "--------------------------------------------------------------"
    echo "Usage: $0 full | inc | help               "
    echo "--------------------------------------------------------------"
    exit 1
}
 
[[ $# -lt 1 || "$1" == "help" ]] && print_help
 
[[ -f "$LOCK_FILE" ]] && echo -e "Usage: rm -f $LOCK_FILE\nUsage: chattr -i $LOCK_FILE && rm -f $LOCK_FILE" && exit 1
 
FullBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --compress \
    --compress-threads=${THREAD} \
    --parallel=${THREAD} \
    --no-timestamp ${CURRENT_BACKUP_PATH} > ${CURRENT_BACKUP_PATH}_full.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_full.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "NULL|${CURRENT_BACKUP_PATH}|full" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}
 
IncBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    PREV_BACKUP_DIR=$(sed '/^$/d' ${INC_BASE_LIST} | tail -1 | awk -F '|' '{print $2}')
    ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --compress \
    --compress-threads=${THREAD} \
    --no-timestamp --incremental ${CURRENT_BACKUP_PATH} \
    --incremental-basedir=${PREV_BACKUP_DIR} > ${CURRENT_BACKUP_PATH}_inc.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_inc.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "${PREV_BACKUP_DIR}|${CURRENT_BACKUP_PATH}|inc" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}
 
## 全量備份
if [ "$1" == "full" ];then
    FullBackup
fi
 
## 增量備份
if [ "$1" == "inc" ];then
    ## 若全量備份不存在,則執行全量備份
    if [[ ! -f ${INC_BASE_LIST} || $(sed '/^$/d' ${INC_BASE_LIST} | wc -l) -eq 0 ]];then
        FullBackup
    else
        IncBackup
    fi
fi
 
## 刪除22天前的備份
if [[ -d ${BACKUP_BASE_DIR} && $(pwd) != "/" ]];then
    find ${BACKUP_BASE_DIR} -name "$(date -d '22 days ago' +'%F')_*" | xargs chattr -i
    find ${BACKUP_BASE_DIR} -name "$(date -d '22 days ago' +'%F')_*" | xargs rm -rf
fi

#可能需要修改backup.sh中的如下參數
BACKUP_BASE_DIR="/data/backup/xtrabackup"
XTRABACKUP_PATH="/usr/bin/innobackupex"
 
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=127.0.0.1
MYSQL_USERNAME=root
MYSQL_PASSWORD=""
#給腳本添加執行權限
chmod 755 /root/42/script/backup.sh
#执行一次全量备份
/root/42/script/backup.sh full
#如果沒有錯誤信息,就可以看到BACKUP_BASE_DIR下生成了備份文件
#檢查下cron是否啟動
service crond status
#如果未啟動則將cron設置為開機啟動並手動啟動下
chkconfig crond on
service crond start
#添加定時任務
crontab -e
#在底部新增內容
## 每周六凌晨3:30一次全量备份
## 每周二、四、日的凌晨3:30点执行增量备份
30 3 * * 6 /root/42/script/backup.sh full
30 3 * * 2,4,7 /root/42/script/backup.sh inc

本文更新於 2017/09/25。

分類
软件

我的Git命令記錄

把本地項目傳到 Gitea

首先在 Gitea 新建項目,輸入項目名 YOUR_PROJECT_NAME,其他都不用動。

然後根據 Gitea 的提示,在本地執行下列命令:

#創建說明文檔
touch README.md
#創建忽略文檔,下面有個示例
touch .gitignore
#初始化 git 並推送至服務器
git init
git checkout -b main
(或 github 的 git branch -M main)
git add *
git commit -m "first commit"
git remote add origin https://git.disroot.org/user/YOUR_PROJECT_NAME.git
git push -u origin main

.gitignore 示例

# Django #
*.log
*.pot
*.pyc
__pycache__
db.sqlite3
/app1/migrations
/app1/profile_dir/*
*.lock

#mysite/settings.py
*.env
*.env_1
media
/static

# Backup files # 
*.bak 
*.log
*.log.*

# Eclipse # 
.project
.pydevproject

在服務器部署和更新 Git 代碼倉庫中的代碼

#Clone 項目到服務器
git clone https://git.disroot.org/user/YOUR_PROJECT_NAME.git
cd YOUR_PROJECT_NAME
#拉取代碼倉庫的更新
git fetch
git checkout origin main
[code]

<h3>?</h3>
<p>在服務器上初始化項目</p>
[code language="bash"]
cd /temp
git clone --bare /home/fred/Documents/workspace/amazon/.git amazon.git
scp -P 2009 -r amazon.git [email protected]:/data/42/git

在本地添加遠程項目

git remote add origin ssh://[email protected]:2009/data/42/git/amazon.git
git remote -v
#推送
git push origin master
#下載更新
git clone ssh://[email protected]:2009/data/42/git/unlock.git

本文更新於 2023/11/25。

分類
Linux

Fedora使用DNSCrypt

DNSCrypt是一種認證DNS客戶端和DNS解析器之間通信的協議。 它可以防止DNS欺騙。下面記錄下在Fedora25上使用DNSCrypt的步驟。

dnscrypt-proxy 2 是一個更棒的升級,如果你用的是v1,非常建議升級。官方的安裝文檔已經寫的很詳盡,這裡再簡單記錄一下。

#用超級用戶操作
su -s
#下載dnscrypt-proxy-linux_x86_64-2.0.25.tar.gz並解壓至/opt/dnscrypt-proxy/
#其實解壓到哪裡都無所謂啦
cd /opt/dnscrypt-proxy/
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
#選擇性修改fallback dns如
fallback_resolver = '114.114.114.114:53'
#開啟分流文件
#曾經在不分流的情況下用了一年左右,奈何網絡持續惡化,現在不分流體驗會很差
#中國域名來自https://github.com/felixonmars/dnsmasq-china-list/blob/master/accelerated-domains.china.conf
#需要替換成dnscrypt-proxy的格式
forwarding_rules = '/home/fred/Programs/dnscrypt-proxy/forwarding-rules.txt'
./dnscrypt-proxy
#出現dnscrypt-proxy is ready即為成功,可以先Ctrl+C關閉
#执行下面命令使普通用戶也能運行dnscrypt-proxy
setcap cap_net_bind_service=+pe dnscrypt-proxy
#下面設置本機dns解析方法一:
cp /etc/resolv.conf /etc/resolv.conf.backup
nano /etc/resolv.conf
#文件內容如下
nameserver 127.0.0.1
options edns0 single-request-reopen
#下面設置本機dns解析方法二:
#右擊網絡連接圖標,選擇“編輯網絡連接”,選擇網絡,點齒輪圖標。
#在“IPv4設定”選項卡,Method選“只用自動(DHCP)位址”
#DNS servers填入127.0.0.1, 8.8.4.4,按“儲存”。
#右擊網絡連接圖標,反選啟用網絡,再勾選啟用網絡。
#設置完成,測試解析
./dnscrypt-proxy -resolve ft.shaman.eu.org
#如果返回了IP就說明OK

#自動啟動我都是用的xfce的啟動程序,位於
#應用程式選單/設定值/工作階段與初始啟動/應用程式自動啟動/加入
#指令框輸入/opt/dnscrypt-proxy/dnscrypt-proxy
#NetworkManager會在開機時生成重寫/etc/resolv.conf
#所以需要在NetworkManager的IPV4設定中指定127.0.0.1為dns服務器
#或者
#給resolv.conf上把鎖
chattr +i /etc/resolv.conf
#解鎖
chattr -i /etc/resolv.conf

如果想分享dnscrypt-proxy服務給局域網用戶,可以修改dnscrypt-proxy.toml中的監聽地址為['0.0.0.0:53']。然後開啟防火牆的53端口。

部分配置示例

#程序日誌
log_file = '/home/ft/Programs/dnscrypt-proxy/log.log'

#解析日誌
[query_log]
file = '/home/ft/Programs/dnscrypt-proxy/query.log'
ignored_qtypes = ['AAAA', 'DNSKEY', 'NS']

#域名黑名單
[blocked_names]
blocked_names_file = '/home/ft/Programs/dnscrypt-proxy/mybase_blocked-names.txt'
#此處使用的黑名單來自 https://download.dnscrypt.info/blacklists/domains/

#NextDNS 解析
[static]
  [static.'NextDNS-12abcd']
  stamp = 'sdns://AgEAAAAAAAAAAAAOZG5zLm5leHRkbnMuaW8HLzc3WiXnZO'
#使用 NextDNS 時還要設置 server_names
server_names = ['NextDNS-12abcd']

值得提醒的是,如果你使用 BT 下載,那麼很多黑名單是禁止 trackers 相關域名的,記得禁用這一條#tracker.*。自定義的 DNS 服務器可以使用 Online DNS Stamp calculator 來生成簽章。

不再實用的配置

安裝dnscrypt-proxy並新建一個執行用戶

sudo dnf install dnscrypt-proxy
sudo adduser -m -N  -r -s /bin/false dnscrypt

安裝完成後可以從/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv的第一列挑選一個服務商,我嘗試用香港的發現連接不上,於是選擇法國cs-fr。嘗試運行dnscrypt-proxy:

sudo dnscrypt-proxy -u dnscrypt -R cs-fr

我的桌面是Xfce,所以設置DNS很方便。找到程序/設定值/網路連線,選中需要編輯的網路點編輯。在IPv4設定面板中,如果你之前方法是“自動(DHCP)”,則變更方法為“只用自動(DHCP)位址”,並在DNS伺服器一欄填入127.0.0.1。如果之前就有固定IP,則只需要把DNS伺服器一欄改為127.0.0.1即可。多個DNS伺服器可以用半角逗號隔開。

如果沒有桌面環境,要設置DNS的話可以參考The adventurous can edit the appropriate script in /etc/sysconfig/network-scripts/. If you don't have NetworkManager installed, editing /etc/resolv.conf would work too.

重啟網絡服務已使剛剛新設置的DNS生效。可以使用dig驗證當前dns,出現SERVER: 127.0.0.1#53即說明成功。

sudo systemctl restart network.service
dig ft.wupo.info

設置自動重啟也很簡單,新建文件/etc/systemd/system/dnscrypt.service,內容如下:

[Unit]
Description=dnscrypt - Encrypted DNS service provided by OpenDNS
After=NetworkManager.service

[Service]
ExecStart=/usr/sbin/dnscrypt-proxy -u dnscrypt -R cs-fr
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=basic.target

重啟系統守護

sudo systemctl daemon-reload

添加dnscrypt到開啟啟動

sudo systemctl enable dnscrypt.service

當然你也可以手動通過systemctl命令來啟動和停止dnscrypt-proxy,像這樣:

sudo systemctl start dnscrypt.service

參考鏈接:Lucid Electric Dreams: Setting up dnscrypt on Fedora

本文更新於 2024/10/17。

分類
网站

未備案域名被拒絕解析緊急處理

未備案域名的80端口被停止解析,業務被中段。緊急將域名指向香港服務器,並在香港服務器nginx做如下轉發即可:

server {
    server_name manage.wupo.info;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://1.2.3.4:8888;
    }
    access_log logs/manage.wupo.info_access.log;
}

如果目標地址仍是80,需要注釋掉proxy_set_header Host $host;這句,否則還是訪問不了。

分類
网站

nginx記錄特定請求的日誌

通過nginx的access log可以記錄訪問日誌,如果只想記錄特定的某條請求,例如所有以/get開頭的請求,可以這麼配置:

map $request $loggable {
    ~/get* 1;
    default 0;
}

server {
        listen 8085;
        server_name 127.0.0.1;
        charset utf-8;

        access_log logs/flask.access.log combined if=$loggable;
        location /  { try_files $uri @yourapplication; }
        location @yourapplication {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
        }
}

如果要排除,只記錄以/get開頭的請求,map可以這麼寫

map $request $loggable {
    ~/get* 0;
    default 1;
}

修改之後可以通過 tail -f ../logs/flask.access.log實時查看log的變動。

分類
网站

黑屏

我的這塊戴爾S2340Mc屏,黑色時完全就是一面鏡子!為了當鏡子用,我需要一塊黑色。另外div中height設1000%是不行,參考height: 100% not working

浮動無邊黑屏

#!/usr/bin/python3
# -*- coding: utf8 -*-

#dnf install python3-matplotlib
#pip install matplotlib,fire

#指定起始坐標xy、寬度、高度和顏色,來畫一個填充好的矩形
#為了遮擋盜版電影頂部和底部的賭城廣告

import fire,matplotlib

def drawRectangle(x='0',y='0',width='400',length='400',color='black'):
    #"640x400+0+200"
    conf = str(width) + 'x' + str(length) + '+' + str(x) + '+' + str(y)
    # make sure Tk backend is used
    matplotlib.use("TkAgg")  
    import matplotlib.pyplot as plt
    # turn navigation toolbar off
    plt.rcParams['toolbar'] = 'None'
    plt.rcParams['figure.facecolor'] = color
    # create a figure and subplot
    fig, ax = plt.subplots(figsize=(2,2))
    #remove margins
    fig.subplots_adjust(0,0,1,1)
    # turn axes off
    ax.axis("off")
    # show image
    # im = plt.imread("black.png")
    # ax.imshow(im)
    
    # remove window frame
    fig.canvas.manager.window.overrideredirect(1)
    plt.get_current_fig_manager().window.wm_geometry(conf)
    plt.show()
    
#drawRectangle('10','980')

if __name__ == '__main__':
    fire.Fire(drawRectangle)
    
#默認在屏幕左上角生成一個400*400的黑屏
python drawRectangle.py
#在左下角(0,980)生成一個128*72的紅屏
python drawRectangle.py 0 980 128 72 red

本文更新於 2018/07/23。