Тема: hpt.core
Показать сообщение отдельно
  #13  
Старый 10.10.2022, 01:14
Ruslan Suleimanov
Guest
 
Сообщений: n/a
По умолчанию 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/
Ответить с цитированием