Fedora25使用DNSCrypt

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

安裝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-proxy就會自動執行了。當然你也可以手動通過systemctl命令來啟動和停止dnscrypt-proxy,像這樣:

sudo systemctl start dnscrypt.service

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

Android下可用的SQL Client

SQL Client是一個可以在安卓手機上鏈接MySQL數據庫的應用,界面挺漂亮。如果偶爾要用手機檢查一下數據庫的資料,那麼基本的查詢功能是可以滿足的,看介紹說還能導出cvs文件。不足之處也不多:1,無法通過ssh連接數據庫,只能通過數據庫的地址和端口連接。2,每條SQL都保存爲一條記錄,好像會產生很多記錄。一些複雜的操作還是通過JuiceSSH進服務器執行吧。

電腦上一直在用MySQL Workbench,感覺還可以。

Ubuntu16給python3.5安裝OpenCV3.2

過程略繁瑣,參考了Install OpenCV 3.0 and Python 3.4+ on Ubuntu。安裝完成可在python中import cv2.

#安裝依賴及工具
sudo apt-get install build-essential cmake git pkg-config
sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3.5-dev

由於我已經有python3.5的virtualenv了,所以這里就不再說了,可以参考pip3为python3安装模块

#啓動python3.5的環境
source ~/pythons/p35/bin/activate
#安装numpy
pip install numpy -i https://pypi.douban.com/simple/
#下載並解壓OpenCV,github我克隆不下拉
cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.2.0.zip
unzip opencv_contrib.zip
cd ~/opencv-3.2.0
mkdir build
cd build
#cmake中間如有終端,可參考錯誤提示直接從web下載相關文件放於提示位置
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
    -D PYTHON_EXECUTABLE=~/pythons/p35/bin/python \
    -D BUILD_EXAMPLES=ON ..
#成功執行後要留意python3的環境是否正確應有類似如下字樣
--   Python 3:
--     Interpreter:                 /home/42/pythons/p35/bin/python3 (ver 3.5.2)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)
--     numpy:                       /home/42/pythons/p35/lib/python3.5/site-packages/numpy/core/include (ver 1.12.0)
--     packages path:               lib/python3.5/site-packages
-- 
--   Python (for build):            /home/42/pythons/p35/bin/python3
#然後就可以編譯了
make -j$(nproc)
#編譯完成後執行安裝
sudo make install
sudo ldconfig
#查看是否安裝成功
ls -l /usr/local/lib/python3.5/site-packages/ | grep cv2
#成功的話應該會有文件出現類似
-rw-r--r-- 1 root staff 3550256 2月  17 20:36 cv2.cpython-35m-x86_64-linux-gnu.so
#把cv2關聯到python環境裏
cd ~/pythons/p35/lib/python3.5/site-packages/
ln -s /usr/local/lib/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so cv2.so
#查看是否可用
python
>>> import cv2
>>> cv2.__version__
'3.2.0'

Fedora Workstation Tricks

Fedora25 Win10雙系統

買了新電腦,裡面自帶兩個3.5英寸鍵盤位。於是一個硬盤裝了Fedora20一個裝了win10。先裝得Win10,這樣Fedora安裝的時候就會自動把Win10添加到啟動項中,很方便。

Fedora新機Tricks

shadowsocks可以參考shadowsocks client and firefox on Ubuntu 12以及shadowsocks的systemd開機啟動設置可以參考Host a Debian in Win7 VirtualBox

#增加軟件源Activate RPMFusion Repository
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
#常用軟件
nano uget nethogs vlc mozilla-vlc gimp VirtualBox
#Adobe Flash
rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux
dnf install flash-plugin alsa-plugins-pulseaudio libcurl
#Netspeed - 網速顯示控件
https://extensions.gnome.org/extension/104/netspeed/
#TaskBar - 任務欄(其實自帶也有,可以通過安裝GNOME Tweak Tool來配置)
https://extensions.gnome.org/extension/584/taskbar/
#強烈推薦安裝GNOME Tweak Tool

Fedora的坑

外接的USB無線網卡總是隨機斷線。其實wifi狀態還是連着的,但wifi標誌會變成問號,搜索後發現只要在無線設置里關閉IPV6就可以了。最後發現這個問題還是比較棘手的,搜了嘗試里很久也沒有搞定。

文件管理器的右鍵居然沒有“新增空白文件”,解決辦法是到自己的Templates(模板)文件夾下,新建一個空白文檔,右鍵就有新增文件了。

