Использовать многострочную переменную PHP в качестве аргумента для выполнения bash-скрипта

Для добавления ответа, который указывает на надежный раздел в документации :

Учитывая выражение среза, подобное s[i:j:k],

Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такая, что 0 & lt; = n & lt; (J-я) / к. Другими словами, индексы i, i + k, i + 2 * k, i + 3 * k и т. Д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, i и j сведены к len (s), если они больше

blockquote>

, если вы пишете s[999:9999], python возвращает s[len(s):len(s)] с len(s) < 999 и ваш шаг (1 - значение по умолчанию).

2
задан ToasterFrogs 18 March 2019 в 00:58
поделиться

2 ответа

Вы всегда должны экранировать переменные, которые подставляете в командные строки, и PHP предоставляет функцию escapeshellarg() для этого.

$output = shell_exec("/path/to/bash/script.sh " . escapeshellarg($filechosen));

или

$escaped = escapeshellarg($filechosen);
$output = shell_exec("/path/to/bash/script.sh $escaped");
0
ответ дан Barmar 18 March 2019 в 00:58
поделиться

В GNU / Linux обычным способом команд является обработка потоков. Также grep делает это. По возможности, вы не должны нарушать эту схему. В вашем конкретном примере нет смысла заключать его в позиционные параметры.

Вы можете использовать popen для записи потока в исполняемую команду:

<pre>
<?php

$filechosen = <<<_EOS_
*
*clefF4
*k[f#c#g#d#a#]
*d:
*M6/4
_EOS_;


if($handle = popen("grep 'k\\['", "w"))
{
  fwrite($handle, $filechosen);
  pclose($handle);
}

?>
<pre>

Вместо этого используйте функцию proc_open, когда хотите прочитать выходной поток в переменную.

if($handle = proc_open("grep 'k\\['", [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $streams))
{
  [$stdin, $stdout, $stderr] = $streams;

  fwrite($stdin, $filechosen);
  fclose($stdin);

  $output = stream_get_contents($stdout);
  fclose($stdout);

  $error  = stream_get_contents($stderr);
  fclose($stderr);

  proc_close($handle);
  echo $output;
}
0
ответ дан Quasimodo's clone 18 March 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: