Perl 星号 * 字符问题

Perl asterisk * character issue

如何转义这些外部字符*/

此命令正在 shell 屏幕上运行。

当我在 Perl 脚本中添加它时,* 字符被破坏命令:

my $sonar = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner -Dsonar.host.url=http://sonarqubesonar.com:9000  -Dsonar.projectKey=codeAnalysis.test50 -Dsonar.sourceEncoding=Cp1252 -Dsonar.projectBaseDir='/vob/test/test' -Dsonar.sources='/vob/test/test/app/,/vob/test/test/src'  -Dsonar.projectName='test50' -Dsonar.java.binaries='/vob/test/test/**/*.jar' ";

是这样叫的

my $cmd = " csh -c '$sonar '";
print "cmd\n";
my $result = system("($cmd) >> /logs/on.txt 2>&1");

我得到的错误是:

Dsonar.java.binaries='/vob/test/test/**/*.jar' "; this variable is broken (*)

my $sonar = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner -Dsonar.host.url=http://sonarqubesonar.com:9000  -Dsonar.projectKey=codeAnalysis.test50 -Dsonar.sourceEncoding=Cp1252 -Dsonar.projectBaseDir='/vob/test/test' -Dsonar.sources='/vob/test/test/app/,/vob/test/test/src'  -Dsonar.projectName='test50' -Dsonar.java.binaries='/vob/test/test/**/*.jar' ";

是这样叫的

my $cmd = " csh -c '$sonar '";
print "cmd\n";
my $result = system("($cmd) >> /logs/on.txt 2>&1");

我认为你的问题是 'just' 嵌套了太多引号。

您的字符串中有单引号 - -Dsonar.java.binaries='/vob/test/test/**/*.jar'$cmd 中有单引号。

问题是您没有通过简单地将单引号引起来将 -c 的参数正确地转换为 shell 文字。换句话说,你有一个 shell 命令注入错误。修复:

use String::ShellQuote qw( shell_quote );

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ...";
my $outer_cmd = shell_quote('csh', '-c', $sonar_cmd) . ' >/logs/on.txt 2>&1';
system($outer_cmd);

但是你为什么要使用 csh?!您应该避免 shell,并且避免它允许您使用以下内容(假定 $sonar_cmd 是有效的 bourne shell 命令):

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ...";
my $outer_cmd = "( $sonar_cmd ) /logs/on.txt 2>&1";
system($outer_cmd);

如果 $sonar_cmd 只是一个 "statement",以下内容也有效:

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ...";
$sonar_cmd .= ' /logs/on.txt 2>&1';
system($sonar_cmd);