如何使用Ubuntu(systemd)、Github和SSH键从git启动

如何使用Ubuntu(systemd)、Github和SSH键从git启动,git,ubuntu,github,Git,Ubuntu,Github,我已经设置好了,所以我使用ssh密钥使用Github进行身份验证。我已经试过了所有的方法,似乎都能奏效。所以现在我想让我的应用程序在每次计算机启动时运行,所以我创建了以下systemd配置 [Unit] Description=Job that runs your user script [Service] WorkingDirectory=/.../web/site ExecStart=npm start Type=oneshot RemainAfterExit=yes [Install]

我已经设置好了,所以我使用ssh密钥使用Github进行身份验证。我已经试过了所有的方法,似乎都能奏效。所以现在我想让我的应用程序在每次计算机启动时运行,所以我创建了以下systemd配置

[Unit]
Description=Job that runs your user script

[Service]
WorkingDirectory=/.../web/site
ExecStart=npm start
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
又一次,一切似乎都正常。现在我想在每次开机前拉一下,所以我改成

[Unit]
Description=Job that runs your user script

[Service]
WorkingDirectory=/.../web/site
ExecStart=git pull
ExecStart=npm start
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
但现在它失败了

Mar 08 05:45:21 debdev systemd[1]: Starting Job that runs your user script...
Mar 08 05:45:21 debdev git[731]: Host key verification failed.
Mar 08 05:45:21 debdev git[731]: fatal: Could not read from remote repository.
Mar 08 05:45:21 debdev git[731]: Please make sure you have the correct access rights
Mar 08 05:45:21 debdev git[731]: and the repository exists.
Mar 08 05:45:21 debdev systemd[1]: node-site.service: Main process exited, code=exited, status=1/FAILURE
Mar 08 05:45:21 debdev systemd[1]: node-site.service: Failed with result 'exit-code'.
Mar 08 05:45:21 debdev systemd[1]: Failed to start Job that runs your user script.
我错过了什么?是因为我的SSH密钥在我的用户下吗?我可以创建一个“根”ssh密钥吗?

这是:

Host key verification failed.
在您的案例中,验证远程存储库Github时存在问题。这可能是因为当系统启动时,您的用户是以root用户而不是普通用户身份运行的,而在设置密钥对时,您就是普通用户。要解决此问题,可以直接指定标识文件。要以一次性的方式执行此操作,并且不为根用户添加第二个标识文件(您可以这样做,也不需要付出太多的努力,就像您为用户所做的那样),您可以改为运行

ssh-agent bash -c 'ssh-add /path/to/id_rsa; git pull'

为了在修复此问题时不重新启动/重新启动服务,我建议您尝试以root用户身份修复
git pull
命令,然后在
systemd
中尝试,您需要启动ssh代理并添加密钥

  • 启动时启动ssh代理:
  • 在服务单元文件中,添加以下内容

    [Unit]
    After=ssh-agent.service
    
    [Service]
    Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
    ExecStartPre=/usr/bin/ssh-add [your_key_file]
    

  • 为了实现这一点,我创建了一个新的无密码SSH密钥,并将其添加到我的repo中

    当从通过
    systemd
    单元触发的脚本启动时从repo中提取时,我使用这个SSH密钥

    在脚本中发出
    git pull
    命令之前,我启动
    ssh代理
    并应用只读密钥:

    eval `ssh-agent -s`
    ssh-add path/to/key
    

    这使得从回购协议中获取最新变化成为可能。无密码的SSH会带来一些风险,但我觉得很舒服,因为密钥是只读的,并且仅限于此repo。

    这是
    [您的密钥文件]
    id\u rsa
    的路径吗?是的,这是到您的私钥文件的路径。