Тема: hpt.core
Показать сообщение отдельно
  #10  
Старый 08.10.2022, 12:41
Pavel Gulchouck
Guest
 
Сообщений: n/a
По умолчанию hpt.core

Pavel Gulchouck написал(а) к Ruslan Suleimanov в Oct 22 11:00:46 по местному времени:

Нi Ruslan!

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: $!";
RS>>> close(FROMK);

PG>> Тут много странного.
PG>> У open() второй параметр "-|", что предполагает третий аргумент как
PG>> процесс, для которого stdout перенаправляется в FROMK. Но третий параметр
PG>> не передаётся, от undef. Вариант undef как третий параметр используется для
PG>> unnamed tempfile, но это в случае "+>", а в твоём случае я не понимаю, что
PG>> произойдёт и что имелось ввиду, поясни.

RS> тут я открываю канал без опаски перехвата интерпретатором команд моих аргументов
RS> которые могут изменятся.
RS> тоесть потом просто читается из FROMK в родительском процессе.

Ты хочешь, чтобы, если в параметрах, которые ты подставляешь из переменных, встретились метасимволы ("'", "$"), то они не были интерпретированны шеллом?
Открытый пайп FROMK (а на самом деле не открытый, иначе exec не выполнится) тут не поможет.
Запускай hpt через exec() (если возврат не нужен) или через system (если нужен), передавая не командную строку, а список аргументов без всяких перенаправлений, тогда он будет выполнен без shell.
Текст поста ты предварительно пишешь в 1.txt? Тогда просто передавай этот 1.txt параметром.
А если хочешь через пайп, тогда
open my $openk, "|-", "hpt post -nf '$from' ... -";
и потом в $openk пиши текст поста, без создания 1.txt. Но тогда нужно самостоятельно проверить, чтобы в параметрах не встретились одинарные кавычки.
Ещё вариант, чтобы использовать пайп без запуска шелла - руками сделать редирект stdout на пайп, потом запустить hpt, и потом писать в пайп.
Или использовать IPC::Open3.

В твоём случае я бы предложил не усложнять, т.е. не использовать пайп, а запускать через system() со списком параметров, а текст брать из файла 1.txt.

RS> а как можно безопасно вызвать чтобы динамичные аргументы не подставлялись в командах ?
RS> через system() ?

Можно через system(), можно через exec(), можно предварительно экранировать метасимволы.

Lucky carrier,
Паша
aka gul@gul.kiev.ua
--- GoldED+/LNX 1.1.5-b20160827
Ответить с цитированием