如何使用netcat发送Growl通知?

问题描述:

我需要从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 

对于网络通知,您需要使用密码,密码必须以特定方式进行盐析和散列。此外,将要发送通知的计算机还必须首先发送带有一个或多个定义的通知类型的注册命令。

做密码盐析/散列,你会做这样的事情:

# 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

echo需要-e标志正确地解释转义字符\r\n