Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6088197
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-10-17 09:00:13

在Linux C 中调用shell命令在多数情况下的确比较方便,只需要调用system或者popen即可

但是,如果shell命令中的输入参数存在字符串,则会出现很多意料之外的事情

例如,一个场景是使用Wifi联网,需要调用wpa_cli命令输入ssid和key:

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid '"MyAP"'
  2. wpa_cli -i ra0 set_network 0 psk '"MyKey"'

于是,在C中可能会为了方便,写成如下形式:


点击(此处)折叠或打开

  1. sprintf(cmd_buf, "wpa_cli -i ra0 set_network 0 ssid \'\"%s\"\'", ssid);
  2. system(cmd_buf);
  3. sprintf(cmd_buf, "wpa_cli -i ra0 set_network 0 psk \'\"%s\"\'", key);
  4. system(cmd_buf);

乍一看,没有任何问题,但是如果用户是:
Will's AP

该命令根本无法正确执行,因为

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid '"Will's AP"'

中已经在"Will's AP"两端使用了单引号进行转义了,于是这对单引号的内部的ssid也有单引号,则会解析到ssid中的第一个单引号为止,
然后,如果在shell中手动测试一下,shell命令行会出现一个提示符"<",提示需要继续输入

实际上,真正想在Linux C中正确调用shell脚本,最好对这类输入参数使用反斜杠转义,例如

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid \"\W\i\l\l\'\s\ \A\P\"

这样就不会出错了,在Linux C中对字符串手动转义为如上形式,一个很简单的程序即可实现

还有一个类似的例子,是在Linux C中使用grep命令,这种情况就更加严重了,因为还有好几个符号会被特殊对待,例如'`' '[' 等

再往外扩展,如果是javascript中需要操作html的DOM对象时,也要做合适的处理,例如一个字符串中有'<'这个符号,则会直接被识别为html中的'<'符号了,
需要使用&#的方式进行转义。




阅读(891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~