2012年10月17日 星期三

ssh Authentication refused

今天公司有台環境不知道為什麼ssh-key一直無法通行,怎麼登入都還是需要打密碼。後來試著在client用ssh -vvv 去看訊息,得到了

debug3: load_hostkeys: loading entries for host "172.16.15.139" from file "/root/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /root/.ssh/known_hosts:21
debug3: load_hostkeys: loaded 1 keys
debug1: Host '192.168.0.1' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:21
debug2: bits set: 512/1024
debug1: ssh_rsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /root/.ssh/id_rsa (0x7f91407b54f0)
debug2: key: /root/.ssh/id_dsa ((nil))
debug2: key: /root/.ssh/id_ecdsa ((nil))
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug3: start over, passed a different list publickey,gssapi-with-mic,password
debug3: preferred publickey
debug3: authmethod_lookup publickey
debug3: remaining preferred:
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /root/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Trying private key: /root/.ssh/id_dsa
debug3: no such identity: /root/.ssh/id_dsa
debug1: Trying private key: /root/.ssh/id_ecdsa
debug3: no such identity: /root/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey,gssapi-with-mic,password).


似乎是跟permission有關,但看了半天包括client上的private key跟server上面的public key檔案都是正常。後來上網稍微搜尋了一下,看到這個文章提到可以看server上的/var/log/secure來得到確切的error log。

Authentication refused: bad ownership or modes for directory /root

在仔細看了一下,才發現原來不知道誰把/root權限由750改為755,而sshd設定檔(/etc/init.d/sshd)有個參數StrictModes跟這個有關,只要整條path有任何目錄權限不對就會阻止public key使用。

結果花了一個小時查原因,但畢竟是共同開發環境,難免遭遇這種狀況就是。

2012年10月4日 星期四

Pidgin安裝msn-pecan

如果有需要在Ubuntu的Pidgin中安裝msn-pecan模組,直接輸入
$ apt-get install msn-pecan 
即可完成安裝

接著關閉pidgin並重起後,將原本MSN的帳號停用
改成使用WLM的方式重新加入並啟動MSN帳號即可



2012年8月7日 星期二

Linux Shell Command Logger

1. 新增下列到/etc/bashrc中
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
若您使用的是ubuntu,則檔案為/etc/bash.bashrc。若使用centos,檔案為/etc/profile
ps. /etc/profile或/etc/bashrc等檔案要視順序設定,可參考http://www.51testing.com/?uid-225738-action-viewspace-itemid-216622

2. 新增下列到/etc/syslog.conf
local6.*                /var/log/commands

3. 若需要log rotate,則新增/var/log/commands這行到/etc/logrotate.d/rsyslog中 (以ubuntu為例,若您使用centos則是/etc/logrotate.d/syslog)

4. 參考資料
http://blog.kxr.me/view/classic
http://efreedom.com/Question/6-93566/Log-Bash-Commands-Users-Server

2012年6月22日 星期五

Pylons profiling工具 -- repoze.profile

repoze.profile可以針對WSGI進行完整的profiling,本文特別針對Pylons的使用做簡單說明

1. 安裝
只要使用
$ easy_install repoze.profile
下完指令即可安裝完成
 
2. 設定
直接在pylons的middleware.py修改如下

from repoze.profile.profiler import AccumulatingProfileMiddleware

# ...

def make_app(.....):
    load_environment(global_conf, app_conf)
    app = PylonsApp()

    app = AccumulatingProfileMiddleware(
        app,
        log_filename='/tmp/profiling.log',
        cachegrind_filename='/tmp/cachegrind.out',
        discard_first_request=True,
        flush_at_shutdown=True,
        path='/__profile__'
    )

    app = RoutesMiddleware(app, config['routes.map'])
    app = SessionMiddleware(app, config)
    app = CacheMiddleware(app, config)

    #.....
 

log_filename代表profiling log檔案存放位置
cachegrind_filename代表要給KCachegrind工具觀看的profiling log檔案存放位置
discard_first_request代表要不要忽略第一次檢視的結果,因為通常第一次的數據都會比較不正常而影響了整體的結果
flush_at_shutdown代表middleware instance不存在時是否要將profiling結果刪掉
path顧名思義就是利用browser檢視profile結果的URI
 
設定完成後重起httpd server
 
3. 確認結果
確認 http://localhost/__profile__ 能否存取
理論上可以看到畫面如下
 
 
4. 使用KCachegrind檢視
 
5. 參考資料

http://pypi.python.org/pypi/repoze.profile
http://docs.repoze.org/profile/#viewing-the-profile-statistics
http://nickmurdoch.livejournal.com/392632.html

2012年6月7日 星期四

Perforce Console 版本教學

以下教學同時適用於mac版與linux版

1. 下載perforce console版

請至 http://www.perforce.com/downloads/complete_list 下載The Perforce Command-Line Client (P4),檔案會是一個執行檔。下載後請放置於/usr/bin/並修改檔案權限。

sudo chmod 755 /usr/bin/p4

2. 設定環境變數

修改~/.bashrc,加入下列資訊
export P4HOST={SERVER HOSTNAME}
export P4PORT={PORT}
export P4CLIENT={WORKSPACE NAME}
export P4USER={USERNAME}
unset P4CHARSET


