我有一个 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_dsa
pam_ssh
ssh-agent
答案1
如果您只需要在登录时让服务运行,请使其连接到ssh-agent
您在会话中启动的服务。最简单的方法是为代理套接字使用固定路径。将环境变量设置SSH_AUTH_SOCK
为类似于/home/romeovs/.ssh/darkstar.agent.socket
systemd 作业和.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=”将该密钥的使用限制为单个命令。
之后,要触发目标命令,您只需连接到服务器 - 您不必再指定任何其他内容(不执行命令事件)。