我已经使用以下方式安装了 sshguard自制在我的 Mac OS X 机器上,但现在想让 sshguard 在系统启动时自动启动。
我尝试了两种方法。首先,我尝试在 /Library/StartupItems 中创建一个名为 sshguard 的文件夹,并创建了一个标准的 StartupParameters.plist 文件以及一个名为 sshguard 的 bash shell 脚本文件。但是,当我重新启动计算机时,sshguard 从未运行过(我曾经ps -ax | grep sshguard
检查过)。
第二种方法是在 /Library/LaunchDaemons/ 中创建一个名为 net.sshguard.sshguard 的文件,其 XML 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>net.sshguard.sshguard</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sshguard</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>matthew</string>
<key>WorkingDirectory</key>
<string>/usr/local/sbin</string>
</dict>
</plist>
现在,当我运行launchctl load -w /Library/LaunchDaemons/net.sshguard.sshguard.plist
该脚本时,似乎安装成功,因为launchctl list
显示守护进程脚本已安装。然后我运行launchctl start net.sshguard.sshguard
,一切似乎都正常。
但是,当我运行时,ps -ax | grep sshguard
我发现 sshguard 实际上并未运行。我也尝试过重新启动,但当我运行时,launchctl list
sshguard 不在列表中。
如果我在调试模式下运行 sshguard,SSHGUARD_DEBUG=true /usr/local/sbin/sshguard
它看起来运行良好。
我已经检查了 net.sshguard.sshguard.plist 的权限,它们与其他工作文件相同,实际上都是 775。
有人能帮我建议如何让 sshguard 在 Mac 上自动启动吗?
谢谢,马特
答案1
我也在寻找一种方法来做到这一点,并弄清楚了为什么它无法继续运行:您需要指定要监视的日志文件(假设 sshguard 1.5)。试试这个:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>SSHGUARD_DEBUG</key>
<string>false</string>
</dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>net.sshguard.sshguard</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sshguard</string>
<string>-l</string>
<string>/var/log/secure.log</string>
</array>
<key>QueueDirectories</key>
<array/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array/>
</dict>
</plist>
答案2
我使用这种低技术并且非常不符合 OS-X 风格的方法来在 OS X 机器启动时启动守护进程。
首先创建一个启动守护进程的脚本,并将其保存在 中/usr/local/sbin/
。例如:
#!/bin/sh
# Make sure the system is really up before running this...
sleep 60s
# Export any environment variables you might need here...
#export SSHGUARD_DEBUG=true
# Start your daemon
/usr/local/sbin/sshguard
确保脚本是可执行的:
sudo chmod 755 /usr/local/bin/start-sshguard
测试它是否从命令行工作,如下所示:
sudo /usr/local/bin/start-sshguard
现在将一个条目放入 root 用户的 crontab 中,该条目在系统重启时运行:
sudo echo "@reboot root /usr/local/sbin/start-sshguard" >> /etc/crontab
它现在应该在系统启动时启动,而不必经过所有的 Launchd 操作来实现它。
答案3
您的属性列表似乎没有做错任何事情(顺便说一下,launchd
当您可以使它工作时,这是在 Mac OS X 上执行此类操作的最佳方式),但这里有几件事需要检查:launchd
用户是否
matthew
具有工作目录 ( ) 的必要权限/usr/local/sbin
(至少具有读取和执行权限,如果有任何内容输出到工作目录,则可能具有写入权限)?另外,如果您既然我们谈到了这一点,你为什么要将工作目录设置为
/usr/local/sbin
?这是程序将运行的目录在. 这确实不是需要与程序运行的目录相同从,假设您已指定完整路径。除非您知道程序将操作相对于其当前工作目录的位置的文件(大多数守护进程不知道 - 工作目录主要是对我们这些弱小人类的一种安慰),否则您可能根本不需要设置它。你看过 的输出了吗
sudo launchctl list net.sshguard.sshguard
?这至少应该会给你 sshguard 的退出状态,这也许能帮助你弄清楚它退出的原因。是
sshguard
这些 fork-then-exit 程序之一,它在后台启动守护进程,然后返回到终端吗?如果是这样,您不能(直接)使用密钥KeepAlive
- 当它退出时,launchd
认为它已经退出,并尝试重新启动它,这取决于如何sshguard
处理这个问题,可能会导致问题。如果sshguard
是 fork-then-exit,您可以弄清楚它如何向 fork 指示它是实际的守护进程(例如,一个额外的参数或一个略有不同的命令),直接使用它launchd
。如果不能,请不要使用密钥KeepAlive
。最后,尝试使用 GUI 进行设置。我以前推荐 Lingon,但它在 Mac-App-Store-we-want-£3 上都找不到。不过,您可能能够找到旧版本之一或互联网上的替代版本。它将确保您没有输入任何错误,并允许您确定您没有将某些东西放在错误的位置(重新启动时没有自动加载表明发生了这种情况,尽管您所描述的做法在我看来是正确的)。