从 systemd 调用时 ssh 不起作用

从 systemd 调用时 ssh 不起作用

我正在尝试编写一个脚本,将笔记本电脑上的文件夹 rsync 到我的 NAS。从命令行调用时,该脚本运行良好。我尝试将脚本设置为使用 systemd 自动运行。但是,ssh 登录存在问题。虽然从命令行运行脚本时运行正常,但我收到权限被拒绝错误。

到目前为止,我已经尝试了以下方法来缩小问题范围:

剧本/home/tikey/scripts/nas_sync_photos_to_nas.sh

#!/bin/bash
set -x
ssh [email protected] -v -i /home/tikey/.ssh/id_rsa ls -la rsync_laptop

为了使用 systemd 运行脚本,我已将文件sync-photos-to-nas.service放入~/.config/systemd/user/

[单元]
描述=将图片同步到 nas
[服务]
ExecStart=/home/tikey/scripts/nas_sync_photos_to_nas.sh

从命令行运行脚本可以正常工作。不幸的是,使用 systemd 运行脚本不起作用。我已经使用 运行了 systemd 服务systemctl --user start sync-photos-to-nas.service。然后,使用journalctl --user-unit sync-photos-to-nas,我得到:

...
debug1:主机“192.168.17.200”已知并且与 RSA 主机密钥匹配。
debug1:在 /home/tikey/.ssh/known_hosts:2 中找到密钥
debug1:在 4294967296 个块后重新密钥
debug1: SSH2_MSG_NEWKEYS 已发送
debug1:期望 SSH2_MSG_NEWKEYS
debug1:在 4294967296 个块后重新密钥
debug1: 已收到 SSH2_MSG_NEWKEYS
debug1: 已收到 SSH2_MSG_SERVICE_ACCEPT
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
debug1:下一个认证方法:publickey
debug1:提供RSA公钥:/home/tikey/.ssh/id_rsa
debug1:服务器接受密钥:pkalg ssh-rsa blen 535
debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址
debug1:下一个身份验证方法:键盘交互
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
debug1:下一个身份验证方法:密码
debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
权限被拒绝,请重试。
debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
权限被拒绝,请重试。
debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
debug1:没有更多可尝试的身份验证方法。
sync-photos-to-nas.service:主进程已退出,代码=已退出,状态=255/n/a
sync-photos-to-nas.service:设备进入故障状态。
sync-photos-to-nas.service:失败,结果为“退出代码”。

有人知道可能是什么问题吗?

答案1

debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址

日志显示您的私钥已加密,客户端无法在您输入密码之前使用它。请使用未加密的密钥或再次使用一些肮脏的解决方法sshpass

答案2

debug1: read_passphrase: can't open /dev/tty: No such device or address

日志显示您的私钥已加密,客户端在您输入密码之前无法使用它。正如您在评论中所说:

当我登录时,密钥会自动解锁,但显然不适用于 systemd

为了确保完成此操作,您需要像使用登录名登录一样执行脚本。

[Unit]
Description=sync Bilder to nas

[Service]
User=<YOUR USER NAME>
WorkingDirectory=/home/<YOUR USER NAME>
ExecStart=bash -l -c "/home/tikey/scripts/nas_sync_photos_to_nas.sh"

man bash

-c string        If  the  -c  option  is  present, then commands are read from
                 string.  If there are arguments after the  string,  they  are
                 assigned to the positional parameters, starting with $0.

-l               Make bash act as if it had been invoked as a login shell (see
                 INVOCATION below).

man systemd.exec

User=, Group=    Set the UNIX user or group that the processes are executed as,
                 respectively. Takes a single user or group name, or a numeric 
                 ID as argument. etc...

答案3

根据man ssh,您的 SSH 调用中的参数顺序是错误的。您有这样的:

ssh [email protected] -v -i /home/tikey/.ssh/id_rsa ls -la rsync_laptop

但是在的“概要”中man ssh,它显示所有选项都必须位于“user@host”之前,因此请尝试以下操作:

 ssh -v -i /home/tikey/.ssh/id_rsa [email protected] ls -la rsync_laptop

您的 systemd 配置的其他细节看起来合理。

相关内容