如何使用netcat发送Growl通知?

时间:2013-02-04 22:10:07

标签: bash scripting growl netcat

我需要从bash脚本发送growl通知,但我无法安装growlnotify命令行工具或可以执行类似操作的perl模块。我可以编写任意的bash脚本,在对这台linux机器上的可用内容进行快速清点之后,似乎我有netcat。

我能以这种方式发送咆哮通知吗?我一直在修补这样的东西:

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脚本将包含要发送到的计算机的列表(或者更可能接受列表作为参数),因此此订阅步骤可以跳过(除非我需要传递魔法值!)。 < / p>

我不相信我正确执行了哈希,否则我没有设置客户端计算机来正确接收传入通知。

这里缺少什么?

运行此命令或类似命令时,我收到以下错误消息:

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

2 个答案:

答案 0 :(得分:1)

echo需要-e标记才能正确解释转义字符\r\n

答案 1 :(得分:0)

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

要进行密码salting / hashing,你可以这样做:

# 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}

请注意,salt可以是完全任意的(并且可以更改,消息发送到消息),只要它的大小至少为4个字符。然后,您构建注册消息:

# Now we need to build the message string.
MESSAGE="GNTP/1.0 REGISTER NONE MD5:$KEY.$HEXSALT
Application-Name: My Application
Application-Icon: http://somesite.come/whatever.png
Notifications-Count: 2

Notification-Name: startup
Notification-Display-Name: Starting
Notification-Enabled: False

Notification-Name: downtime
Notification-Display-Name: Shutting Down
Notification-Enabled: True

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

理论上,图标可以在消息中发送,我从来没有设法让它工作。图标应该至少为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"

App-name和Not-name必须与注册时发送的内容相匹配。优先级必须介于-2和2之间。“粘滞”是真/假。