需要 .ssh/id_dsa 密码的 systemd 服务

需要 .ssh/id_dsa 密码的 systemd 服务

我有一个 systemctl 服务,可以在会话smd-loop中启动一个进程screen。此过程需要访问远程 SSH 源(用于同步目的),因此需要能够访问我的id_dsa私钥。

如何设置 systemd 服务才能正常工作?以下服务正确启动该过程,但要求我附加到屏幕会话并手动输入密码id_dsa

[Unit]
Description=smd loop
After=local-fs.target network.target

[Service]
User=%i
Group=users
Type=Forking
ExecStart=/usr/bin/screen -S smd-loop-win -md "smd-loop"
RemainAfterExit=yes

当我手动启动时,不需要密码,因为我已经安装了smd-loop启动在登录时保存密码的模块。id_dsapam_sshssh-agent

答案1

如果您只需要在登录时让服务运行,请使其连接到ssh-agent您在会话中启动的服务。最简单的方法是为代理套接字使用固定路径。将环境变量设置SSH_AUTH_SOCK为类似于/home/romeovs/.ssh/darkstar.agent.socketsystemd 作业和.profile.请注意,如果您的发行版ssh-agent为您启动了一个进程,您可能需要终止它,或者不使用它并用您自己的进程替换它。如果SSH_AUTH_SOCK环境中存在该变量,ssh-agent则使用它包含的套接字路径。然后,当您登录时,运行ssh-add您的私钥,作业将能够使用它。

如果您需要让该作业始终运行,我建议为此目的创建一个特定的无密码密钥 ( ),并通过使用和中的限制来ssh-keygen -t rsa -f ~/.ssh/smd.id_rsa -N ''授权它仅在服务器上运行特定命令。command=from=~/.ssh/authorized_keys服务器上的文件。该from=选项表示该密钥仅对来自特定主机的登录尝试有效,并command=指定执行的命令而不是客户端指定的命令。

ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="[email protected]" command="somecommand --foo"

该命令由您的登录 shell 执行。如果您需要向该命令传递参数,您有两种选择:

  • 客户端尝试的原始命令位于SSH_ORIGINAL_COMMAND环境变量中。如果您尝试解析它,请注意引用问题。
  • 一些环境变量由客户端传递。确切的设置取决于服务器配置(文件AcceptEnv中的指令sshd_config)。

答案2

您需要将包含未加密私钥的身份文件放入~/.ssh服务正在运行的用户的目录中。此外,您还需要为其设置 HOME 环境变量,例如,如果它以 root 身份运行:

ExecStart=/usr/bin/env HOME=/root /usr/bin/screen -S smd-loop-win -md "smd-loop"

或者,如果您可以控制如何smd-loop调用,ssh您可以添加-I选项来告诉ssh要使用的身份文件。

在任何情况下,身份文件都必须由该用户拥有,并且只能由该用户访问 ( chmod 0400 ~/.ssh/id*)。

答案3

我会为该服务生成一个自己的 ssh 密钥,而无需密码。

然后,在目标系统上,我将在authorized_keys中使用“command=”将该密钥的使用限制为单个命令。

之后,要触发目标命令,您只需连接到服务器 - 您不必再指定任何其他内容(不执行命令事件)。

相关内容