我正在尝试编写一个脚本,将笔记本电脑上的文件夹 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 配置的其他细节看起来合理。