P4CHARSET參數視client與server之間的編碼版本決定,細節可見 http://www.perforce.com/perforce/doc.current/manuals/cmdref/env.P4CHARSET.html

其他環境變數可參見 http://www.perforce.com/perforce/doc.current/manuals/p4guide/02_config.html 說明

接著重新載入.bashrc後直接執行p4看看是否與server連結正常。如果出現Perforce client error等字樣,代表環境變數設定還有問題。若成功就會出現相關的help指令說明。


3. 登入perforce

接著輸入p4 login,就會詢問登入密碼,登入後就會顯示成功登入的訊息。如果實在嫌每次都要登入登出麻煩,可以直接在.bashrc中間指定P4PASSWD參數(但因為放置於.bashrc等於是明碼儲存,並不建議)


p4 login 


4.  建立workspace


若此台電腦尚未開啟過workspace,只要執行p4 client即可,便會跳出一個vim文字編輯畫面,讓您修改此workspace相關訊息,儲存後就會在server上建立一個新的workspace。比較重要的參數就是Client、Root與View這幾個參數,Client就是屆時在清單會看到的workspace名稱,Root則是程式碼儲存的根目錄,View則是會決定你要同步出來的路徑深度。

p4 client

接著可用 p4 workspaces -u 確認目前此user的workspace狀態,並檢查剛剛的workspace是否有建立 

p4 workspaces -u {USERNAME}



若要看更詳細的workspace訊息,可用 p4 client -o 指令把前面vim編輯的訊息倒出來

p4 client -o {WORKSPACE NAME}

若要刪除workspace,執行 p4 client -d 即可

p4 client -d {WORKSPACE NAME}


5. 倒出程式碼

p4 sync {PATH ON SERVER}/...
目錄會幫忙開好


強制sync到最新版
p4 sync -f {PATH ON SERVER}/...


p4 sync -n 沒有真的同步,只是把結果先倒出來

p4 sync -n ./... 列出目前路徑下還有哪些檔案沒有up-to-date


如果出現Request too large代表此路徑下檔案太多,需要縮小範圍來sync


6. 確認檔案狀況

p4 have {FILENAME} 確認該檔案在client端目前版本可用p4 have *

p4 files {FILENAME} 確認該檔案在server端的最新版本可用p4 files *  

p4 fstat {FILENAME} 確認該檔案更詳細的訊息。其中還可以看到誰也開了這檔案。可用p4 fstat *


p4 changes {FILENAME} 列出檔案各個版本與歷史紀錄


p4 changes -m {MAX} {FILENAME} 只列出該檔案最近的幾個版本與紀錄

p4 changes -i ./... 列出目前目錄下所有子目錄所有檔案的 各個版本與歷史紀錄


p4 filelog {FILENAME} 列出更詳細的版本與歷史紀錄

7. 修改檔案 

p4 add {FILENAME} 新增檔案


p4 diff {FILENAME} 假設你正在修改revision #4,就會比較你現在改的跟原本revision #4的差別


p4 diff {FILENAME}#{REVISION} 比較你現在改的跟特定revision


p4 diff {FILENAME}#HEAD 比較你現在改的跟特定revision跟server上最新的revision

p4 diff2 {FILENAME}#{REVISION1} {FILENAME}#{REVISION2} 比較server上兩個revision

p4 diff -se 列出你自己沒有先edit就強制編輯的檔案

p4 diff -se | p4 -x -edit 將上述的檔案通通edit開

p4 diff -sd 察看哪些檔案不是用p4 delete而是自己手動在本地刪除的 

p4 edit {FILENAME} 將程式碼check-out出來


p4 submit {FILENAME} 將程式碼check-in進去

p4 submit -d {DESC} 將程式碼check-in進去並補上說明

p4 revert {FILENAME} 直接將檔案倒回編輯時check-out的原樣 

p4 revert 直接將所有開啟的檔案全部倒回

p4 delete {FILENAME} 刪除特定檔案


p4 sync {FILENAME}#{REVISION} 將本地檔案倒回某個版本 


p4 sync ./... 更新該目錄與子目錄下所有的檔案至server的的最新revision


p4 opened 列出目前已經check-out的檔案

p4 move {FILENAME} {NEW FILENAME or NEW FILEPATH} 搬移或rename某個檔案 (更名亦可用p4 rename {OLD FILENAME} {NEW FILENAME})


p4 restore {FILENAME}#{REVISION} 將某個檔案倒回到特定版本


p4 resolved 解決某個檔案的衝突


8. 進階用法


p4 tag -l {LABEL} {FILENAME} 將某個檔案加入特定label



p4 label {LABEL} 建立或編輯label


p4 labels -u {USERNAME} 列出該user所有的label

p4 labels ./... 列出此路徑下存在的label


p4 sync @{LABEL}
同步該label中的所有文件


p4 files @
{LABEL}
查看該label所包含的文件列表


p4 branch {BRANCHNAME} 建立branch


p4 branches -u {USERNAME} 顯示該使用者擁有的branch


p4 integrate -b
{BRANCHNAME}
合併該brach中的文件

p4 dirs -H .
顯示當前目錄



9. 求助

p4 help 列出重要指令說明


p4 help commands 列出所有指令的說明


p4 help {COMMAND} 針對特定指令的更詳細說明


p4 help revisions 列出針對檔案版本的指令說明,例如#rev或@change的意義