2011-01-13 109 views
0

我需要傳遞一些命令給終端拋出C程序,並在此之後得到它的輸入。 作爲它的一部分,我有一個必須放置Expect腳本的行。字符在C中轉義

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

腳本我需要執行是:

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 2011-01-13 08:56:21

+0

你嘗試過哪些轉義序列,結果如何? – 2011-01-13 08:57:41

回答

2

首先第一件事情,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來使它們工作!)

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換行符逃生線路代碼'\ n'。