将带有特殊字符的参数传递给Socat exec脚本



我有一个RNDIS USB调制解调器,它允许通过telnet端口(5510(执行AT命令。我想用它来阅读和发送短信从脚本。我在这里使用了一个类似问题的变体,但我使用的是socat而不是netcat。

  1. 我有一个名为atread.sh的助手脚本:
#!/bin/sh
echo -e $@ 
IFS=$'n' 
while read line; do
echo $line >&3
if [ "${line::2}" = "OK" ] || [ "${line::5}" = "ERROR" ] ; then
break
fi
done
  1. 然后我的主脚本中有一个函数:
smsio() {
response=$(3>&1 socat -T 2 exec:"./atread.sh '$1'" tcp:xxx.xxx.xxx.xxx:5510,crlf)
... (some other code to check for a timeout or broken pipe)
}
  1. 我调用主脚本中的函数,如下所示:smsio "AT+CMGF=1"

只要参数不包括特殊字符,特别是:,这就非常有效

  • 引号("(如在smsio 'AT+CMGL="ALL"'中,用于读取所有SMS消息
  • smsio 'AT+CMGS="123456789"' ; smsio "Text Messagex1A"中使用Backflash(\(发送SMS

我曾尝试使用反斜杠(\"(和/或添加双引号(".."(来转义特殊字符,但socat在调用exec脚本之前似乎已经剥离了所有特殊字符。有什么建议可以让这些特殊的角色通过socat吗?

PS:我暂时通过字符替换绕过了这个问题(即在参数字符串中使用!for",然后在atread.sh中使用tr '!' '"',但我正在寻找一个更优雅的解决方案。

Socats地址解析器专门解释一些字符,例如:

: , ! " '  ( [ {

你必须用反斜杠来转义它们。请注意,您还需要从shell解析器中转义一些特殊字符,包括\。

使用选项-d-d-d可以查看socat接收和使用的参数;试试

socat -u /tmp/nonexistingdir/x\\x -

在错误消息中查看socat执行最后一次系统调用时剩下的特殊字符。

最新更新