C中的字符转义

标签 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'

所以,我需要转义几个字符,这样脚本才能正常工作。 我尝试了不同的转义顺序,但都不对。

感谢您的关注。

更新:

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

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

最佳答案

首先,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 在编译时在字符串中,期望在运行时变成回车。

第二,你确定将 expect 脚本嵌入到可执行程序中是正确的方法吗?也许您正在登录的主机会随之改变;如果将脚本与可执行文件分开,则替换脚本会容易得多。 (我无法告诉你我一生中写了多少个 pppd 聊天脚本,我很高兴它不需要重新编译 pppd 就可以使它们工作!)

关于C中的字符转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678221/

相关文章:

c++ - 寻找 C/C++ 语言和标准库规范

java - EnumMap-用于检测转义字符

Java:从字符串数组创建命令

c -\a在C语言中有什么用?

erlang - 为什么io :format support ~n when\n does the same thing?

C 字符串长度 - 这是有效代码吗?

c - 为什么我们在传递给 printf 时不需要取消引用指向字符串的指针?

c - 为什么gcc生成 "leal -8240(%ebp), %eax; cmpl $1, %eax; ja XXX"而不是jmp指令?

c - 如何在C中读取以空格分隔的n个数字

php - 带有下划线的PHP&MYSQL用户名