我有一个引导 shell 脚本,当新的 Linux 服务器通过网络启动到多用户模式时,它首先运行。
完成后,我想向中央 loghost 服务器报告错误状态,该服务器当前正在使用 udp/tcp 端口 514 运行 syslog-ng,并在端口 80 上运行 Web 服务器(因此我可以使用 php/perl 来监听 http格式化的消息...)
但是,我无法安装任何软件包,因为构建是由客户指定的,而且我不想对配置文件进行任何更改。因此,系统日志是原始的,并且可能未安装 wget/curl。
我想做类似的事情;
exec 3<>/dev/tcp/www.google.com/80
echo -e “GET / HTTP/1.1\nhost: http://loghost.local/message\n\n” >&3
但事实证明这些设备在 Debian 机器上被禁用。
我显然可以级联不同的选项,例如;
if [ -x wget ]; then
echo "using wget to post message"
elif [ -x curl ]; then
echo "using curl to post message"
elif [ ]; then
exec 3<>/dev/tcp/loghost.local/80
echo -e “GET / HTTP/1.1\nhost: http://loghost.local/message\n\n” >&3
else
echo nc ## some netcat command so send stuff to udp 514...
fi
logger 看起来只支持本地和套接字连接,并且可能会受到 debian 限制
我似乎有很多选择,因为我可以在服务上配置很多东西。一个这样的非常愚蠢的想法是配置本地名称服务器来缓存某些域的丢失记录,并让引导脚本运行类似
getent hosts logmessage.sourceserver.mydomain.com
据推测,我可以从指定的日志文件中解析状态......;-)
显然,如果安装了 netcat,它是一个选项,但是某些服务器构建会积极删除像 netcat 这样的东西,因为它非常灵活。
无论如何,这个问题更多的是出于信息兴趣而不是实际目的,因为我可以暂时交换 syslog.conf 文件,但在不触及删除服务器的情况下执行此操作会很有趣......