2013-02-04 99 views
1

我需要從bash腳本發送咆哮通知,但是我沒有能力安裝growlnotify命令行工具或可以做類似工作的perl模塊。我可以編寫任意bash腳本,並且在對這臺linux機器上可用的內容進行快速清點後,似乎我已經擁有了netcat。如何使用netcat發送Growl通知?

我可以用這種方式發送咆哮通知嗎?我一直在擺弄這樣的事情:

echo -ne "GNTP/1.0 NOTIFY NONE MD5:04cf1ad341ea8e51d7bb314424276c38.6162636465666768\r\nApplication-Name: test Notification-Name testtest Notification-Title: blah \r\n\r\n" | nc -v 127.0.0.1 23053 

但它是我不清楚如何協議實際工作。我假設客戶訂閱另一臺計算機時,他們基本上將自己註冊到服務器要連接的計算機列表(超過23053),發送格式化的消息,可能等待答覆,然後斷開連接。由於我的bash腳本將包含要發送到的機器的列表(或者更有可能,接受列表作爲參數),因此此訂閱步驟可以是可跳過的(除非有需要傳遞的魔術值!)。

我不相信我正確執行散列,否則我沒有設置客戶機來正確接收傳入的通知。

這裏缺少什麼?

我得到以下錯誤消息,當我運行這個或類似的命令:

GNTP/1.0 -ERROR NONE 
Error-Code: 400 
Error-Description: Invalid key hash 
Origin-Machine-Name: SOMETHING 
Origin-Software-Name: Growl/Win 
Origin-Software-Version: 2.0.9.1 
Origin-Platform-Name: Microsoft Windows NT 6.1.7601 Service Pack 1 
Origin-Platform-Version: 6.1.7601.65536 
X-Message-Daemon: Growl/Win 
X-Timestamp: 2/5/2013 11:54:28 AM 

回答

0

對於網絡通知,您需要使用密碼,密碼必須以特定方式進行鹽析和散列。此外,將要發送通知的計算機還必須首先發送帶有一個或多個定義的通知類型的註冊命令。

做密碼鹽析/散列,你會做這樣的事情:

# Hexify the salt: 
HEXSALT=`echo -n $SALT | xxd -p` 

# Md5 the password+salt 
KEYBASIS=`echo -n "$PASSWORD$SALT" | $MD5SUM` 
KEYBASIS=${KEYBASIS:0:32} 
KEY=`echo -n "$KEYBASIS" | xxd -r -p | $MD5SUM` 
KEY=${KEY:0:32} 

需要注意的是,鹽可以是完全任意(和可以改變,消息到消息),只要它在至少4個字符的大小。然後,你建立的註冊消息:

理論上的圖標可以在消息中發送,我從來沒有設法得到它的工作。圖標應該至少爲64x64,或者在Growl for Windows中看起來很奇怪,我沒有用Growl for Mac或Apple的通知中心進行檢查。然後發送消息,像:

echo "$MESSAGE" | nc -v $ipaddress 23053 

雖然你也許可以消除的netcat完全和使用bash的TCP設施(的/ dev/TCP)...我只是從來沒有使用之前,不知道怎麼。最後,要發送通知,請執行以下操作:

MESSAGE="GNTP/1.0 NOTIFY NONE MD5:$KEY.$HEXSALT 
Application-Name: $APPLICATION 
Notification-Name: $NAME 
Notification-Title: $TITLE 
Notification-Text: $TEXT 
Notification-Sticky: $STICKY 
Notification-Priority: $PRIORITY 

" 
MESSAGE=`echo -ne "$MESSAGE" | $UNIX2DOS` 
echo "$MESSAGE" 

應用程序名稱和非名稱必須與註冊時發送的內容匹配。優先級必須介於-2和2之間。「粘」是真/假。

+1

爲什麼沒有人使用printf來做這樣的事情? – dc5553

1

echo需要-e標誌正確地解釋轉義字符\r\n