LINUX.ORG.RU

Запуск программы и ввод параметров

 , , ,


0

1

Здравствуйте! Уже который день пытаюсь найти способ запустить программу и ввести в нее параметры автоматически, через bash скрипт.

Вручную все получается, через ssh подключаюсь к терминалу, запускаю нужную программу и потом ввожу нужные параметры.

Хотел автоматизировать этот процесс, но увы у меня ничего не получается.

#!/bin/bash cat <<EOF | ./critter

go movetime 1000

EOF

Пробовал так, но не получается.

 printf "param1\nparam2\n" |ssh user@server "/path/to/critter" 
sdio ★★★★★ ()

может так?

"./criter < data.txt"

anonymous ()
Ответ на: комментарий от sdio

Параметры

Параметры без пробелов работают, но с ними нет.

tparser ()
Ответ на: Параметры от tparser

не верю. это же stdin, а не командная строка

sdio ★★★★★ ()
Ответ на: комментарий от sdio

.

Попробуйте сами запустить у себя, у меня ваш вариант не работает.

tparser ()
Ответ на: . от tparser

Re: .

Так вводилось? :

param1=«go movetime 1000», param2=<другая команда>

anonymous ()
Ответ на: expect от tparser

Re: expect

expect не подходит

А почему не подходит?

anonymous ()
Ответ на: Re: . от anonymous

printf «go movetime 1000\n» |ssh root@127.0.0.1 "./critter"

Не работает. Задача такая банальная, неужели нет простого решения?

1) Запустить программу (critter) 2) Ввести в нее команду, выполнить ее. 3) Получить ответ

И все это сделать автоматически, через скрипт.

tparser ()
Ответ на: комментарий от tparser

локальный код:

$ printf "args from stdin\nline #2\n" |
ssh -t qwerty@$TARGET /home/qwerty/run.sh "\"args from argv\" \"arg #2\""
Pseudo-terminal will not be allocated because stdin is not a terminal.
0:/home/qwerty/run.sh
1:args from argv
2:arg #2
reading: args from stdin
reading: line #2

удаленный код

$ cat /home/qwerty/run.sh 
#!/bin/bash

echo 0:$0
echo 1:$1
echo 2:$2

while read line; do
  echo "reading: ${line}"
done < /dev/stdin


$ printf "args from stdin\nline #2\n" | ./run.sh "args from argv" "arg #2"
0:./run.sh
1:args from argv
2:arg #2
reading: args from stdin
reading: line #2

anonymous ()
Ответ на: комментарий от tparser

неужели нет простого решения?

Программа может проверять, подсоединен stdin к терминалу, пример: различное поведение xsel, gpg который требует прямого ввода. (То есть и случаи моуть быть не самыми _простыми_.)

exec 3<<< pass
knoppix@Microknoppix:~$ echo plain | gpg --passphrase-fd 3 -c > secret
LC_ALL=C expect -c 'spawn gpg -d secret; expect "Enter passphrase:" { send "pass\r" }; interact'

anonymous ()
Ответ на: комментарий от anonymous

// шифрование с помощью встроего костыли, а рас** - с помощью expect-костыля (для которого пример и приведен)

anonymous ()
Ответ на: комментарий от anonymous

Вы уж извините, но я не могу понять как этим воспользоваться. Мой уровень владения всем этим - меньше нуля. Если можете, то приведите готовый пример, пожалуйста. А то я еще пару дней на это потрачу.

tparser ()
Ответ на: комментарий от anonymous

Хотя.. проще unbuffer (но тоже в пакет expect входит): echo '...' | unbuffer command

anonymous ()
Ответ на: комментарий от tparser
#!/usr/bin/expect

set timeout 2
spawn dash -c {read -p 'enter a & b: ' a b; echo $(( a * b ))}

expect timeout { send "4 2\r" }

interact

{..} - делает один аргумент (в духе %q{..} из перла) вместо timeout надежнее фразу из приглашения (там glob по подстроке)

anonymous ()
Ответ на: комментарий от anonymous

Еще обычно нужны команды в духе: «set var 1729», «puts $var», «set out [exec ls]». Для простого случая этой малой части тикля вполне может хватить.

anonymous ()
Ответ на: комментарий от anonymous

EXPECT

Спасибо, разобрался.

#!/bin/bash

/usr/bin/expect <<EOF

spawn ./critter

expect { «enabled» { send — «go movetime 1000\r» } }

expect { «bestmove» { send — «quit\r» } }

EOF

Вот этот пример работает.

tparser ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.