2012年12月13日 星期四

ssh 指令運用筆記

ssh tunnel

$ ssh -NfR 5566:localhost:22 ptchiang@140.113.209.4

N : 不執行任何指令
f   : 背景執行
R  :  主要建立通道參數
5566  :  遠端主機 port
localhost:22   遠端主機要轉送的目的
ptchiang@140.113.209.4   遠端主機登入資訊

遠端主機使用下面指令作登入, wanda 是建立通道主機的使用者帳號

$ ssh wanda@localhost -p 5566

scp 用法


通常使用 sftp 是因為可能不知道伺服器上面有什麼檔名的檔案存在,如果已經知道伺服器上的檔案檔名了, 那麼最簡單的檔案傳輸則是透過 scp 這個指令喔!最簡單的 scp 用法如下:

[root@www ~]# scp [-pr] [-l 速率] file  [帳號@]主機:目錄名 <==上傳
[root@www ~]# scp [-pr] [-l 速率] [帳號@]主機:file  目錄名 <==下載
選項與參數:
-p :保留原本檔案的權限資料;
-r :複製來源為目錄時,可以複製整個目錄 (含子目錄)
-l :可以限制傳輸的速度,單位為 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s

# 1. 將本機的 /etc/hosts* 全部複製到 127.0.0.1 上面的 student 家目錄內
[root@www ~]# scp /etc/hosts* student@127.0.0.1:~
student@127.0.0.1's password: <==輸入 student 密碼
hosts                        100%  207         0.2KB/s   00:00
hosts.allow                  100%  161         0.2KB/s   00:00
hosts.deny                   100%  347         0.3KB/s   00:00
# 檔名顯示                   進度  容量(bytes) 傳輸速度  剩餘時間
# 你可以仔細看,出現的訊息有五個欄位,意義如上所示。

# 2. 將 127.0.0.1 這部遠端主機的 /etc/bashrc 複製到本機的 /tmp 底下
[root@www ~]# scp student@127.0.0.1:/etc/bashrc /tmp

其實上傳或下載的重點是那個冒號 (:) 囉!連接在冒號後面的就是遠端主機的檔案。 因此,如果冒號在前,代表的就是從遠端主機下載下來,如果冒號在後,則代表本機資料上傳啦! 而如果想要複製目錄的話,那麼可以加上 -r 的選項!

ssh 自動登入


Linux Client

1. 先產生認證用的公私鑰 ssh-keygen -t rsa -b 2048。
2. 產生的 id_rsa 為私鑰,需留在本機當作開門的鑰匙。
3. 產生的 id_rsa.pub 為公鑰,需放到欲登入的 server 上某帳號的 .ssh 下(如 /home/jerry/.ssh)。
4. 將 .ssh 下的公鑰 id_rsa.pub 改名成 authorized_keys。
5. 修改 /etc/ssh/sshd_config,將 AuthorizedKeysFile .ssh/authorized_keys 前的#拿掉使其可透過 key 認證。
6. 重新啟動 sshd。
7. 注意 .ssh 目錄的權限需為 700 方有作用。
8. 在本機上, ssh jerry@server -i id_rsa 即可自動登入。

Windows Client

