【问题标题】:Is that proper way to use rsync command? [duplicate]这是使用 rsync 命令的正确方法吗? [复制]
【发布时间】:2019-01-29 20:03:37
【问题描述】:
$var = "/nfs/sc/disks/darshils/scripts/";

这里$var是一个字符串

system 'rsync -av $var/.*pl /scripts/';

perl lang 中使用的系统命令我可以执行任何 unix 命令

这样可以在 rsync 命令中使用 $var 吗? 或任何其他在 rsync 命令中使用 $var 的方式?

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • @jww OP 正在询问有关 Perl 的问题,而不是有关 rsync 的问题。它很适合这里!

标签: linux perl unix rsync


【解决方案1】:

您可以让您的system 通话更安全一些。

system 有两种形式。字符串形式给system 一个参数。然后外壳程序解释字符串以找出要做什么。这可能与插入变量时的意图不同。什么是$var 类似于; rm -rf; 结束命令并允许您启动一个新命令。

列表形式更安全一些。命令后的任何参数都不会被 shell 特殊处理。如果$var 中有一个 shell 元字符,那它只是这种形式的字面自我:

 system 'rsync', '-av', "$var/.*pl", '/scripts/';

Perl 还具有“污点检查”功能,可以标记来自程序外部的数据(用户输入、文件等)。受污染的数据是病毒式的;将它与未受污染的数据一起使用,您将获得更多受污染的数据。当您尝试使用受污染的数据在程序之外执行某些操作时(例如 system),您会收到错误消息。

查看perlsec。我在Mastering Perl 中也有一个章节。祝你好运!

【讨论】:

    【解决方案2】:

    不,但有一种使用引号的正确方法。

    在 Perl 中,字符串 $var 被插在双引号内(以及双引号结构 qq{...}),但在单引号内(和 q{...})按字面意思处理。因此,您只想将您的 system 调用更改为

    system "rsync -av $var/.*pl /scripts/";
    

    【讨论】:

      【解决方案3】:

      尝试使用 Perl File::Rsync 模块。

      【讨论】:

        猜你喜欢
        • 2015-05-16
        • 2021-07-16
        • 2012-05-11
        • 2018-12-31
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多