通过 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"。
是否有更好的固定解决方案,或者我是否需要通过正则表达式解决这个问题?
调用外部程序(即 system
、exec
等)的 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;
我有一个客户使用最可笑的 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"。
是否有更好的固定解决方案,或者我是否需要通过正则表达式解决这个问题?
调用外部程序(即 system
、exec
等)的 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;