找了一下網路上大家怎麼做,這邊提供兩種作法
記得先安裝 socat apt install socat
執行結果root@Moxa:~# socat -u -x file:/dev/ttyM0,raw file:/dev/null 2>&1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'
2016-02-03 11:18:56 31 32 33 0d 0a
2016-02-03 11:19:04 34 35 36 0d 0a
2016-02-03 11:19:12 37 38 39 0d 0a
ref: Is there a Unix utility to prepend timestamps to stdin?
root@Moxa:~# jpnevulator --ascii --timing-print --tty /dev/ttyM0 --read |
以上兩種方式,任君選擇~
]]>故事是這樣…Gitlab 7 啟用 LDAP 功能讓每位同事都能透過公司的帳號密碼登入。有一天組織變動後,居然怎麼樣都無法登入了!囧rz…
尋尋覓覓找到照篇討論 Existing users cannot login with ldap accounts
sudo -u git RAILS_ENV=production /opt/gitlab/bin/gitlab-rails console
for item in Identity.find_each |
過了這麼久,該 Issue 還是開著呢。
]]>python -m SimpleHTTPServer
一直是我滿常用的指令,可以快速啟動一個無腦的 HTTP Server,讓我可以做下載檔案之類的簡單測試。不過,有一次在測試 IPv6 環境赫然發現…這個 SimpleHTTPServer 真的是有點過分簡單了,居然連 IPv6 都不支援呀 😂
上網看到了這篇
照樣畫葫蘆修改檔案 /usr/lib/python2.7/SimpleHTTPServer.py
改動部份如下:import socket
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
ServerClass.address_family = socket.AF_INET6
ServerClass(('::',8000),HandlerClass).serve_forever()
打完收工
]]>In computing, Virtual Network Computing (VNC) is a graphical desktop sharing system that uses the Remote Frame Buffer protocol (RFB) to remotely control another computer. It transmits the keyboard and mouse events from one computer to another, relaying the graphical screen updates back in the other direction, over a network.
apt update
更新 source listapt install tightvncserver autocutsel
啟動 Copy/Paste 功能,編輯 ~/.vnc/xstartup
。改為下面:
#!/bin/sh |
autocutsel -fork
是負責處理 X Server 的 Copy/Paste最後可以透過指令 tightvncserver -geometry 1440x900
啟動一個解析度為 1440x900
的桌面
那就是系統時間只要 倒退嚕 某些 Python thread 就會卡住 (其實不是卡住)
我們都知道系統時間是有可能會改變的 (藉由 NTP, 基地台校時, 手動, 等方式),但是很多程式的 timeout 相關機制設計是有缺陷的。舉個例子:一個 10 秒的 timeout 可以寫成 起始系統時間 - 現在系統時間 >= 10
就執行
淺而易見地,如果今天時間回溯如:2016 調整到 2000,那這樣這個 timeout 要等 16 年 才會觸發…
所以通常,有幾種做法:
使用 monotonic time
The kernel call for time functions. Using CLOCK_MONOTONIC is typically better than using CLOCK_REALTIME because the monotonic clock is always increasing, so you don’t have to worry about someone’s changing the clock.
ref: http://www.qnx.com/developers/docs/6.4.1/neutrino/technotes/time.html
取兩個時間相減後的絕對值 (缺點:並非真正的 timeout 時間,但可以抵抗系統時間往前。如果你沒辦法取得 monotonic time 也許也是一個方式)
在 Python 世界中,一直到 PEP 418 – Add monotonic time, performance counter, and process time functions,規範 stdlib monotonic time 的機制。(可能是考量到跨平台與可移植性…所以直到 2012 才加入這個功能)
Anyway, Python 2.7 中,Queue.get()
, 以及 threading.condition
中都使用了 time.time()
來判斷 timeout,如此一來只要使用者不慎將時間往回調你的程式行為可能就不如預期。
(題外話:系統時間大幅度往前實際上是很少發生的,也應該要被避免。因為其他背景執行程式如何實作 timeout? 或是其他功能可能會有預期外的行為發生。)
可以看一下 Python 2.7 source code 其中的 _time()
是 time.time()
,所以可以明顯地看出如果系統時間往回調,這邊的 threading.condition.wait()
會行為異常。
endtime = _time() + timeout |
以上取自 https://github.com/python/cpython/blob/2.7/Lib/threading.py#L349-L358
像這樣的例子在 Python code base 還有很多,詳細請見這個 patch 將所有 timeout 全部替換成使用 monotonic 來計算
最後補上一些前人的痛:
最後我想說:Let’s upgrade to Python 3.5!
]]>這邊作一下紀錄…
λ ~/temp/ diff -bur FOLDER_1 FOLDER_2 |
會發現輸出的 diff 居然沒有顏色…
於是乎又找到 colofdiff
直接 apt-get install colordiff
即可,就會變成這樣
diff -bur FOLDER_1 FOLDER_2 | colordiff |
打完收工。
]]>Reference: How do I install and run a TFTP server?
先安裝好相關套件
sudo apt-get install xinetd tftpd tftp |
新增一組設定檔,放置於 /etc/xinetd.d/tftp
service tftp |
這邊可以看到開啟了 udp 在 69 port、user 是 nobody、server 是 /usr/sbin/in.tftpd、而帶入的參數即為我們放置檔案的資料夾 /tftpboot
新增 /tftpboot 資料夾,並且修改權限
sudo mkdir /tftpboot |
將 xinetd 重新啟動
sudo service xinetd restart |
放置一任意檔案,然後用 tftp 測試
tftp localhost |
大功告成,打完收工。
]]>具體方式如下:
取得 Container PID, 這邊我查看名為 wordpress_wordpress_1 的 container
λ ~/docker inspect -f '{{ .State.Pid }}' wordpress_wordpress_1 |
建立連結至 /var/run/netns/ 供 ip netns 使用
λ ~/sudo ln -sf /proc/658/ns/net /var/run/netns/wordpress |
利用 ip netns 接 iptables 流量就一目了然了!
λ ~/sudo ip netns exec wordpress iptables -L -nv |
Reference: Counting bandwidth from a Docker container
]]>$ModLoad imudp |
後來發現,預設是 bind 在 0.0.0.0
相當之危險~等於所有人都可以打 log 到你機器上,於是我又再加入:
$ModLoad imudp |
發現沒有用,還是 bind 在 0.0.0.0
,死馬當活馬醫…調整一下順序:
$ModLoad imudp |
這樣就可以了(暈),原來 Rsyslog 的設定順序是不可逆的。找個時間可以再深入研究一下…(遠目)
檢查一下 netstat -nlp | grep 514
:
udp 0 0 127.0.0.1:514 0.0.0.0:* 12274/rsyslogd |
打完收工。
]]>locales
…驚人的事情發生了!因為同事電腦登入過去一樣下 locales
居然跟我的不一樣…這是什麼妖術?
原來,預設 ssh 會預設傳送本地端的 env 到遠端 server ,為了解決此問題只要編輯 /etc/ssh/ssh_config
,把 SendEnv
這一行註解掉即可。
原本錯誤訊息可能長這樣:perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_PAPER = "de_DE.UTF-8",
LC_CTYPE = "de_DE@euro",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
或這樣locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
reference: http://www.jerri.de/blog/archives/2009/12/04/problem_with_locales_on_remote_server_via_ssh/
]]>如果是要除錯一般 ethernet 就還好,可以借一台具備 Port Mirror 功能的 Switch 來除錯,但是如果遇到像是 WiFi 或 Cellular 這種無線介面,就只能用 TCPDUMP 擋著…
但是,光是從 console 觀察 TCPDUMP 資訊實在很費工夫,好在 Wireshark 有提供從 stdin pipe 進來的機制 (當然,你也可以用 tcpdump 存成檔案在用 Wireshark 來讀取)
於是乎,只要下…
ssh -l root 192.168.3.127 tcpdump -U -s0 -w - -i eth1 | wireshark -k -i - |
eth1 換成你要的介面
plink.exe -ssh -pw abc123 root@192.168.2.1 "tcpdump -ni eth0 -s 0 -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i - |
其中 plink 可前往 putty 下載頁面 Download
Reference:
]]>ls -v
可以依照檔名中的版本來排序,根本太強大啊!Before -v
root@zack:/unstable# ls i-feel-so-good*.deb -alh |
After -v
root@zack:/unstable# ls i-feel-so-good*.deb -avlh |
又學到一招了!
]]>Production 環境目前是 host 在 DigitalOcean ,看了旁邊的 Raspberry Pi 一眼好像閒著也是閒著,於是上網看看有沒有現成的 Docker Image 可以用,結果找不到喜歡的。就自己 Build 一個吧!
英文說明與 Dockerfile, Scripts 都在 Github 連結:imZack/wordpress-armhf
這邊主要會用到兩個 Image 分別是 zack/wordpress-armhf:4.3.1-apache
與 armbuilds/mariadb
,詳細的 Dockerfile 可以在上面 Github 連結裡面找到。由於 Docker Hub 無法自動 Build armhf 的 Image 所以我必須先在 Raspberry Pi 上 build 好然後再推上去。(另有用 QEMU 方式,這邊先不多提…)
wordpress: |
用上面的 docker-compose.yml 就能在幾秒內建立一個全新的 WordPress 環境囉!
只需要下 docker-compose up
等他跑完初始化,就能開啟 http://localhost:8080 Port 囉 !
有五種 Hooks 會插入在 Linux networking stack 中的不同階段
--> PREROUTING ---> [ROUTE] ---> FORWARD -------------------> POSTROUTING --> |
關於封包在 Linux Kernel 是怎麼旅遊的可以參考:
以往在做 Packet Filtering 的時候都是透過封包的標頭檔,像是 IP, PORTS, Destination 在這幾年,這種方式已經透露出它的缺點:DDoS 攻擊容易…
Connection tracking system 會儲存連線資訊在記憶體中,包含的資訊有 source and destination
IP addresses, port number pairs, protocol types, state, and timeout 透過這些資訊,可以用比較智慧的方式來來過濾封包。
這邊要特別記住一點是,Connection tracking system 從不過濾封包,而只是記錄封包路過 Network Stack 的行蹤;還有一些例外狀況,如:記憶體滿了封包被扔掉。
Connection tracking system just tracks packets; it does
not filter.
什麼是 Splash Screen ?就是一開啟 APP 他會跳出來顯示 LOGO 之類的那個玩意,然後過幾秒(或是等待背景程式預備狀態)後自動消失。
因為我把 TNUA BUS APP 定調為一個簡單速查的工具,這個過十分沒有必要。Google 了一下發現答案還滿多種的 = =+
於是找到了一個官方有提到的設定參數
直接在 Ionic 專案根目錄中的 config.xml
加入下方程式碼:<preference name="AutoHideSplashScreen" value="true" />
打完收工。
UPDATE 2015/09/13: 原來上面的方式無法關閉(上次不知道為什麼鬼打牆ㄡ…)
要進 Xcode Project Setting 裡面修改把 Launch Screen File 清空,如下圖:
這邊就想到 2013 WWDC OS X 狂推猛推的神奇黑科技 (事實上卻是早在 Linux 好一陣子的 zram 技術來用,嘖嘖!)
zram 有利於嵌入式裝置、小筆電和其它相似的低端硬體裝置。這些裝置通常使用固態儲存,它們由於其原生性質而壽命有限,因而避免以其提供交換空間可防止其迅速磨損。此外,使用zRAM還可顯著降低Linux系統用於交換的I/O
先把原本的 swap 關掉 (預設應該是用 dphys-swapfile)sudo update-rc.d dphys-swapfile disable
再來查一下 Kernel 有沒有支援 zram moduleλ ~/ modinfo zram
filename: /lib/modules/4.2.0-rc7-v7+/kernel/drivers/block/zram/zram.ko
description: Compressed RAM Block Device
author: Nitin Gupta <ngupta@vflare.org>
license: Dual BSD/GPL
srcversion: BDC5585C607CBB474B00AC9
depends: zsmalloc,lz4_compress
intree: Y
vermagic: 4.2.0-rc7-v7+ SMP preempt mod_unload modversions ARMv7
parm: num_devices:Number of pre-created zram devices (uint)
如果有的話應該會上面訊息…
然後就可以來安裝囉~# 下載 script
λ ~/ sudo wget https://gist.githubusercontent.com/imZack/b7aa605a440de442307d/raw/075c09bf1ae5d9903d59dc28af06c7182522a2af/zram.sh -O /etc/init.d/zram
# 給予執行權限
λ ~/ sudo chmod +x /etc/init.d/zram
# 加入開機啟動
λ ~/ sudo update-rc.d zram defaults
不用重開機,來測試一下!λ ~/ free
total used free shared buffers cached
Mem: 948068 192872 755196 6732 21996 98104
-/+ buffers/cache: 72772 875296
Swap: 0 0 0
接著執行 sudo service zram start
λ ~/ sudo service zram start
λ ~/ free
total used free shared buffers cached
Mem: 948068 196608 751460 6748 22044 98128
-/+ buffers/cache: 76436 871632
Swap: 948064 0 948064
看到 Swap 跑出來就表示大功告成啦!
]]>以往一直沒機會參加的駭客年會 (Hitcon),今年終於參與了!
本篇主要講一下這次有趣的 Wargame - Arduino Nano…
一到會場,報到後領取的資料袋裡面可以看到他的身影。
一條簡單的 mini usb to usb 與 Arduino Nano;從沒玩過 Arduino 的我第一次就獻給 Hitcon 了 (?)
上了 IRC 得知題目位於 iot.hitcon.org (現已下線) 後,邊聽神人 geohot 演說一邊去看題目。網頁上有三關可以下載,其實三都在同一份檔案內:一份 ans.py
剛好摸 Py 也好一陣子了,心理鬆了一口氣…不會 Py 的朋友可能光是上手就比較辛苦一點。(不過看到解答之後,應該是不會 Py 也可以的啦! 不要再說他是 Py wargame 囉!哈!)
以下有 Wargame 劇透,想要自己體驗的話…不要再往下看嚕…
注意:這是我心目中的 “正規” 解法
來源:Hitcon Knowledge Base 的下方回應
一開始我是硬解了 1, 3 題,然後看到 geohot 忽然全破,嘖!想一想不對…這是 Hitcon 啊!又不是程式設計作業…於是我就想說要怎麼把 Arduino 上面的 Firmware Dump 下來。也是有找到解答中提到的 avrdude,只是下錯指令…
所以無疾而終。後來就想專心聽講,就沒有再深究下去了
當初我下錯的指令:avrdude -p atmega328p -c stk500 -U flash:r:"/tmp/arduino.hex":r -P /dev/tty.wchusbserialfa130 -b115200
可以發現我連 chipset 都選錯了,噗!
正解指令:avrdude -F -c arduino -b 57600 -P /dev/ttyUSB0 -pm328 -vv -U flash:r:program.bin:r
Dump 下來的 program.bin 為一個 binary 的檔案,要在裡面找解答後出現的金鑰 KEY,這邊可以借助 strings 這個指令…WTF 從來沒用過這個指令,趕快 man 一下:
find the printable strings in a object, or other binary, file
怎麼有這麼神奇的小工具以前從來沒用過,一定是不夠黑!於是乎,就解出題的 Key 啦!
所謂不正規解法就是…乖乖寫 code 看他要你解什麼,怎麼有點像是 ACM (誤)
這邊我就不多提,看一下 HKB 吧!
Hitcon Knowledge Base 的下方回應
一開始硬解的很爽直接衝上第四名(應該很多人卡在 Driver, Python 等不熟悉的關係),後來我一看 geohot 跳上第一名我就恍然大悟知道我的解法有問題,一時半刻又摸不出怎麼 dump firmware 的方式,就留這張 screenshot 作為紀念囉 HAHA
在 IoT 時代,對於這種 firmware 可以輕易被 dump 出來,利用 strings 直接取得所有字串資料,身為開發者的我們應該要更注意這方面的防護與瞭解。
]]>幾天前看到幾篇瀏覽器 AdBlock 以及其他外掛效能大戰,無意間看到一個有趣的專案:Pi-Hole (RASPBERRY PI AD-BLOCKER)。
原來是透過 dnsmasq 來提供 dns service (tcp/udp 53),並藉由網路上定期維護的幾份黑名單來阻擋域名解析…
Dnsmasq is a Domain Name System (DNS) forwarder and Dynamic Host Configuration Protocol (DHCP) (more information)
這樣就可以把廣告 擋在你的電腦之前;而不是先讀取完廣告,才將其隱藏或刪除網頁上的元素!
原本顯示廣告流程應為:
透過修改本機裝置的 DNS Server 將其指為 127.0.0.1 位置,廣告流程就會變成:
原始版本的 Pi-Hole 比較搞剛,還多用了一個 Web Server 上面放空白網頁跟圖片,我目前覺得有點多餘跟複雜
由於已經包裝成 Docker Image 並放置在 Docker Hub 上公開下載;所以我們可以很輕鬆地在不同平台上運行 AD-ZaiJian
λ ~/ export IMAGE_NAME=zack/ad-zaijian-armhf # (Raspberry Pi 2 為 zack/ad-zaijian-armhf) |
搞定,接下來把手機/裝置的 DNS 設定改為 Server IP,這邊例子為 192.168.1.130,大功告成!
圖片比較多的關係,另開一篇…說明:安裝 AD-JaiJian 在 Synology DS 713+(尚未完工)
常常在 PTT 上看到一些特價訊息或是好康活動文章,由於不是整天沒事幹守在板上所以每次看到訊息的時候可能都已經超過活動時間…Q_Q
於是誕生了…
大約一個月前 PTT Web 的時間欄位有更新,所以 Server 記得要更新喔!不然會收不到通知。另一方面也順手新增:文章標題關鍵字過濾功能(支援多個),這樣就更方便啦!
使用方式:
// Single keyword |
所以只要把上面網址貼到原先的 New feed item 就可以啦!
為什麼要自己架 RSS Service 咧…因為 PTT 的 RSS 很不靠譜啊…三不五時就掛掉,或是有些版就不知道為什麼沒有 RSS 服務…於是這邊就用簡單的 nodejs 兜一個出來…
Source code (MIT License) on GitHub 喜歡記得幫我點一顆愛心
大致上用了下面這些 node modules…
有興趣的朋友可以看一下 source code 應該滿簡單的
18 禁板的入口年齡確認已經預設 bypass source code
git clone https://github.com/imZack/PttRSS |
以上,打開瀏覽器瀏覽 http://server:8000/{板名英文}.xml
如:http://server:8000/drama-ticket.xml
板名英文請參考 PTT 網頁版
<?xml version="1.0" encoding="UTF-8"?> |
OK。以上到這邊你就已經擁有一個私人的 PTT RSS Service 囉 !
首先,先認識一下 IFTTT 這個有趣的服務。已經有很多文章介紹過,我這邊就不贅述大家可以自行參考:
所以你會發現,其實我們可以擁有不只是手機的通知…也可以是各式各樣的串連,自由發揮~
右上角你的帳號點下去,有一個選項 Create。按下去可以看到 if this then that
,其中 this 按下後我們搜尋 feed
這個關鍵字可以看到一個熟悉的 RSS 圖示,其中點下去又有兩個選項:
要注意的是,這邊關鍵字沒有邏輯功能。也就是說你不能打 Google OR 谷哥
,目前的解法是做在 RSS Provider 不過這點我們之後再來討論…目前可以先新增多個條件來解決。
這邊再把剛剛架設好的 RSS Service Url 填入 (這邊我希望接收所有 drama-ticket 版的新文章)
都設定完之後,還有 LOG 可以看~是不是很幫便阿阿阿阿!再也不會錯過任何 PTT 文章囉~
手機 APP 裝好後,就能收到訊息如下圖:
打完收工
]]>繼上一篇自編 Kernel 後,其實我最主要的目的是希望把小米 WiFi 的 Driver 裝上…
下載我先前修改過(加入MIFI 的 usb device id)λ ~/git clone https://github.com/imZack/mt7601.git
然後再設定好 LINUX_SRC
、CROSS_COMPILE
兩個參數λ ~/cd mt7601/src
λ ~/export LINUX_SRC=~/rasp/linux
λ ~/export CROSS_COMPILE=~/rasp/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
最後執行λ ~/make
產出的檔案有兩個分別是
os/linux/mt7601Usta.ko 及 RT2870STA.dat
把這兩個 scp 到 Raspberry Pi 上
scp os/linux/mt7601Usta.ko RT2870STA.dat 192.168.1.130:/tmp |
然後在機器上搬到正確的位置 記得要用 root # mv /tmp/mt7601Usta.ko /lib/modules/3.18.11-v7+/kernel/net/wireless/mt7601Usta.ko
# mv /tmp/RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
最後就執行# depmod -a
# modprobe mt7601Usta.ko
# dmesg
[ 242.349499] usbcore: registered new interface driver rt2870
可以看見他已經正確被載入了
搞定後,插上 WiFi dongle 會發現他變成 ra0 而不是 wlan0 有些軟體可能不能用。所以我在這邊修改
vim /etc/udev/rules.d/70-persistent-net.rules |
在這個檔案最後一行加入ACTION=="add", SUBSYSTEM=="net", ATTR{type}=="1", KERNEL=="ra*", NAME="wlan0"
重新開機讓他生效 reboot
vim /etc/wpa_supplicant/wpa_supplicant.conf |
我的 ssid 為 zack 密碼為 123456789
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev |
詳細說明 wpa_supplicant.conf
vim /etc/network/interfaces |
主要看下面的 wlan0 部分,這樣開機就會自動連線並且啟動 dhclient 取得 IP
auto lo |
設定完後不需要重新開機,直接執行 ifdown wlan0 && ifup wlan0
打完收工。
]]>