我有一个脚本,它将SMS转发给它并将一些数据发布到PHP脚本。下面是我的Bash脚本:
#!/bin/bash
# Script to post data to Top up processor
curl --request POST 'http://127.0.0.1/user//topup/process.php' --data "receipt=$1" --data "username=$9"
所以要运行它:
./mpesa_topup.sh sms_message
但SMS服务器使用单引号转发邮件:
./mpesa_topup.sh 'sms_message'
脚本最终“将整个SMS解析为1位置参数。这是调试sms服务器运行脚本时会发生什么。
root@sms:/var/lib/playsms/sms_command/1# bash -x mpesa_topup.sh 'JJA88QHC22 Confirmed.on 101015 at 9:49 PMKsh25.00 received from 254712345678 SOME BODY.New Account balance is Ksh25.00'
+ curl --request POST http://10.5.1.2/topup/process.php --data 'receipt=JJA88QHC22 Confirmed.on 101015 at 9:49 PMKsh25.00 received from 254722227332 JOTHAM KIIRU.New Account balance is Ksh25.00' --data username=
root@sms:/var/lib/playsms/sms_command/1#
有没有办法在Bash脚本中删除/忽略打开和关闭单引号?
PS:我不是一名程序员,在我的朋友谷歌的帮助下得到了我的位置。答案 0 :(得分:4)
看起来你想要发送的单个参数中的第一个和第九个单词。你可以这样做:
$ set -- 'JJA88QHC22 Confirmed.on 101015 at 9:49 PMKsh25.00 received from 254712345678 SOME BODY.New Account balance is Ksh25.00'
$ echo $1
JJA88QHC22 Confirmed.on 101015 at 9:49 PMKsh25.00 received from 254712345678 SOME BODY.New Account balance is Ksh25.00
$ set -f # a
$ set -- $1 # b
$ set +f # c
$ echo $1
JJA88QHC22
$ echo $9
254712345678
关键是(b)我们省略变量周围的双引号。这允许shell对变量的值执行分词。
shell也将尝试执行glob-pattern扩展,除非你告诉它不要,我在(a)中做,然后在(c)中重新开启。
答案 1 :(得分:1)
您可以通过将主命令放在函数中并再次调用它来解决此问题。
您的服务器正在使用简单的引号调用您的脚本,该引号会在一个参数($ 1)中转换您的参数。
如果你对这个arg进行处理并在脚本中调用your_function(),你就解决了!
以下是示例:
#!/bin/bash
# Script to post data to Top up processor
args=$1
your_function(){
curl --request POST 'http://127.0.0.1/user//topup/process.php' --data "receipt=$1" --data "username=$9"
}
your_function $1
答案 2 :(得分:1)
是的,但这无济于事。最后,由于curl
,您的代码会将整个SMS作为单个字符串传递给--data "receipt=$1"
。如果您只删除引号,那么它将变为--data "receipt=JJA88QHC22"
,其余的(如金额)将会丢失。
你的问题是输入是多行文本,并以某种方式被破坏。解决方案是解析SMS。由于涉及金钱,你可能不希望有任何错误。这就是我使用像Python或Java这样的真正编程语言的原因。但是如果你想使用BASH,这可能会有效,直到攻击者开始向你发送短信来窃取资金:
# Split first parameter into $1...$n
set -- $1
recepient="$1"
# $2: Confirmed.on
# $3: 101015
# $4: at
# $5: 9:49
# $6: PMKsh25.00
amount=$(echo $6 | sed -e s/^(AM|PM)//) # sed removed the AM/PM at the beginning
# $7: received
# $8: from
sender="$7 $8 $9" # 254722227332 JOTHAM KIIRU.