無法掛在windows的ntfs格式磁盤的時候,可以嘗試執行ntfsfix,我執行後即可正常掛在win7下的ntfs磁盤。注意此方法可能不安全。

後記

白天看到新聞說希捷關了蘇州的工廠,我還跟Emanon討論了一番,沒想到晚上回家Fedora便發出警告,說硬盤即將報廢。這塊1.5T的硬盤是08年生產的,到現在也將近9個年頭了,已經很不錯了。

最近在看機器學習的東西,發現各種工具對Ubuntu的支持還是最好,雖然有點捨不得Fedora,但晚上還是回歸到Ubuntu一段時間吧。

服務器連接pptp

需要從某網站頻繁獲取數據,但目標網站對IP限制嚴格,於是想到用vpn。市面上(淘寶)有種每次連接都會自動切換IP的PPTP VPN,很符合需求,下面就是怎麼用了,環境是CentOS6。

#安裝pptp
yum install pptp pptp-setup
#配置pptp
pptpsetup --create v --server vpn.server.address --username USERNAME --password PASSWORD
#淘寶的這種pptp vpn一般是不用加密設置的,萬一需要,可以在配置命令最後加--encrypt參數
#為了方便後續使用,我們複製兩個命令
cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin/
cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin/
chmod +x /usr/sbin/pon
chmod +x /usr/sbin/poff
#啟動pptp
pon v
#如果啟動成功路由表中應該會出現一個ppp0的設備
route -n
#如果沒出現可以查看那裡出了問題
tail -n 10 /var/log/messages | grep ppp
#這是如果把網關設置到ppp0所有流量就都走vpn了\
#但是啊,你將失去ssh連接,很恐怖吧\
#這時最好有服務器的網頁端供你連到內網進行操作\
#當然,重啟服務器也能恢復連接
#下面設置路由表
/sbin/route del -net default
/sbin/route add -net default dev ppp0
#此時所有流量就pptp了,通過下面命令查看
curl http://myip.dnsdynamic.org/
#執行需要pptp的ip完成的任務
#關閉vpn
poff
#理論上此時應該恢復之前的路由表
#但我偷了個懶,重啟了一下網絡
/etc/init.d/network restart
#從pon到重啟網絡,就完成了一個工作循環。

使用php腳本完成pptp的切換,其實就是php調用bash,兩點:運行用戶為root;命令最好寫相對路徑。

#!/usr/bin/php
<?php
class HttpClient{
    private $ch;

    function __construct($cookie_jar){
        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0');
        curl_setopt($this->ch, CURLOPT_TIMEOUT, 40);
        curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookie_jar);
        curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookie_jar);
    }

    function __destruct(){
        curl_close($this->ch);
    }

    final public function setReferer($ref=''){
        if($ref != ''){
            curl_setopt($this->ch, CURLOPT_REFERER, $ref);
        }
    }

    final public function Get($url, $header=false, $nobody=false){
        curl_setopt($this->ch, CURLOPT_POST, false);
        curl_setopt($this->ch, CURLOPT_URL, $url);
        curl_setopt($this->ch, CURLOPT_HEADER, $header);
        curl_setopt($this->ch, CURLOPT_NOBODY, $nobody);
        return curl_exec($this->ch);
    }

    final public function Post($url, $data=array(), $header=false, $nobody=false){
        curl_setopt($this->ch, CURLOPT_URL, $url);
        curl_setopt($this->ch, CURLOPT_HEADER, $header);
        curl_setopt($this->ch, CURLOPT_NOBODY, $nobody);
        curl_setopt($this->ch, CURLOPT_POST, true);
        curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($data));
        return curl_exec($this->ch);
    }
}

function getNewIP(){
    $logIPFile="/home/logIP.txt";
    $res=array();
    exec("/usr/sbin/pon v", $res);
    sleep(3);
    exec("/sbin/route del -net default", $res);
    sleep(2);
    exec("/sbin/route", $res);
    sleep(6);
    exec("/sbin/route add -net default dev ppp0", $res);
//	var_dump($res);
    sleep(1);
//    需要一個cookie文件,創建一個空文件即可
    $http = new HttpClient('/home/dump.txt');
    $ip = $http->Get("http://myip.dnsdynamic.org/");
    sleep(1);
    file_put_contents($logIPFile, date("Y-m-d H:i:s", time())."_".$ip.PHP_EOL , FILE_APPEND | LOCK_EX);

    $ips=array();
    exec("tail -n 2 '$logIPFile'", $ips);
    $isNewIP=0;
    foreach( $res as $oldIP ){
        if(strpos($oldIP, $ip) != false){
           $isNewIP=$isNewIP+1;
       }
    }

    return $isNewIP; 
}

