我必须使用 rsync 定期将文件夹传输到备份(基本上想要自动执行此操作)。最初我每次都必须输入密码,但我通过采用公钥/私钥身份验证机制来实现此目的。
但发生的情况是,它可以轻松地将文件发送到后面,而无需使用 sudo,也不会提示输入密码,除了受权限保护的文件之外。对他们来说,它说:rsync: send_files failed to open "/home/usr/...../checkpoints/246/descriptors.json": Permission denied (13) .
所以对于他们来说我必须使用sudo
并输入密码。我该如何解决这个问题?定期将文件夹添加到公共目录中进行传输,例如50毫秒的周期。所以我需要在这方面实现自动化。
答案1
您有两个选择,要么配置root
为使用您创建的 ssh 密钥,要么更改文件的权限,以便您可以以非 root 用户身份读取它们。
选项 1:以 root 身份使用 ssh 密钥
因为您是 root,所以您只能读取和使用您为用户创建的 ssh 私钥。 ssh
允许您使用 标志指定私钥-i
,rsync 允许您使用 标志更改远程 shell 命令-e
。所以你最终会得到一个看起来像这样的命令:
sudo rsync -e "ssh -i /home/usr/.ssh/id_rsa" <the rest of your rsync args>
替换/home/usr/.ssh/id_rsa
为您创建的 ssh 密钥的实际路径。我假设您的 ssh 密钥不受密码保护。如果是,您需要使用 删除密码ssh-keygen -p <keyfile>
。
选项 2:更改源文件的权限
最干净的解决方案可能是修复写入文件的任何内容,以便它们首先归您的非 root 用户所有。但您也可以chown
在复制之前先复制文件。例如,
sudo chown -R "$USER" "/home/usr/...../checkpoints"
但请注意,存在竞争条件。在 rsync 完成之前以其他用户身份创建的新文件可能会给您带来错误,并且在下次运行之前不会被复制。