我正在尝试通过 sshd 的 authorized_keys 文件验证 rsync。
问题是我无法从验证脚本执行 rsync。
这是我的authorized_keys文件:
command="/home/username/Desktop/valrsync username" ssh-rsa AAAA [...]
这是每次尝试不同的 valrsync 脚本:
测试 1 -
$SSH_ORIGINAL_COMMAND
输出 -
$ rsync [...] / username@remotemachine:/
/home/username/Desktop/valrsync: line 2: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.7]
更重要的是,测试 2 -
#!/usr/bin/python
import os
os.system(os.getenv('SSH_ORIGINAL_COMMAND'))
valrsync
输出(从本地计算机运行 rsync 并获取远程计算机上的输出)-
$ rsync [...] / username@remotemachine:/
sh: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.7]
我了解 rsync 以某种方式在远程计算机上生成自身的一个实例,并且显然当我尝试通过脚本执行 rsync 命令时不会引用该实例。服务器上没有安装 rsync,而且我知道它不应该安装。
现在的问题是,我能做什么呢(除了在服务器上安装 rsync……?)
答案1
比编写自制脚本更好的方法是使用rrsync
rsync
,在基于 Debian 的发行版中,您应该已经安装了/usr/share/doc/rsync/scripts/rrsync.gz
。在这种情况下,只需运行以下命令将 gzip 压缩的脚本解压到/usr/bin/rrsync
:
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c|sudo tee /usr/bin/rrsync && sudo chmod +x /usr/bin/rrsync
(当已经在运行时root
您显然可以停止sudo
调用)
或者rrsync
在这里下载。
提醒:已rsync
安装在远程机器上(包含文件的机器authorized_keys
)是先决条件这里。
一旦完成后,您只需command=
在带有公钥的行前面添加一个,然后调用rrsync
。
通常您会包含一些限制性的 SSH 选项command=
,因此它可能看起来像这样:
command="/usr/bin/rrsync -wo /data/backup/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ecdsa-sha2-nistp521 AAAAE...
通过提供该目录(您可以将其用于-ro
只读和-wo
只写),您可以在调用时离开该目录rsync
。
因此你的命令行将变成rsync [...] / username@remotemachine:
(注意后面缺少的路径:
)。
答案2
您收到的错误是rsync: command not found
。这通常意味着您的$PATH
环境变量设置不正确。使用您的第一个测试,明确设置PATH
为包含安装 rsync 命令的目录。例如:
#!/bin/sh
PATH=/usr/local/bin:$PATH
export PATH
$SSH_ORIGINAL_COMMAND
确保脚本可执行(chmod 755 valrsync
)。
所有这些都假设 rsync 确实安装在目标系统上。
答案3
确保已安装 rsync 并将其置于两端(客户端和服务器)的 PATH 中。rsync 客户端使用 SSH 在远程(服务器)端执行 rsync。这就是 rsync 的工作原理。