function restoreIP(){
    exec("/usr/sbin/poff",$res);
//	var_dump($res);
    sleep(2);
    exec("/etc/init.d/network restart");
}

//如果IP沒有重複兩次以上就執行任務
if( getNewIP($logIPFile) <2 ){
//    doYourOwnStaff();
} 
restoreIP();
exit();
?>

crontab的設置,這裡不用crontab -e,而是直接編輯/etc/crontab:

nano /etc/crontab
#指定運行命令的用戶為root
03 * * * * root /path/to/the/script

這樣就完工了,感謝CentOS 6下配置PPTP VPN客户端在 Linux 命令列進行 PPTP VPN 連線。在完全不了解linux路由表和iptables的情況下,我也只能做到如此了。其實理想狀態是只轉發http和https到pptp,有空再研究吧,新年快樂!


由於政策原因,動態pptp沒那麼好買了。於是年後換了一批靜態pptp,做法就是新建多個pptp配置,然後隨機取。

$vpns = array("v47", "v11", "v18", "v12");
$rand_keys = array_rand($vpns, 2);
$vpn = $vpns[$rand_keys[0]] ;

在設置過程中,遇到了unknown authentication type 26; Naking錯誤,解決辦去掉/etc/ppp/options.pptp文件中的require-mppe-128的注釋,並在修改配置文件為如下:

# written by pptpsetup
pty "pptp SERVER --nolaunchpppd"
lock
noauth
refuse-pap
refuse-eap
refuse-chap
refuse-mschap

nobsdcomp
nodeflate
require-mppe-128
name MYUSERNAME
remotename CONFNAME
ipparam CONFNAME

另一種可能的錯誤是連接的時候出現LCP: timeout sending Config-Requests,我是通過chkconfig iptables off關閉iptables解決的,反正我在內網。

上文中的/etc/init.d/network restart有時並不能恢復本機網絡,此時我們可以替換腳本中的這一句為

#網關改回原來的網關
subprocess.call('/sbin/route add default gw 172.16.2.1 netmask 0.0.0.0 dev eth0', shell=True)

Linux硬盤滿

如果重啟後無法進入桌面環境,很可能是硬盤滿了,此時按Ctrl+Alt+F2進入命令行模式。

#查看磁盤空間剩餘情況
df -hl
#如果確實是磁盤可用空間不足
#則查看是那個文件夾里有大文件,一般都是/tmp
cd /tmp
#以文件夾大小排序,顯示最大的15個
du -hsx * | sort -rh | head -15

釋放出200M空間就差不多可以進桌面環境了。

在頻繁使用selenium調用火狐的時候,/tmp中會出現打量類似tmpzujczqpd的文件夾,可以使用下面代碼進行刪除。

import glob,shutil
def rmFirefoxTmpFile():
    usage = shutil.disk_usage('/tmp')
    #如果磁盤可用空間小於1G則執行刪除
    if usage.free<1024*1024*1024*1:
        #火狐產生的文件夾大概長這樣
        files = glob.glob('/tmp/tmp????????')
    
        for f in files:
            #刪除最後修改時間10個小時以前的文件夾
            if time.time() - os.path.getmtime(f)>10*60*60 :
                shutil.rmtree(f,True)
            

ssh connecting

記錄下ssh連接服務器的幾種方式:

linux to linux

直接打開終端,以帳號密碼方式登錄,如下:

ssh -l root -p 2016 123.159.181.162

如果厭倦了每次都要輸密碼,可以通過證書方式登錄,還能增加安全性。設置方法可以參考SSH Passwordless Login Using SSH Keygen in 5 Easy Steps,寫的很詳細。

android to linux

ConnectBot是一款簡單、強大、開放原始碼的SSH用戶端。增強鍵盤中方向鍵和Ctrl、Tab等鍵用起來很方便。而且它還能連local,就當作一個本地的Terminal了。

另一個選擇是JuiceSSH。其實呢從個方面(更強大的鍵盤和更便利的剪切板操作)我都覺得JuiceSSH比ConnectBot厲害,但是我還是要在一開始推薦一下開源軟件。

windows to linux

其實比putty厲害的軟件也有很多,但我只用過putty。

ios to linux

能用錢解決的問題都不是問題😉