如何通过Launchd在开机或登录时启动ssh-agent?
解决ssh-agent plist开机/登录启动及日志排查问题
问题背景
系统路径/System/Library/LaunchAgents/com.openssh.ssh-agent.plist存在默认plist文件,但尝试让其开机/登录启动失败,已尝试复制到用户目录、添加RunAtLoad配置等操作均无效,且无法查看启动失败日志。
1. 如何让plist在开机/登录时启动
系统目录下的plist由系统管控,不建议修改,正确做法是使用用户级plist:
步骤1:复制并修改用户级plist
将系统plist复制到~/Library/LaunchAgents/目录(若该目录不存在则创建),然后编辑该文件,添加以下配置项:<key>RunAtLoad</key> <true/> <key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> </dict>说明:
RunAtLoad:设为true确保用户登录时自动启动该服务KeepAlive:配置为仅在服务非成功退出时重启,避免ssh-agent意外退出后无法恢复
步骤2:加载并启用plist
打开终端执行以下命令,完成plist的加载与开机启动配置:# 先卸载已加载的同名服务(避免冲突) launchctl unload ~/Library/LaunchAgents/com.openssh.ssh-agent.plist 2>/dev/null # 加载用户级plist launchctl load ~/Library/LaunchAgents/com.openssh.ssh-agent.plist用户级
~/Library/LaunchAgents目录下的plist会在每次用户登录时自动加载,无需额外配置开机启动。
2. 查看plist启动失败的日志
使用macOS自带的log命令过滤相关日志:
- 查看ssh-agent及launchd关联日志
# 查看最近1小时的相关日志,包含调试信息 log show --predicate 'process == "ssh-agent" OR label == "com.openssh.ssh-agent"' --info --debug --last 1h - 精准过滤启动失败日志
若要定位启动失败原因,可缩小时间范围并筛选错误信息:log show --predicate 'label == "com.openssh.ssh-agent" AND (message contains "failed" OR message contains "error")' --error --last 30m
原始plist内容
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.openssh.ssh-agent</string> <key>ProgramArguments</key> <array> <string>/usr/bin/ssh-agent</string> <string>-l</string> </array> <key>Sockets</key> <dict> <key>Listeners</key> <dict> <key>SecureSocketWithKey</key> <string>SSH_AUTH_SOCK</string> </dict> </dict> <key>EnableTransactions</key> <true/> </dict> </plist>
内容的提问来源于stack exchange,提问作者devoutsalsa
相关产品推荐
相关产品推荐

