rom*_*ovs 8 ssh gnu-screen systemd services
我有一个 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
Run Code Online (Sandbox Code Playgroud)
当我手动启动smd-loop的id_dsa密码没有必要的,因为我已经insalled在pam_ssh其启动的模块ssh-agent,在登录保存密码。
如果您只需要在登录时让服务运行,请使其连接到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 ''),并通过在服务器上的文件中使用 acommand=和from=限制来授权它仅在服务器上运行特定命令~/.ssh/authorized_keys。该from=选项表示密钥仅对来自特定主机的登录尝试有效,并command=指定执行的命令而不是客户端指定的命令。
ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="romeovs@darkstar.example.com" command="somecommand --foo"
该命令由您的登录 shell 执行。如果您需要向该命令传递参数,您有两种选择:
SSH_ORIGINAL_COMMAND环境变量中。如果您尝试解析它,请注意引用问题。AcceptEnv指令sshd_config)。您需要将包含未加密私钥的身份文件放入~/.ssh服务正在运行的用户的目录中。此外,您还需要为其设置 HOME 环境变量,例如,如果它以 root 身份运行:
ExecStart=/usr/bin/env HOME=/root /usr/bin/screen -S smd-loop-win -md "smd-loop"
Run Code Online (Sandbox Code Playgroud)
或者,如果您可以控制如何smd-loop调用,ssh您可以添加-I选项来告诉ssh要使用的身份文件。
在任何情况下,身份文件都必须由该用户拥有,并且只能由该用户访问 ( chmod 0400 ~/.ssh/id*)。
| 归档时间: |
|
| 查看次数: |
2058 次 |
| 最近记录: |