Raspberry Pi 3, shell script and ./desktop

http://wp.me/ph3BR-1Gl

 

使用者很不满意要打命令行才能完成抓图的动作,例如这记录的状况,http://wp.me/ph3BR-1G2

经过了几天使用后,同时间在网路上请教别人,终于得到了一个满意的方法,也就达到满意的效果了。详情看这,http://www.hkepc.com/forum/viewthread.php?tid=2281234

参考:

http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/gui/desktop-shortcuts

https://specifications.freedesktop.org/desktop-entry-spec/latest/

 

具体做法,桌面建立一个文字档 a.desktop,内容如下,存档后他会自动变成可执行的式样,同时显示名称也不再是 a.desktop,除非再次编辑,点两下就执行了那个 SHELL SCRIPT, capture_screen.sh, 不再有多余的提示了。

a.desktop,内容如下,

[Desktop Entry]
Name=snag_windows
Comment=call scrot -b -s to capture a window screen, screen capture at Desktop
Icon=/usr/share/pixmaps/openbox.xpm
Exec=lxterminal -t "Screen capture" --working-directory=/home/pi/Desktop/ -e ./capture_screen.sh
Type=Application
Encoding=UTF-8
Terminal=false
Categories=None;

 

桌面建立一个文字档 capture_screen.sh, 内容如下,


#!/usr/bin/env bash

echo hello, screen shot of active windows with border

scrot -s -b

存档后, 记得 CHMOD +X 让 LINUX 知道它是可执行档

2016-04-15-234028_903x812_scrot

 

 

如果要赋予自己写的那个小程序 snap (没有GUI的) 同样的功能,类似的方法,不过,抓图的自动存档会出现在 /home/pi, 而不是在桌面.看着篇, http://wp.me/ph3BR-1G2 ,先来编译好snap, 然后桌面建立一个文字档 b.desktop,内容如下,存档后他会自动变成可执行的式样,同时显示名称也不再是 b.desktop,除非再次编辑,点两下就执行了那个 snap, 不再有多余的提示了。

b.desktop,内容如下,


[Desktop Entry]
Name=snap_to_/home/pi
Comment=Snap capture window screen, Terminal=true, a must, screen captured and save to /home/pi, not Desktop
Icon=/usr/share/pixmaps/openbox.png
Exec=/home/pi/Desktop/snap
Type=Application
Encoding=UTF-8
Terminal=true
Categories=None;

 

 

 

Raspberry Pi 3, asm program to build executable file, screen capture

http://wp.me/ph3BR-1G2

 

有了小电脑,还是64位元的,一整个是高大尚的级别

除了INTEL高级贵到死的 x86系统的CPU,还真没有实际使用过64位元的电脑,ANDROID 手机的那些应该不算。

这个Raspberry Pi 3, 用的是 BROADCOM 出产的IC,ARM 系列的 64位元. 好久以前实验过在 UBUNTU 上编译C 的源码,感觉还好,这次为了要在 Pi 截取画面,使用了 scrot 的这个程序,但是不太方便,因为要在 TERMINAL 底下输入命令行来执行,一众普通用家不习惯,希望按个按钮就可以,她们说在WINDOWS 底下用习惯了那个 snap 或者 snagit, 按一下就行,怎麽高级的 LINUX 就不行了呢。。。。。。。。。当然,直接按键盘那个 PrintScreen 可以把整个荧幕抓下来存档在 /home/pi,可那不够自由呀,俺只要某个视窗的画面或者荧幕某个区域的画面就没辙了。

题外话,这篇用这小电脑和那个智能拼音输入法打的,他就给简体字,不出繁体字,因为不会注音符号。其实没关系,世界上很多人通多国语言文字,所以大不必拘泥繁体简体,会可以不用,不会就学着点,好事。听到有些朋友说鄙视简体字,说看着就难过,另外一些却说看到繁体字就烦。那只是意识形态问题,或者说者无心,纯粹是现露出少看外面的世界而缺少开放的眼界,自己看着办吧,反正俺看得都简单也高兴:)

