hpt.core
Ruslan Suleimanov написал(а) к Pavel Gulchouck в Oct 22 23:54:28 по местному времени:
Привет, Pavel!
Ответ на сообщение Pavel Gulchouck (2:463/68) к Ruslan Suleimanov, написанное 08 окт 22 в 11:00:
PG> Нi Ruslan!
PG> 07 Oct 22, Ruslan Suleimanov ==> Pavel Gulchouck:
PG>>>>> Покажи, как именно он запускается из перла.
RS>>>> open(FROMK,"-|") || exec("cat /mnt/fido/CODE/db/1.txt | hpt -c
RS>>>> /mnt/fido/zone2/husky/config post -af '2:467/888' -nf '.....' ...
RS>>>> -") || die "error message: $!"; close(FROMK);
PG>>> Тут много странного.
PG>>> У open() второй параметр "-|", что предполагает третий аргумент как
PG>>> процесс, для которого stdout перенаправляется в FROMK. Но третий
PG>>> параметр не передаётся, от undef. Вариант undef как третий параметр
PG>>> используется для unnamed tempfile, но это в случае "+>", а в твоём
PG>>> случае я не понимаю, что произойдёт и что имелось ввиду, поясни.
RS>> тут я открываю канал без опаски перехвата интерпретатором команд моих
RS>> аргументов которые могут изменятся. тоесть потом просто читается из
RS>> FROMK в родительском процессе.
PG> Ты хочешь, чтобы, если в параметрах, которые ты подставляешь из переменных,
PG> встретились метасимволы ("'", "$"), то они не были интерпретированны
PG> шеллом? Открытый пайп FROMK (а на самом деле не открытый, иначе exec не
PG> выполнится) тут не поможет. Запускай hpt через exec() (если возврат не
PG> нужен) или через system (если нужен), передавая не командную строку, а
PG> список аргументов без всяких перенаправлений, тогда он будет выполнен без
PG> shell. Текст поста ты предварительно пишешь в 1.txt? Тогда просто передавай
PG> этот 1.txt параметром. А если хочешь через пайп, тогда open my $openk,
PG> "|-", "hpt post -nf '$from' ... -"; и потом в $openk пиши текст поста, без
PG> создания 1.txt. Но тогда нужно самостоятельно проверить, чтобы в параметрах
PG> не встретились одинарные кавычки. Ещё вариант, чтобы использовать пайп без
PG> запуска шелла - руками сделать редирект stdout на пайп, потом запустить
PG> hpt, и потом писать в пайп. Или использовать IPC::Open3.
PG> В твоём случае я бы предложил не усложнять, т.е. не использовать пайп, а
PG> запускать через system() со списком параметров, а текст брать из файла
PG> 1.txt.
RS>> а как можно безопасно вызвать чтобы динамичные аргументы не
RS>> подставлялись в командах ? через system() ?
PG> Можно через system(), можно через exec(), можно предварительно экранировать
PG> метасимволы.
спасибо будем заниматься. Тебе удачи !
WBR Ruslan Suleimanov
... "Спершу ти називаэш українцiв салоїдами, а потiм тебе в полi доїдає українська
--- rsync://ip.fido.odessa.ua/FIDO/
|