Команда Perl qx () не работает должным образом - PullRequest
0 голосов
/ 18 июня 2019

У меня есть сценарий perl, как показано ниже, где я хочу получить доступ к сетевому пути на удаленной машине Windows с машины Linux с помощью rsh.

$cmd = "rsh -l $username $host \"pushd \\\\network\\path\\to\\the\\directory && dir\"";
print $cmd, "\n";
print qx($cmd);

Когда я запускаю сценарий, третья строка печатает выводThe system cannot find the path specified. Однако, если я запускаю команду, напечатанную во второй строке, прямо из терминала, она работает нормально.

Я не могу понять, почему скрипт не работает.Если команда работает с терминала, она также должна работать с использованием qx ().

1 Ответ

2 голосов
/ 18 июня 2019

Когда вы экранируете мета-символы от интерполяции с помощью двойных кавычек и удаленной оболочки, qx может сам интерполировать строку снова, и в этом случае вам может понадобиться добавить еще один уровень экранирования.Из документации qx * ​​1003 *:

Строка, которая (возможно) интерполируется и затем выполняется как системная команда с / bin / sh или ее эквивалентом,...
Способ оценки этой строки целиком зависит от интерпретатора команд в вашей системе .На большинстве платформ вам придется защищать метасимволы оболочки, если вы хотите, чтобы они обрабатывались буквально .Это на практике сложно сделать, так как неясно, как убежать от каких персонажей.См. Perlsec для чистого и безопасного примера ручной fork () и exec () для безопасной эмуляции обратных ударов.

...