2011-01-13 2 views
0

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

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

Script Мне нужно выполнить это:

expect -c 'spawn ssh [email protected] cat /proc/stat 

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

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

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

UPD:

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

Таким образом, я не могу просто скопировать и вставить скрипт в файл C, то необходимо некоторой обработке

+1

Почему именно вам нужно избегать содержимого этого скрипта? Экранирование необходимо только при написании строковых или символьных литералов в исходный узел C, а не при чтении данных из внешних файлов. – templatetypedef

+0

Какие escape-последовательности вы пробовали, и каков был результат? –

+0

Без экранирования я получаю ошибку при компиляции («синтаксическая ошибка перед« * »,« блуждающая »в программе» и другие). Я думаю, что проблема связана с новыми строками, но скрипт не работает, если я просто пишу его в одной строке. Я пытался использовать \ n, но это мне не помогло. Итак, я не могу просто скопировать и вставить скрипт в файл C, ему нужна некоторая обработка – George

ответ

2

Первых вещей первыми, stringification C может помочь вам сделать многострочную-струну легче на глазах:

char *script = "expect -c 'spawn ssh [email protected] cat /proc/stat\n\n" 
       "expect {\n" 
       "-re \".*yes/no.*\"\n" 
       "send \"yes\\r\"\n" 
       ... 

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

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

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

+0

+1 для указания, что это плохая идея. –

+0

Спасибо! Ваши советы были очень полезны для меня. О вложении - в моем случае это неплохо. Все зависимости, адреса и т. Д. Жестко закодированы, и вся система работает как одна вещь.Адрес, имя пользователя для пароля никогда не будет изменено. – George

1

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

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

Примечание Я также прекратил линии с новой строки побег C code '\ n'.

Смежные вопросы