字符在C中逃逸

时间:2011-01-13 08:54:32

标签: c escaping

我需要将一些命令传递给终端抛出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:

没有转义我在编译时遇到错误(“*''之前的语法错误,程序中的”stray'\'和其他错误)。 我认为这个问题是由新行引起的,但是如果我只是将它写在一行中,则脚本不起作用。我尝试使用\ n,但这对我没有帮助。

所以,我不能简单地将脚本复制并粘贴到C文件中,它需要一些处理

2 个答案:

答案 0 :(得分:2)

首先,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 :(得分:1)

如果您在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"

注意我还使用C换行转义代码'\ n'终止了这些行。