Персонаж убегает в C - PullRequest
       14

Персонаж убегает в C

0 голосов
/ 13 января 2011

Мне нужно передать некоторые команды программе C на терминальном броске и после этого получить ее ввод. Как часть этого, у меня есть строка, где сценарий Expect должен быть размещен.

FILE *command = popen("script here","r");

Сценарий, который мне нужно выполнить:

expect -c 'spawn ssh  user@host cat /proc/stat

expect {
-re ".*yes/no.*" {
send "yes\r"
exp_continue
}
"password:" {
send -- "password\r"
}
}
interact'

Итак, мне нужно экранировать несколько символов, чтобы скрипт работал так, как нужно. Я пробовал разные последовательности побега, но все они не правы.

И спасибо за внимание.

UPD:

Не выходя из экрана, я получаю ошибку при компиляции («ошибка синтаксиса перед` * '»,« отклонение »в программе» и другие). Я думаю, что проблема вызвана новыми строками, но скрипт не работает, если я просто пишу это в одну строку. Я пытался использовать \ n, но это не помогло мне.

Итак, я не могу просто скопировать и вставить скрипт в C-файл, требуется некоторая обработка

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Перво-наперво, строковое форматирование C может помочь вам сделать многострочные строки проще для глаз:

char *script = "expect -c 'spawn ssh user@host cat /proc/stat\n\n"
               "expect {\n"
               "-re \".*yes/no.*\"\n"
               "send \"yes\\r\"\n"
               ...

Компилятор с радостью разбьет все эти строки вместе для вас.

Обратите внимание, что \n превращаются в символы новой строки в строке во время компиляции, в то время как \\r превращается в \r в строке во время компиляции, что, как мы надеемся, превращается в возврат каретки время выполнения.

Во-вторых, вы уверены, что внедрение ожидаемого сценария в исполняемую программу - правильный подход? Возможно, хост, на который вы входите, изменится по пути; заменить скрипт намного проще, если он разбит отдельно от исполняемого файла. (Я не могу сказать вам, сколько сотен скриптов pppd-чата я написал в своей жизни, я просто рад, что для их работы не потребовалась перекомпиляция pppd!)

1 голос
/ 13 января 2011

Если вы жестко программируете «скрипт» в вашей C-программе, вам нужно следовать правилам C: это означает, что вы должны избегать встроенных двойных кавычек и обратной косой черты ...

const char script[] =
    "expect -c 'spawn ssh  user@host cat /proc/stat\n"
    "expect { -re \".*yes/no.*\" { send \"yes\\r\" exp_continue }\n"
    "             \"password:\" { send -- \"password\\r\" }\n"
    "       }\n"
    "interact'\n"

Замечание I 'Мы также завершили строки с помощью escape-кода новой строки C '\ n'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...