【问题标题】:Escaping bad server paths for RSYNC via SSH通过 SSH 转义 RSYNC 的错误服务器路径
【发布时间】:2019-06-22 15:53:06
【问题描述】:

我有一个客户端使用最荒谬的文件/文件夹命名,并且需要将他们的数据 RSYNC 到 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 中需要“双重转义”。

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

【问题讨论】:

  • perldoc -f quotemeta 中的这一点可能适用于您的情况:“在 Perl v5.14 中,所有非 ASCII 字符都在非 UTF-8 编码的字符串中引用,但在 UTF- 8 个字符串。从 Perl v5.16 开始,Perl 采用了 Unicode 定义的策略来引用非 ASCII 字符;ASCII 字符的引用没有改变。..."
  • 如果您声称您的脚本包含非 ASCII 字符(例如 æ),但您没有使用 use utf8;,那么您就是在做错事/具有欺骗性。
  • 不清楚你在问什么。你是在问你所做的是否正确?要知道这一点,我们需要知道是什么消耗了脚本的输出。在我看来,如果编写远程执行的命令,应该涉及 String::ShellQuote 的shell_quote
  • @ikegami 我知道我的代码不正确,因为它未能通过 rsync。让我扩展一下……我正在接收 HTML 编码的服务器路径,我需要在 rsync 目标中使用这个提供的路径。发生的事情是我的输入路径(例如 $my_string_a)在我的 rsync 中变成了 $my_string_b。阅读 cmets 我假设我需要进行字符编码转换才能使其工作?
  • 不知道。准确显示您的输入(例如,使用 sprintf("%vX", $input)),并且如上所述,确定输出的使用方式。

标签: perl ssh escaping rsync non-ascii-characters


【解决方案1】:

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

您可以尝试使用Net::OpenSSH,它本机支持使用rsync 传输文件,并且可以为您处理rsync 命令行的自动quotingencoding

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;

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2014-06-19
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多