如何让 sshguard 在 Mac 启动时运行

如何让 sshguard 在 Mac 启动时运行

我已经使用以下方式安装了 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 listsshguard 不在列表中。

如果我在调试模式下运行 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 上都找不到。不过,您可能能够找到旧版本之一或互联网上的替代版本。它将确保您没有输入任何错误,并允许您确定您没有将某些东西放在错误的位置(重新启动时没有自动加载表明发生了这种情况,尽管您所描述的做法在我看来是正确的)。

相关内容