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);
如何转义这些外部字符*/
?
此命令正在 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);