аргументы ограничивают выполнение php exec ()сценарием bash

все просто, была такая же проблема, используйте yum для вывода списка установленных пакетов:

sudo yum list installed gnome-shell*

найти конкретное расширение в установленных пакетах и ​​удалить:

sudo yum remove <your extension>

Выйти и войти в систему

2
01.12.2020, 22:51
3 ответа

В большинстве систем ядро ​​ограничивает размер аргументов execve()системным вызовом (аргументы командной строки + переменные окружения ). В Linux ограничение связано с максимальным размером стека, хотя обычно вы получаете не менее 2 МБ общего размера для ограничения размера стека по умолчанию в 8 МБ. Он также ограничивает один аргумент до 128 КБ, см., например. Существует ли максимальное расширение имени файла bash (подстановки ), и если да, то какое? и Повышение ограничения на 128 КБ для переменных среды в Linux

Если PHP запускает sh -c 'command line'при вызове exec("command line"), то аргумент -cможет значительно превысить ограничение в 128 КБ. Тот факт, что командная строка впоследствии разбивается оболочкой на отдельные слова, не поможет.

2
18.03.2021, 22:45

Когда у вас так много аргументов, вы хотите передать их в GNU Parallel через стандартный ввод (stdin )или через файлы.

Я бы сделал что-то вроде (непроверенного):

$f = popen("parallel","w");
fwrite($f,$commands);
close ($f);

Таким образом вы сможете избежать временного файла.

1
18.03.2021, 22:45

Итак, со всей вашей помощью, вот мое решение :PHP:

function scan_targets() {

$targetsFile= "[absolute path to the file]/targets";

$array_with_targets = fetch_from_db (); //function that gets me all the targets
$outputfile = "[absolute path to the file]/outputFile"; //output from parallel script
$pidfile = "[absolute path to the file]/pidFile"; //PID of the process
$target = "";

foreach ( $array_with_targets as $row => $column ) {
    $id.= $column ['id'];
        $id.= " "; 
}
file_put_contents($targetsFile, $ip) ;
$cmd = "/bin/bash [absolute path to the file]/pass_targets.sh";
exec( sprintf ( "%s >> %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile ) );

БАШ:

#!/bin/bash

#appending arguments to the command
targets_array=()
IFS=" "
while read -r field || [ -n "$field" ]; do
    targets_array+=("$field")
done <[absolute path to the file]/targets
    
parallel bash [absolute path to the file]/check.sh ::: $targets_array

Вы также можете запустить параллель с опцией -Dall, чтобы получить больше информации о том, что происходит, мне удалось просканировать почти 40 000 хостов за 7 часов. Веб-сервер добавил все цели в файл за считанные секунды, и когда мой exec запускает используемый фоновый процесс, ему не нужно ждать результата (, мы выводим его в файл ).

Сценарий check.sh также обновляет запись базы данных Mariadb для конкретной цели по ходу дела.

0
18.03.2021, 22:45

Теги

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