要抓取画面,所以就实验了两个方法,

  1. 写SHELL SCRIPT 来启动 scrot, 并带入参数 -b -s, 然后让使用者快速点两下执行,谁知道,每次都跳出来问,希望怎样执行,不像UBUNTU可以预设一次就好;
  2. 写个小小的程序,呼叫并启动 scrot, 并带入参数 -b -s ,搜寻了一下网路,乱套用,居然瞎猫碰到死耗子,也成功。。。不过呢, 还是每次都跳出来问,只是选项少了也不需要 CHMOD +X。以前玩过 WIN32的 ASM / C,呼叫可以用 ShellExec,但是 LINUX 对应是 system, 基本上是网上看到抄来用的,参照 hello world 的那个源码,看到他写的有关呼叫第三方应用程序 printf 的做法,然后就照猫画虎,给他乱来,反正不要钱。。。。。。
    string: .asciz "\nHello World! This is xialaba and Linux programming\n\n"
    
    .extern printf
    
    ldr r0, =string @ print hello world
    bl printf
    
    

    GNU ARM assembly 程序的注释用 @ 开始,和 x86 或者其他 MCU 使用分号(;)不同。

 

组译和连接用以下命令,都是 LINUX 自带的编译工具

as -o hello.o hello.s
gcc -o snap hello.o

2016-04-14-230729_609x175_scrot

 

 

最后输出一个可执行档案,名为 snap

速点两下执行,直接按 [执行], 然后随便选个 WINDOW 点一下,截图就得到并存档在桌面上了,结果类似下面的图。

2016-04-15-000001_527x300_scrot

源码在这里,

@ REF : http://www.science.smith.edu/dftwiki/index.php/Tutorial:_Assembly_Language_with_the_Raspberry_Pi
@ xiaolaba
@ 2016-04-14
@ modified to test 'system' call and to invoke scrot to capture a screen

@ how to assenble and link, open terminal, type following, but remove @
@ as -o hello.o hello.s
@ gcc -o snap hello.o
@ hello.s
@ D. Thiebaut
@ Just your regular Hello World program!
@
@ ---------------------------------------
@ Data Section
@ ---------------------------------------

.data
string: .asciz "\nHello World! This is xialaba and Linux programming\n\n"
para : .asciz "scrot -b -s"

@ ---------------------------------------
@ Code Section
@ ---------------------------------------

.text
.global main
.extern printf
.extern system

main:
push {ip, lr}

ldr r0, =string @ print hello world
bl printf

ldr r0, =para @ invoke scrot to capture screen
bl system

pop {ip, pc}

 

 

SHELL SCRIPT 的源码在这里,虽然不好用,但是也是学习的过程之一,


#!/usr/bin/env bash

echo hello, screen shot of active windows with border

scrot -s -b

Openwrt, TP-Link MR3020 and OpenVPN installation every time at power up

http://wp.me/ph3BR-1EL

 

有些鳥客戶的公司, 需要供應商提供固定IP才能連接它們的採購系統, 才能讓你抓取訂單, 才能讓你安排交貨, 據說是為了 [保安理由]. 到底有多可靠, 天曉得. 用這個方法, 不會更安全, 但是製造很多麻煩.

問題來了, 現代很多代理商都是跑單幫的所謂代理商, 也有是兩人的蚊型企業 (還能歸類為企業!?), 或者租個小地方就干起來的非大型企業, 常常每個人都是用手機上網, 哪裡來的的固定IP呢! 如果不知道甚麼是固定IP, 試試看上網連接到一些只提供HTTP查詢的網站, 它會回應並顯示你的IP, 例如 :

http://ipecho.net/

https://myip.com.tw/

如果你用手機上網, 大概每次進入地下室再出來, 訊號斷掉重來, 你的 IP 就變化了. 如果是室內的固網, 像是中華電信, 遠傳, 中國移動, AT&T 等等, 電信公司有個DSL數據機(小烏龜)或者光纖盒子放在你的屋子內租給你用, 除非申請固定 IP, 不然絕大部分都是浮動IP的, 只要小烏龜斷電或重新啟動, 你的 IP 就變化了. 如果要, 那就是必須申請一個固定IP在一個固定的地方上網, 對方的才能看到你是固定IP而不會隨時改變.

需要固定IP, 對於流動的人口來說, 解決方法很早以前已經有 VPN 這個東西. 好久以前, 設定一個 Microsoft Outlook, 接收公司用的 EMAIL, 設定初期已經要使用 VPN 連接到總公司才成, 後來也用過 LOUTS, 也是要撥接電話回總公司才能收發EMAIL, 那時候的民用的 INTERNET 還沒發達 (大約公元2000年以前), 33.6K 的MODEM已經是最快速的, 還要自己設定撥號連線的Trumpet軟體, 應該稱為窄頻上網, 所以出差最大筆的開銷是長途電話費用, 平均都是4000多元的的電話費, 只為了在飯店撥電話回公司的MODEM收發EMAIL. 後來, 有了寬頻, 2M, 10M, 20M, 100M, 有了 WIFI, 有了 SKYPE, 有了 WECHAT 之類的, 長途電話費就變成0, 取而代之的是漫遊上網費用, 今天就有了短期租約的當地上網卡, 費用大的問題是解決了, 但是, 還需要 VPN, 這樣鳥客戶的公司需要供應商提供固定IP, 就是一例, 當然, 出差到中國境內, 想要 GOOGLE, YOUTUBE 等等, 也需要這個, 沒特別理由, 就是愛自有和受管制的對立.

每次讓那些妹妹試驗 VPN, 總會鬧出各種小問題, 用電腦撥接 VPN, 都會有些麻煩和插曲. 所以試驗一下, 每人配個小小的 ROUTER, 在飯店自動配接VPN, 成為一個WIFI熱點讓她們在不知不覺中連上VPN, 看來是最低成本也有最有效的方案之一. 因此花了3天時間, 研究了一下 OpenVPN 還有一些剩餘物資和最新產品, 例如 ASUS RT-N13U B1, TP-LINK MR3020, Raspberry Pi 3, 這些都是 LINUX 的小電腦, 功能和價格都不貴. 結果是 ASUS RT-N13U B1 爛透了, 設定完畢斷電重開機就錯誤百出, 使用中也會莫名當掉, 翻出送修紀錄, 應該是沒修過就刷韌體送回來的, 一直都有問題就不再送修報廢了事, 現在改機刷成 OpenWRT 的韌體, 狀況一致就說明是機王爛貨, 拆來機殼, 裡面的 PCB 印刷著REV.1.20, 沒有貼MAC Adress標籤, CPU 的屏蔽鐵殼上面超多指紋, 都氧化成了黑色, 而且CPU和穩壓管很高溫. 至於 TP-LINK MR3020呢, 當年手機的費用高, 個人熱點也不流行, 採用了一陣子, 慢慢淘汰了, 改機刷成 OpenWRT 的韌體, 因為只有 4M FLASH, 32M RAM, 容量不過安裝其它的軟體 (OpenVPN). 另外Raspberry Pi 3 是2016年3月最新的產品, 大約2000台幣, 很容易就安裝好, 算是最簡單的, 可玩性也最高, 但是比對 TP-Link TL-MR3020 v1 的500圓售價, 當然高了4倍. 因為這樣, 有需要多些了解 LINUX 的操作和上網建立. 無意間看到這篇網路文章,

https://blog.zauberstuhl.de/openwrt_tplink_openvpn/

http://blog.ciberterminal.net/2013/06/18/openvpn-in-the-tp-link-wr841nd/

它們的大意是, 例如 TP-LINK MR3020, TP-Link WR841N(D) 這類低階的 ROUTER, 雖然 FLASH 只有 4M, 但是 RAM 有 32M, 刷好 OpenWRT 的系統後, FLASH 容量幾乎耗盡, 但是 RAM 的容量還有約14M沒動到, 稱為 tmpfs (臨時存放文件的空間, 可隨時讀寫), 可以作為安裝 OpenVPN 或其他軟體的用途, 不過呢, 拔電源後就會化為烏有. 所以他們寫了一個劇本, 每次上電, ROUTER 自動連接 INTERNET 後, 自動下載 OpenVPN 和相關的軟體, 安裝在 tmpfs 這個地方, 並且解壓縮和自動安裝, 而 OpenVPN 的設定檔案, 則寫死在 FLASH 裡面, 因為體積很小, 所以就解決了這個問題. 有空來試試這個方法.

以下兩段劇本是複製那兩個網站的, 版權屬於源作者, 作為學習 SHELL SCRIPT 的基礎.


#REF : https://blog.zauberstuhl.de/openwrt_tplink_openvpn/
# Do not forget setting the right environment variables and we are good to go (/etc/profile):
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/libopenssl/lib
#export PATH=$PATH:/tmp/openvpn/bin


#!/bin/sh /etc/rc.common

START=99

. /etc/profile

install() {
local OVPNPATH=/tmp/openvpn
local OSSLPATH=/tmp/libopenssl
[ ! -d ${OVPNPATH} ] && mkdir ${OVPNPATH}
[ ! -d ${OSSLPATH} ] && mkdir ${OSSLPATH}
command opkg update || exit 1
# install openvpn
cd ${OVPNPATH}
tar xzf $(opkg download openvpn-openssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
tar xzf data.tar.gz
# delete unnecessary things (save space)
rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh
# install libopenssl
cd ${OSSLPATH}
tar xzf $(opkg download libopenssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
tar xzf data.tar.gz
# delete unnecessary things (save space)
rm -f control.tar.gz debian-binary data.tar.gz
}

start () {
# lvl 99 is not enough the script is too
sleep 10 # fast for the install step
install # setup openvpn and libssl
command openvpn --writepid /tmp/openvpn/ovpn.pid --daemon --config /etc/openvpn/client.conf
}

stop() {
PIDOF=$(ps |egrep openvpn |egrep  -v grep |awk '{print $1}')
kill ${PIDOF}
}

#REF : http://blog.ciberterminal.net/2013/06/18/openvpn-in-the-tp-link-wr841nd/
# opkg install kmod-tun
# opkg install liblzo
# opkg install libopenssl
# mkdir /etc/openvpn
#And import there your openvpn config files+certificates wathching any path reference 😛
#You’ll have to change the --config ciberterminal.conf inside my script with the name of your config file!
#Then create the init script:
# vi /etc/init.d/openvpn
#And give it permissions:
# chmod 755 /etc/init.d/openvpn
#You’ll be able to set it up in the Luci webUI as the rest of the services, or run it manually (for debugging), as always with:
# /etc/init.d/openvpn start
#Warning!
#This howto is not compatible with old versions of the WR841N[D] which only has 700kbs of rom.
#Warning!

#!/bin/sh /etc/rc.common
# Copyright (C) 2013 dodger@ciberterminal.net

START=99

start() {
local TMPPATH=/tmp/openvpn
[ ! -d ${TMPPATH} ] && mkdir ${TMPPATH}
cd ${TMPPATH}
opkg update || exit 1
tar xzf $(opkg download openvpn | grep Downloaded | cut -d\  -f4 | sed '$s/.$//')
tar xzf data.tar.gz
rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh
${TMPPATH}/usr/sbin/openvpn  --writepid /tmp/ovpn_ciberterminal.pid --daemon --cd /etc/openvpn --config ciberterminal.conf
}

stop() {
PIDOF=$(ps | egrep openvpn | egrep  -v grep | awk '{print $1}')
kill ${PIDOF}
}

 

 

抄了這個SCRIPT試驗, https://blog.zauberstuhl.de/openwrt_tplink_openvpn/

結果完全沒動作, 然後花了3個小時, 學了一下 SHELL SCRIPT 的寫法和執行的方式, 參考這個 http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script,  做了一個 HELLO WORLD 試驗, 應該是OK的.

shell_script_test, ok
shell_script_test, ok

 

然後在用一些時間, 熟悉了一下很久沒用的 LINUX 指令

df -h, 顯示系統檔案和容量大小

df -f, show disk size
df -f, show disk size

 

在 OPENWRT 的系統底下, 若希望 OPENVPN CLIENT 運行, 要安裝以下的套件.

opkg install openvpn-openssl 
opkg install kmod-tun 
opkg install liblzo 
opkg install libopenssl

創建一個資料夾 /etc/openvpn, 把 OpenVPN Client 的證書檔案放進去, 證書檔案由管理員提供給使用者, 例如 client.ovpn

創建一個文字檔 /etc/init.d/openvpn, (因為放在/etc/init.d/ 裡面, 所以上電開機會自動執行), 以下SCRIPT內容寫到這個文字檔案裡面,

#### begin-of-script
#!/bin/sh  /etc/rc.common
START=99

. /etc/profile

install() {

local OVPNPATH=/tmp/openvpn
local OSSLPATH=/tmp/libopenssl
local LIBLZOPATH=/tmp/liblzo
local KMODTUNPATH=/tmp/kmod-tun

[ ! -d ${OVPNPATH} ] && mkdir ${OVPNPATH}
[ ! -d ${OSSLPATH} ] && mkdir ${OSSLPATH}
[ ! -d ${LIBLZOPATH} ] && mkdir ${LIBLZOPATH}
[ ! -d ${KMODTUNPATH} ] && mkdir ${KMODTUNPATH}

echo "----> opkg update, now"
command opkg update || exit 1
echo "----> opkg update is done"

# install openvpn
cd ${OVPNPATH}

echo "----> To download & install openvpn-openssl to RAM disk at ${OVPNPATH}"
tar xzf $(opkg download openvpn-openssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
tar xzf data.tar.gz
# delete unnecessary things (save space)
rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh

echo " "

# install libopenssl
cd ${OSSLPATH}
echo "----> To download & install libopenssl to RAM disk at ${OSSLPATH}"
tar xzf $(opkg download libopenssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
tar xzf data.tar.gz
# delete unnecessary things (save space)
rm -f control.tar.gz debian-binary data.tar.gz

echo " "

# install liblzo
cd ${LIBLZOPATH}
echo "----> To download & install liblzo to RAM disk at ${LIBLZOPATH}"
tar xzf $(opkg download liblzo |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
tar xzf data.tar.gz
# delete unnecessary things (save space)
rm -f control.tar.gz debian-binary data.tar.gz

#  echo " "

#  # install kmod-tun
#  cd ${KMODTUNPATH}
#  echo "----> To download & install liblzo to RAM disk at ${KMODTUNPATH}"
#  tar xzf $(opkg download kmod-tun |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
#  tar xzf data.tar.gz
# delete unnecessary things (save space)
#  rm -f control.tar.gz debian-binary data.tar.gz

echo " "

echo "----> done"
}

start () {
echo "REFERENCE : https://blog.zauberstuhl.de/openwrt_tplink_openvpn/"
echo " "
echo "modified for debug purpose, xiaolaba, 2016-MAR-20"
echo " "

# lvl 99 is not enough the script is too
sleep 10 # fast for the install step
install # setup openvpn and libssl and liblzo
#command openvpn --writepid /tmp/openvpn/ovpn.pid --daemon --config /etc/openvpn/client.conf
command openvpn --writepid /tmp/openvpn/ovpn.pid --daemon --config /etc/openvpn/my-client.ovpn
echo " "
echo "if you are asked user name and password here, it imply that openvpn is up and running, for debug purpose, xiaolaba, 2016-MAR-20"
}

stop() {
PIDOF=$(ps |egrep openvpn |egrep  -v grep |awk '{print $1}')
kill ${PIDOF}
}
#### end-of-script



然後執行指令,
chmod 755 /etc/init.d/openvpn
這樣系統才會知道這個SCRIPT文件是可執行檔案.


修改檔案 /etc/profile, 在最後加入兩行文字, (OPENVPN 安裝在RAM DISK 的引用位置, 隨版本改變),
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/libopenssl/usr/lib:/tmp/liblzo/usr/lib 
export PATH=$PATH:/tmp/openvpn/usr/sbin


修改檔案 /etc/config/network, 在最後加入以下三行文字, 增加介面 VPN,
config interface 'VPN'
    option proto 'dhcp'
    option ifname 'tun0'


修改檔案 /etc/config/firewall, 在最後加入以下多行文字, LAN 資訊流通過VPN出去,
config zone
    option name 'VPN'
    option input 'REJECT'
    option forward 'REJECT'
    option output 'ACCEPT'
    option masq '1'
    option mtu_fix '1'
    option network 'VPN'
config forwarding
    option dest 'VPN'
    option src 'lan'


要手動測試這個劇本能否安裝 OPENVPN, 執行以下, 如果看到問你密碼帳號的畫面, 說明成功.
/etc/init.d/openvpn start


要手動關閉這個劇本, 執行以下,
/etc/init.d/openvpn stop


要直直接執行,
openvpn --cd /etc/openvpn --config /etc/openvpn/client.ovpn --remote 123.123.123.123 1179
或者,
openvpn --writepid /tmp/openvpn/ovpn.pid --daemon --config /etc/openvpn/my-client.ovpn

要看執行狀態執行ps, 會看到pid 和 openvpn 的對應.

開另外一個終端機, 執行ifconfig, 會看到tun0

要解除,
kill pid

openvpn done, TP-LiNK MR3020
openvpn done, TP-LiNK MR3020

REF:
https://www.loganmarchione.com/2014/10/openwrt-with-openvpn-client-on-tp-link-tl-mr3020/