curl在cli上工作,但在bash脚本中不工作

curl在cli上工作,但在bash脚本中不工作,bash,curl,Bash,Curl,我从CLI运行此命令,它工作正常 curl -H Content-Type:text/plain -vLk https://10.42.0.197/exec/show%20ver --user chartley:<pw omitted> 。。。它是这样运行的。。。ASA_do 10.42.0.197“显示版本” 下面是在bash脚本中添加了“set-x”的输出 [chartley@s324phx-syslog ~]$ ASA_do 10.42.0.197 "show version

我从CLI运行此命令,它工作正常

curl -H Content-Type:text/plain -vLk https://10.42.0.197/exec/show%20ver --user chartley:<pw omitted>
。。。它是这样运行的。。。ASA_do 10.42.0.197“显示版本”

下面是在bash脚本中添加了“set-x”的输出

[chartley@s324phx-syslog ~]$ ASA_do 10.42.0.197 "show version"
+ echo 'Gimme yo password foo!!'
Gimme yo password foo!!
+ read -s pass
++ echo '<omitted>'
++ sed 's/[(\!|\@|\#|\$|\%|\^|\&|\*|\(|\))&]/\\&/g'
+ pass='<pw omitted>'
+ [[ show version =~ [:space:] ]]
++ echo 'show version'
++ sed 's/ /\%20/g'
+ CMD=show%20version
+ [[ show%20version =~ */* ]]
+ curl -H Content-Type:text/plain -vLk https://10.42.0.197/exec/show%20version --user 'chartley:<pw omitted>'
* About to connect() to 10.42.0.197 port 443 (#0)
*   Trying 10.42.0.197... connected
* Connected to 10.42.0.197 (10.42.0.197) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* skipping SSL peer certificate verification
* SSL connection using TLS_RSA_WITH_RC4_128_SHA
* Server certificate:
*       subject: CN=ASA Temporary Self Signed Certificate
*       start date: Jul 18 20:53:46 2013 GMT
*       expire date: Jul 16 20:53:46 2023 GMT
*       common name: ASA Temporary Self Signed Certificate
*       issuer: CN=ASA Temporary Self Signed Certificate
* Server auth using Basic with user 'chartley'
> GET /exec/show%20version HTTP/1.1
> Authorization: Basic <omitted>
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.18 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 10.42.0.197
> Accept: */*
> Content-Type:text/plain
>
< HTTP/1.1 401 Unauthorized
< Date: Thu, 06 Apr 2017 20:39:38 UTC
< Connection: close
< Content-Type: text/html
< Expires: Thu, 16 Feb 1989 00:00:00 GMT
* Authentication problem. Ignoring this.
< WWW-Authenticate: Basic realm="Authentication"
<
<HEAD><TITLE>Authorization Required</TITLE></HEAD><BODY><H1>Authorization Required</H1>Browser not authentication-capable or authentication failed.</BODY>

* Closing connection #0 

您可能希望使用:

read -r -s -p 'Password:' pass
curl ..... needed args  .... --user "$USER:$pass"
没有任何密码之类的东西。(可能不想更改
IFS
(是的,当密码包含尾随空格时,
IFS=$'\n'
会有帮助…但首先尝试,不更改任何IFS…)在
IFS=$'\n'read-r-s-p'密码之后:'pass

答案是在curl命令中添加“eval”

#!/usr/bin/bash
set -x
echo "Gimme yo password foo!!"
IFS=$'\n' read -r -s -p 'Password:' pass

pass=$(echo $pass | sed 's/[(\!|\@|\#|\$|\%|\^|\&|\*|\(|\))&]/\\&/g' | sed "s/'//g")

if [[ "$2" =~ [:space:] ]];
then
        CMD=`echo $2 | sed 's/ /\%20/g'`
        #echo "space matched"
        #echo "$2"
fi

if [[ "$CMD" =~ */* ]];
then
        CMD=`echo $2 | 's/[\/]/\%2f/g'`
        #echo "Slash matched"
        #echo "$2"
fi

eval curl -H Content-Type:text/plain -vLk https://$1/exec/$CMD --user "$USER:$pass"

从CLI中,请提供
类型curl
哪个curl
的输出。请在脚本的第二行添加
set-x
命令,并向我们显示输出。作为第一步,将您的工作命令完全放入shell脚本中,其中包含硬编码的
用户名:密码
,仅此而已。您将看到该命令将在简单的命令行中工作。如第2步。-如果上述情况得到确认,这意味着所有关于环境的推测都是错误的,您必须在脚本中的密码咀嚼部分搜索错误源…:)@jm666这应该是显而易见的,但我甚至没有想到,谢谢。它执行得很好,所以我现在知道,虽然命令的回音相同,但传递给curl时有些地方不一样。我确实删除了pass-read语句中的IFS、set-r和-p,但没有任何效果,但您的建议让我找到了答案。我不认为eval是最好的解决方案,但它使它起作用,所以我很高兴。多谢各位@jm666@CodyHartley我不明白你为什么需要评估。评估(通常)是危险的。但是你知道你需要什么编程愉快。如果它是脚本中的最后一个命令,
exec
也是一个选项。
#!/usr/bin/bash
set -x
echo "Gimme yo password foo!!"
IFS=$'\n' read -r -s -p 'Password:' pass

pass=$(echo $pass | sed 's/[(\!|\@|\#|\$|\%|\^|\&|\*|\(|\))&]/\\&/g' | sed "s/'//g")

if [[ "$2" =~ [:space:] ]];
then
        CMD=`echo $2 | sed 's/ /\%20/g'`
        #echo "space matched"
        #echo "$2"
fi

if [[ "$CMD" =~ */* ]];
then
        CMD=`echo $2 | 's/[\/]/\%2f/g'`
        #echo "Slash matched"
        #echo "$2"
fi

eval curl -H Content-Type:text/plain -vLk https://$1/exec/$CMD --user "$USER:$pass"
read -r -s -p 'Password:' pass
curl ..... needed args  .... --user "$USER:$pass"
#!/usr/bin/bash
set -x
echo "Gimme yo password foo!!"
IFS=$'\n' read -r -s -p 'Password:' pass

pass=$(echo $pass | sed 's/[(\!|\@|\#|\$|\%|\^|\&|\*|\(|\))&]/\\&/g' | sed "s/'//g")

if [[ "$2" =~ [:space:] ]];
then
        CMD=`echo $2 | sed 's/ /\%20/g'`
        #echo "space matched"
        #echo "$2"
fi

if [[ "$CMD" =~ */* ]];
then
        CMD=`echo $2 | 's/[\/]/\%2f/g'`
        #echo "Slash matched"
        #echo "$2"
fi

eval curl -H Content-Type:text/plain -vLk https://$1/exec/$CMD --user "$USER:$pass"