1. 先到 Putty 官方網頁 下載 putty, puttygen.exe, pageant.exe
2. 在puttygen產生按下[Gererate]產生key, 此時會要求輸入key的Passphrase
3. 完成後(我大概等了3分鐘吧), 複製public key, 然後在要連線主機的 ~/.ssh/ 下建立authorized_keys, 內容剛剛我們複製 public key的內容,記得要把權限改 600
4. 儲存private key在自己的電腦上
5. 接著要設定putty, 在Connection->Data設定連線帳戶名稱
6. 在SSH->Auth 把我們產生的private key讀進來
7. 回到session按下儲存(囧, 我到今天才知道load按鈕是啥>"<)
8. 此時連線的話, 主機仍會要求輸入key的Passphrase... (這叫什麼自動連線啊!!!)
9. 這時我們打開pageant.exe, 然後把我們本機的private key加進來, 此時也會要求輸入key的Passphrase
10. 自動連線吧!!! BOY!!!
11. 把pageant.exe, 還有下面這段bash檔加入啟動中, 大功告成!!!
"YourPath\pageant.exe" YourPath\private_key.ppk


2012年12月7日 星期五

bash shell 環境變數內容的刪除與取代

[root@www ~]# echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin  <==這兩行其實是同一行啦!

範例二:假設我不喜歡 kerberos,所以要將前兩個目錄刪除掉,如何顯示?
[root@www ~]# echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

上面這個範例很有趣的!他的重點可以用底下這張表格來說明:

${variable#/*kerberos/bin:}
   上面的特殊字體部分是關鍵字!用在這種刪除模式所必須存在的

${variable#/*kerberos/bin:}
   這就是原本的變數名稱,以上面範例二來說,這裡就填寫 path 這個『變數名稱』啦!

${variable#/*kerberos/bin:}
   這是重點!代表『從變數內容的最前面開始向右刪除』,且僅刪除最短的那個

${variable#/*kerberos/bin:}
   代表要被刪除的部分,由於 # 代表由前面開始刪除,所以這裡便由開始的 / 寫起。
   需要注意的是,我們還可以透過萬用字元 * 來取代 0 到無窮多個任意字元

   以上面範例二的結果來看, path 這個變數被刪除的內容如下所示:
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin  <==這兩行其實是同一行啦!

# :符合取代文字的『最短的』那一個;
##:符合取代文字的『最長的』那一個;



上面談到的是『從前面開始刪除變數內容』,那麼如果想要『從後面向前刪除變數內容』呢? 這個時候就得使用百分比 (%) 符號了!來看看範例四怎麼做吧!

範例四:我想要刪除最後面那個目錄,亦即從 : 到 bin 為止的字串
[root@www ~]# echo ${path%:*bin}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin  <==注意啊!最後面一個目錄不見去!
# 這個 % 符號代表由最後面開始向前刪除!所以上面得到的結果其實是來自如下:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin  <==這兩行其實是同一行啦!

範例五:那如果我只想要保留第一個目錄呢?
[root@www ~]# echo ${path%%:*bin}
/usr/kerberos/sbin
# 同樣的, %% 代表的則是最長的符合字串,所以結果其實是來自如下:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin  <==這兩行其實是同一行啦!


瞭解了刪除功能後,接下來談談取代吧!繼續玩玩範例六囉!

範例六:將 path 的變數內容內的 sbin 取代成大寫 SBIN:
[root@www ~]# echo ${path/sbin/SBIN}
/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# 這個部分就容易理解的多了!關鍵字在於那兩個斜線,兩斜線中間的是舊字串
# 後面的是新字串,所以結果就會出現如上述的特殊字體部分囉!

[root@www ~]# echo ${path//sbin/SBIN}
/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:
/SBIN:/bin:/usr/SBIN:/usr/bin:/root/bin
# 如果是兩條斜線,那麼就變成所有符合的內容都會被取代喔!
我們將這部份作個總結說明一下:

變數設定方式說明
${變數#關鍵字}
${變數##關鍵字}
若變數內容從頭開始的資料符合『關鍵字』,則將符合的最短資料刪除
若變數內容從頭開始的資料符合『關鍵字』,則將符合的最長資料刪除
${變數%關鍵字}
${變數%%關鍵字}
若變數內容從尾向前的資料符合『關鍵字』,則將符合的最短資料刪除
若變數內容從尾向前的資料符合『關鍵字』,則將符合的最長資料刪除
${變數/舊字串/新字串}
${變數//舊字串/新字串}
若變數內容符合『舊字串』則『第一個舊字串會被新字串取代』
若變數內容符合『舊字串』則『全部的舊字串會被新字串取代』

變數的測試與內容替換 


在某些時刻我們常常需要『判斷』某個變數是否存在,若變數存在則使用既有的設定,若變數不存在則給予一個常用的設定。 我們舉底下的例子來說明好了,看看能不能較容易被你所理解呢!

範例一:測試一下是否存在 username 這個變數,若不存在則給予 username 內容為 root
[root@www ~]# echo $username
           <==由於出現空白,所以 username 可能不存在,也可能是空字串
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
root       <==因為 username 沒有設定,所以主動給予名為 root 的內容。
[root@www ~]# username="vbird tsai" <==主動設定 username 的內容
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
vbird tsai <==因為 username 已經設定了,所以使用舊有的設定而不以 root 取代
在上面的範例中,重點在於減號『 - 』後面接的關鍵字!基本上你可以這樣理解:

new_var=${old_var-content}
   新的變數,主要用來取代舊變數。新舊變數名稱其實常常是一樣的

new_var=${old_var-content}
   這是本範例中的關鍵字部分!必須要存在的哩!

new_var=${old_var-content}
   舊的變數,被測試的項目!

new_var=${old_var-content}
   變數的『內容』,在本範例中,這個部分是在『給予未設定變數的內容』
不過這還是有點問題!因為 username 可能已經被設定為『空字串』了!果真如此的話,那你還可以使用底下的範例來給予 username 的內容成為 root 喔!

範例二:若 username 未設定或為空字串,則將 username 內容設定為 root
[root@www ~]# username=""
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
      <==因為 username 被設定為空字串了!所以當然還是保留為空字串!
[root@www ~]# username=${username:-root}
[root@www ~]# echo $username
root  <==加上『 : 』後若變數內容為空或者是未設定,都能夠以後面的內容替換!

在大括號內有沒有冒號『 : 』的差別是很大的!加上冒號後,被測試的變數未被設定或者是已被設定為空字串時, 都能夠用後面的內容 (本例中是使用 root 為內容) 來替換與設定!這樣可以瞭解了嗎?除了這樣的測試之外, 還有其他的測試方法喔!鳥哥將他整理如下:

Tips:

底下的例子當中,那個 var 與 str 為變數,我們想要針對 str 是否有設定來決定 var 的值喔! 一般來說, str: 代表『str 沒設定或為空的字串時』;至於 str 則僅為『沒有該變數』。
變數設定方式str 沒有設定str 為空字串str 已設定非為空字串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr
var=expr
str 不變
var=
str 不變
var=$str
var=${str:=expr}str=expr
var=expr
str=expr
var=expr
str 不變
var=$str
var=${str?expr}expr 輸出至 stderrvar=var=$str
var=${str:?expr}expr 輸出至 stderrexpr 輸出至 stderrvar=$str


參考來源:

2012年12月6日 星期四

Split screen in vi

Horizontal:

:split [FILE]

resize:
Ctrl w [ + / - ] or 10 Ctrl w [ + / - ]

Vertical:

:vsplit [FILE]

resize:
Ctrl w [ < / > ] or 10 Ctrl w [ < / > ]

switch between window:

(twice) Ctrl w or Ctrl w < LEFT KEY / RIGHT KEY >


Refer To:
Split screen in vi


2012年12月4日 星期二

diff and patch howto

diff -urN a a.new > a.patch

patch -p1 < a.patch
-pN N 指的是忽略 patch file 前面 N 層目錄


--- AppLibs/broadcom/trellis/Makefile 2012-12-04 18:01:55.209672926 +0800
+++ AppLibs/broadcom/trellis/Makefile.new 2012-12-04 18:19:50.949746930 +0800
@@ -73,6 +73,8 @@
TRELLIS_HAS_AIR ?= y
endif
+TRELLIS_HAS_DFB_EXAMPLE ?= y
+
#Miracast Streamer
ifeq ($(wildcard $(TARGET_DIR)/lib/libwfd_streamer.a),)
TRELLIS_HAS_WFD_STREAMER = n




2012年12月3日 星期一

Makefile 語法筆記

自動化變數


$@  工作目標檔名
$<    第一個必要條件的檔名.
$^    所有必要條件的檔名, 並以空格隔開這些檔名. (這份清單已經拿掉重複的檔名)
$*    工作目標的主檔名.


萬用字元

makefile 中所用的萬用字元是 % ,代表所有可能的字串,前後可以接指定的字串來表示某些固定樣式的字串。例如%.c 表示結尾是 .c 的所有字串。因此我們改寫 makefile 如下
CC = gcc
OBJS = a.o b.o c.o

all: test

%.o: %.c
  $(CC) -c -o $@ $<

test: $(OBJS)
  $(CC) -o test &^

特別字元:

@    不要顯示執行的指令。
-      表示即使該行指令出錯,也不會中斷執行。

例:
.PHONY: clean
clean:
    @echo "Clean..."
    -rm *.o 

因為 make 會一行一行將正在執行的 Commands 顯示在螢幕上,但您可以利用 @ 來暫時關閉這個功能。而 make 只要遇到任何錯誤就會中斷執行。但像是在進行 clean 時,也許根本沒有任何檔案可以 clean,因而 rm 會傳回錯誤值,因而導致 make 中斷執行。我們可以利用 - 來關閉錯誤中斷功能,讓 make 不會因而中斷。


目標

這個項目所要建立的檔案,必須以 : 結尾。例:

foo.o: common.h
    gcc -c foo.c 

其中,foo.o 是這個項目要建立的檔案;common.h 是相依性的項目/檔案;而 gcc -c foo.c 則為要產生這個項目所要執行的指令。
make 在編譯時,若發現 target 比較新,也就是 dependencies 都比 target 舊,那麼將不會重新建立 target,如此可以避免不必要的編譯動作。
若該項目並非檔案,則為 fake 項目。如此一來將不會建立 target 檔案。但為了避免 make 有時會無去判斷 target 是否為檔案或 fake 項目,建議利用 .PHONY 來指定該項目為 fake 項目。例:

.PHONY: clean
clean:
    rm *.o

在上例中,若不使用 .PHONY 來指定 clean 為 fake 項目的話,若目錄中同時存在了一個名為 clean 的檔案,則 clean 這個項目將被視為要建立 clean 這個檔案,但 clean 這個項目卻又沒有任何的 dependencies,也因此,clean 項目將永遠被視為 up-to-date,永遠不會被執行。
因為利用了 .PHONY 來指定 clean 為 fake 項目,所以 make 不會去檢查目錄中是否存在了一個名為 clean 的檔案。如此也可以提昇 make 的執行效率。


函數

$(patsubst <pattern>,<replacement>,<text>)

名稱:模式字元串替換函數。
功能:查找<text>中的單詞(單詞以「空格」、「Tab」或「回車」「換行」分隔)是否符合模式< pattern>,如果匹配的話,則以<replacement>替換。這裏,<pattern>可以包括通配符 「%」,表示任意長度的字串。如果<replacement>中也包含「%」,那麼,<replacement>中的這個 「%」將是<pattern>中的那個「%」所代表的字串。(可以用「\」來轉義,以「\%」來表示真實含義的「%」字元)
返回:函數返回被替換過後的字元串。
示例:

filelist = x.c.c bar.c
$(patsubst %.c,%.o,$(filelist))
等於
$(filelist:%.c=%.o)

把字串「x.c.c bar.c」符合模式[%.c]的單詞替換成[%.o],返回結果是「x.c.o bar.o」
備註:
「$(var:<pattern>=<replacement>;)」 相當於 「$(patsubst <pattern>,<replacement>,$(var))」
「$(var: <suffix>=<replacement>)」 則相當於 「$(patsubst %<suffix>,%<replacement>,$(var))」
例如有:

objects = foo.o bar.o baz.o, 那麼,「$(objects:.o=.c)」和「$(patsubst %.o,%.c,$(objects))」是一樣的。


#List all .c file in current directory
filelist = $(wildcard *.c)

    wildcard 使用方法如下,注意的是wildcard裡面的參數就跟我們在命令列用的一樣,用*.c 表示所有.c結尾的檔名,請看上面範例,filelist 等於所有 .c 結尾的檔名,例如 "a.c b.c c.c"。

    VPATH: 設定文件蒐尋目錄

    在一些大的工程中,有大量的源文件,我們通常的做法是把這許多的源文件分類,並存放在不同的目錄中。所以,當 make 需要去找尋文件的依賴關係時,你可以在文件前加上路徑,但最好的方法是把一個路徑告訴 make,讓 make 自動去找。

    Makefile 文件中的特殊變量 “VPATH” 就是完成這個功能的,如果沒有指明這個變量,make 只會在當前的目錄中去找尋依賴文件和目標文件。如果定義了這個變量,那麼,make 就會在當前目錄找不到的情況下,到所指定的目錄中去找尋文件了。

    VPATH=src:../headers

    上面的的定義指定兩個目錄,“src” 和 “../headers”,make 會按照這個順序進行搜索。目錄由“冒號”分隔。(當然,當前目錄永遠是最高優先搜索的地方)

    另一個設置文件搜索路徑的方法是使用 make 的 “vpath” 關鍵字(注意,它是全小寫的),這不是變量,這是一個 make 的關鍵字,這和上面提到的那個 VPATH 變量很類似,但是它更為靈活。它可以指定不同的文件在不同的搜索目錄中。這是一個很靈活的功能。它的使用方法有三種:

    1、vpath <pattern> <directories>
    為符合模式 <pattern> 的文件指定搜索目錄 <directories>。

    2、vpath <pattern>
    清除符合模式 <pattern> 的文件的搜索目錄。

    3、vpath
    清除所有已被設置好了的文件搜索目錄。

    vapth 使用方法中的 <pattern> 需要包含 “%” 字符。“%” 的意思是匹配零或若干字符,(需引用 “%”,使用 “\%")例如,“%.h” 表示所有以 “.h” 結尾的文件。<pattern> 指定了要搜索的文件集,而 <directories> 則指定了 < pattern> 的文件集的搜索的目錄。例如:

    vpath %h ../headers

    該語句表示,要求 make 在 “../headers” 目錄下搜索所有以 “.h” 結尾的文件。(如果某文件在當前目錄沒有找到的話)

    我們可以連續地使用 vpath 語句,以指定不同搜索策略。如果連續的 vpath 語句中出現了相同的 <pattern>,或是被重複了的 <pattern>,那麼,make 會按照 vpath 語句的先後順序來執行搜索。如:

    vpath %.c foo
    vpath %.c blish
    vpath %.c bar

    其表示 “.c” 結尾的文件,先在 “foo” 目錄,然後是 “blish”,最後是 “bar” 目錄。

    vpath %.c foo:bar vpath %.c blish

    而上面的語句則表示 “.c” 結尾的文件,先在 “foo” 目錄,然後是 “bar” 目錄,最後才是 “blish” 目錄。


    參考網址:
    Makefile語法簡介