Эта тема на forum.dklab.ru


delta: system не работает
Помогите!Где моя ошибка!
Сервер под Unix. В php.ini разрешено выполнение system, exec, passthru.
Запускаю скрипт с клиента - не работает, выводит описанные ниже ошибки,
с командной строки сервера все исполняет.
Привожу скрипт:

$file_for_exec="add.txt";

system ('ls -l', $var_echo);
echo '$var_echo='.$var_echo; // возвращает 0 и работает

$cmd = '/usr/local/bin/dbupdate -c /usr/local/conf/rip.config -f /usr/local/data/'.$file_for_exec;
system ($cmd, $var_db);
echo '$var_db='.$var_db; //возвращает Segmentation fault (core dumped) $var_db=139


$cmd = "'/usr/local/bin/dbupdate -c /usr/local/conf/rip.config -f /usr/local/data/".$file_for_exec."'";
system ($cmd, $var_db);
echo '$var_db='.$var_db; //возвращает $var_db=127
Ермаков:
У меня он возвращал 127 код на неправильно составленные команды. Попробуйте заэхить строку, которую вы кормите system и пустить ее в командной строке.
И тут главное понимать. System работает, это точно, так что ошибка в строке.
chin:
А Вы пробовали эту строку из под Unix запустить?
/usr/local/bin/dbupdate -c /usr/local/conf/rip.config -f /usr/local/data/add.txt
Agat:
Столкнулся с такой бедой.


$tmpfname=<<< EOF
server ns.example.com
zone example.com
update delete sder.example.com.
update add sder.example.com. 3600 IN A 192.168.168.168
send
EOF;

#$tmpfname="./file";
$key="./key/example.com.+157+222334.private";

$rc = system("/usr/bin/nsupdate -k $key $tmpfname 2>&1", $ex);
echo $ex;

Возвращает 127
Дело в том, что в $tmpfname нужно передать путь к файлу. Если это сделать строкой $tmpfname="./file"; то все работает.

Как его туда заэхить из командной строки?

пробовал так:

$tmpfname=<<< EOF

echo <<BSH
server ns.example.com
zone example.com
update delete sder.example.com.
update add sder.example.com. 3600 IN A 192.168.168.168
send
BSH

EOF;

WTF Возвращает 0 но в логах DNS сервера не проходит обновление зоны.
bæv:
в $tmpfname нужно передать путь к файлу
— а у Вас там что?
Какое отношение вот это всё:
<<< EOF
server ns.example.com
zone example.com
update delete sder.example.com.
update add sder.example.com. 3600 IN A 192.168.168.168
send
EOF;
— имеет к «пути к файлу»?
Agat:
1. У меня там полная бредятина. поэтому получаю 127
2. никакого, поэтому и спрашиваю как туда все это запихнуть?

Создавать временный файл и передавать к нему путь?
bæv:
Agat, http://forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html — особенно про то, как правильно задавать вопросы.


как туда все это запихнуть?
— куда «туда»? И что такое «всё это»?
Вы разницу между «путём к файлу» и «содержимым файла» понимаете?
bæv:
Создавать временный файл и передавать к нему путь?
— да.
Очевидно же.
Agat:
Очевидно, но неправильно.

перефразирую вопрос:
есть кусок кода


$tmpfname="./file";
$key="./key/example.com.+157+222334.private";

$rc = system("/usr/bin/nsupdate -k $key $tmpfname 2>&1", $ex);
echo $ex;


и временный файл file

server ns.example.com
zone example.com
update delete sder.example.com.
update add sder.example.com. 3600 IN A 192.168.168.168
send


Вопрос. Как не создавая временный файл передать необходимые значения в $tmpfname

P.S. Не говорите, что это невозможно сделать.
bæv:
Как не создавая временный файл передать необходимые значения в $tmpfname
— ещё раз:
Вы разницу между «путём к файлу» и «содержимым файла» понимаете?


«Необходимое значение в $tmpfname» может быть только одно — путь к файлу.
Agat:
Прекрасно понимаю. И задача решаема.
Решение нашел, достаточно элегантное и простое.
Спасибо.
bæv:
Не говорите, что это невозможно сделать.
— разбирайтесь со «стандартным вводом» («standard input»). Я не уверен, но вполне допускаю, что можно перенаправить команды из переменной на стандартный ввод.
Типа, «nsupdate -k $key <$tmpfname».
Обращайтесь на форумы *nix'овых администраторов.

P.S. Опоздал…
Agat:

$tmpfname=<<< EOF

echo<<BSH
server ns.example.com
zone example.com
update delete sder.example.com.
update add sder.example.com. 3600 IN A 192.168.168.168
send
BSH

EOF;

Случайно забыл вызвать echo перед <<BSH и неожиданно для себя обнаружил обновление зоны в логах dns

Большое вам спасибо, за потраченное на меня время. Это действительно к php ни какого отношения не имеет.
bæv:
забыл вызвать echo перед <
— «<» сработал как «стандартный ввод»?

Эта тема на forum.dklab.ru