通过 SSH 为 RSYNC 转义错误的服务器路径

Escaping bad server paths for RSYNC via SSH

我有一个客户使用最可笑的 file/folder 命名,需要将他们的数据同步到 NAS。我的 RSYNC 逻辑是用 Perl 编写的,并且 quotemeta() 运行良好,直到我们不得不处理丹麦字符。

参见示例代码:

#!/usr/bin/env perl
$my_string_a = "/data/stuff/folder K/ \snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere";
$my_string_b = quotemeta($my_string_a);
print "\n".$my_string_a."\n".$my_string_b."\n";
exit;

输出:

/data/stuff/folder K/ snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere
\/data\/stuff\/folder\ K\/\ snappy\/SLE\.T\.TET\/Div\ \(erse\)\/SLETTET\/Disk\ kl\�\�bere

注意:我必须使用转义字符,因为 ssh / rsync 在 Perl 中需要 "double escaping"。

是否有更好的固定解决方案,或者我是否需要通过正则表达式解决这个问题?

调用外部程序(即 systemexec 等)的 Perl 内置函数并不总是能正确处理编码。

您可以尝试使用 rsync 命令行的 Net::OpenSSH which has native support for transferring files with rsync and can handle automatic quoting and encoding 为您服务。

use Net::OpenSSH;
use utf8;

my $ssh = Net::OpenSSH->new(...,
                            argument_encoding => 'utf8');

$ssh->rsync_put("/data/stuff/folder K/ \snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere",
                $target_dir)
    or die "rsync_failed " . $ssh->error;