【问题标题】:how can i escape a ! (bang/exclamation) in a perl script calling a bash command?我怎么能逃脱! (砰/感叹)在调用 bash 命令的 perl 脚本中?
【发布时间】:2015-06-03 21:17:18
【问题描述】:

我正在更新旧版 Perl 脚本。它非常简单,因为它设置了一些变量,然后调用 bash 命令。问题是我传递的密码中有 2 个感叹号。这些似乎被翻译错了。假设我有这个脚本:

$source_db_ip = "1.2.3.4"; # carl dev/qa
$source_user = 'user1';
$source_password = "password!!";

$destination_db_ip = "5.6.7.8";
$destination_user     = "user2";
$destination_password = "password2!!";

my $status = `pt-table-sync h=$source_db_ip,p='${source_password}',u=$source_user,D=db_name,t=table_name   h=$destination_db_ip,p='$destination_password',u='$destination_user',D=db_name,t=table_name`;

这一直失败。我知道凭据是正确的,因为我已经手动检查了它们。那么如何正确转义密码以便正确翻译呢?

【问题讨论】:

  • 顺便说一句,反引号需要sh 命令,而不是bash 命令。
  • 顺便说一句,机器上的任何人都可以看到命令行,所以在命令行中包含密码是个坏主意。

标签: bash perl passwords escaping quotes


【解决方案1】:

您可以通过使用`perl -E'say for \@ARGV' -- ...` 看出,以下两个字符串作为参数传递:

h=1.2.3.4,p=password!!,u=user1,D=db_name,t=table_name
h=5.6.7.8,p=password2!!,u=user2,D=db_name,t=table_name

您没有指定您期望的格式,但看起来是正确的。请注意,我会使用shell_quote 而不是'$var'

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote(
   'pt-table-sync',
   join(',',
      "h=$source_db_ip",
      "p=$source_password",
      "u=$source_user",
      "D=db_name",
      "t=table_name",
   ),
   join(',',
      "h=$destination_db_ip",
      "p=$destination_password",
      "u=$destination_user",
      "D=db_name",
      "t=table_name",
   ),
);

`$cmd`

【讨论】:

  • 感谢您的建议。我试过了,执行 shell_quote 时收到错误。但事实证明我的一个主机名有错误,所以没有进一步追查错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2013-03-12
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多