通过 SSH authorized_keys command="..." 验证 rsync

通过 SSH authorized_keys command="..." 验证 rsync

我正在尝试通过 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

比编写自制脚本更好的方法是使用rrsyncrsync,在基于 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 的工作原理。

相关内容