【问题标题】:How can you send a Growl notification with netcat?如何使用 netcat 发送 Growl 通知?
【发布时间】:2013-02-07 23:17:38
【问题描述】:

我需要从 bash 脚本发送咆哮通知,但我无法安装 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 脚本将包含要发送到的机器列表(或者更可能接受该列表作为参数),因此可以跳过此订阅步骤(除非我需要传递魔法值!)。

我认为我没有正确执行散列,否则我没有设置客户端计算机以正确接收传入通知。

这里缺少什么?

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

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

【问题讨论】:

    标签: bash scripting growl netcat


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      要对密码进行加盐/散列处理,您需要执行以下操作:

      # 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 个字符。然后,您构建注册消息:

      # 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,否则它们在 Windows 的 Growl 中看起来很奇怪,我没有检查过 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 之间。“粘性”是真/假。

      【讨论】:

      • 为什么没有人将 printf 用于这样的事情?
      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多