как ввод с клавиатуры из tcl в запущенный bash скрипт - PullRequest
0 голосов
/ 21 июня 2020

Я хочу запустить сценарий bash через Tcl.

Пока выполняется сценарий bash, примерно через 1 минуту появляется поле ввода, поэтому вам нужно ввести что-то с клавиатуры. Я хочу вставить туда переменную cc. Как я могу это сделать?

мой сценарий tcl:

bind pub "-|-" !ttest pub:ttest

proc pub:ttest {nick host handle channel arg} {

    set aa [lindex [split [stripcodes bcu $arg]] 0];
    set bb [lindex [split [stripcodes bcu $arg]] 1];

    set cc [lindex [split [stripcodes bcu $arg]] 2];

    set start [exec bash -c "su user -c \"cd /home/user/; bash teststart.sh $aa $bb\""]

    putnow "PRIVMSG $channel :done"
}

это происходит, когда я запускаю сценарий bash прямо в консоли:

user@home:/$ cd /home/user
user@home:~$ bash teststart.sh testaa testbb
ENTER HERE:
(I would like to insert the variable cc here)
script done going exit

Ответы [ 2 ]

1 голос
/ 22 июня 2020

Теоретически вы можете просто поместить переменную в стандартный ввод скрипта. Он будет ждать, пока сценарий не будет готов его использовать. Вы делаете это, используя << с exec, что позволяет вам вводить значение Tcl прямо без каких-либо временных файлов:

# We can call “su” directly; no need for a bash wrapper
set start [ exec su user -c "cd /home/user/; bash teststart.sh $aa $bb" << $cc ]

(Идея подключения чего угодно до IR C, который запускает скрипт через su, вызывает у меня коллизию. Я очень надеюсь, что ваш код безопасности в порядке!)

Если вам требуется , чтобы отложить отправку строки на фиксированный период времени, вероятно, проще всего сделать это с помощью небольшого конвейера подпроцесса:

set start [ exec bash -c "sleep 60; echo $cc" | su user -c "cd /home/user/; bash teststart.sh $aa $bb" ]

Для более сложных взаимодействия, вы попадаете в область, в которой расширение Expect того стоит. У меня нет опыта интеграции его с Eggdrop (и с Expect тоже не особо много; у меня по большей части другие проблемы).

0 голосов
/ 21 июня 2020

Вот сценарий ожидания, который может выполнить то, что вы ищете:

#!/usr/bin/expect

# Put your bash specific command here - I just have bash for now
spawn /bin/bash

interact {

-o -nobuffer "ENTER HERE: "  {
        send $whatever
}

}

Извините, я не могу дать вам больше - я на самом деле не использую expect или tcl (ну, не для многих лет), так что я вам особо не помогу. Я просто надеялся указать вам в правильном направлении.

...