【问题标题】:AWS_ACCESS_KEY_ID command not found when using shell to call aws cli passing environment var fail:使用 shell 调用 aws cli 传递环境变量时找不到 AWS_ACCESS_KEY_ID 命令失败:
【发布时间】:2018-01-26 07:11:21
【问题描述】:

当我使用环境变量直接在工作终端调用aws cli时,它会成功:

AWS_ACCESS_KEY_ID=xxx AWS_SECRET_ACCESS_KEY=xxx AWS_REGION=xxx aws elb describe-load-balancers --output json --debug

但是如果在 shell 中,我首先设置 AWS_KEY_PAIR 然后执行相同的命令,它会返回给我AWS_ACCESS_KEY_ID=xxx: command not found 我的 shell 脚本如下所示:

function test(){
AWS_KEY_PAIR="AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY} AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY} AWS_REGION=${AWS_REGION}"

${AWS_KEY_PAIR} aws elb describe-load-balancers --output json --debug }

如果我直接在工作终端中运行第一个命令但在 shell 脚本中失败,谁能告诉我为什么它会成功? AWS_KEY_PAIR 不能这样设置吗?非常感谢!

【问题讨论】:

    标签: shell amazon-web-services command-line-interface


    【解决方案1】:

    问题在于你修改环境的方式:

    man bash : 任何简单命令或函数的环境都可以通过在参数分配前加上前缀来临时扩充,如上文 PARAMETERS 中所述。这些赋值语句只影响所看到的环境 那个命令。

    这意味着如果变量存在,您可以为单个命令临时修改它。例如。

    $ cat test.sh
    #!/usr/bin/env zsh
    echo $FOO
    $ FOO="hello world"
    $ echo $FOO
    hello world
    $ FOO="hello universe" ./test.sh
    hello universe
    $ echo $FOO
    hello world
    

    您会看到在执行FOO="hello universe" ./test.sh 期间,变量FOO 被临时修改。这正是您在命令行上执行命令期间所做的事情。

    然而,在你的脚本中,你尝试了一些不同的东西。您将脚本分配给一个变量,然后尝试“执行”。

    $ BAR="FOO=hello"
    $ echo $BAR
    FOO=hello
    $ $BAR
    bash: FOO=hello: command not found...
    

    如您所见,它尝试执行命令FOO=hello,这不是命令,实际上是您尝试执行的字符串。它类似于键入$ "FOO=hello"。所以你现在可以想象了

    $ $BAR ./test.sh
    

    也不会执行。

    这里有一个使用evalevil 解决方法,但是eval is evil

    man bash : eval [arg ...]

    args 被读取并连接到一个命令中。然后这个命令被shell读取并执行,它的退出状态被返回为eval的值。如果没有参数,或者只有空参数,eval 返回0

    $ BAR="FOO=hello"
    $ echo $BAR
    FOO=hello
    $ eval $BAR
    $ echo $FOO
    hello
    $ FOO="hello world"
    $ eval $BAR ./test.sh
    hello
    

    后面的示例正是您尝试在函数test() 中尝试的内容。您将变量声明分配给变量AWS_KEY_PAIR,然后使用修改后的环境${AWS_KEY_PAIR} 执行aws,但这不会起作用,因为AWS_KEY_PAIR 只不过是一个长字符串。因此,您可以通过将eval 放在它前面来修复它,或者将完整的密钥对输入为

    function test(){
    AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}           \
       AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}    \
       AWS_REGION=${AWS_REGION}                   \
       aws elb describe-load-balancers --output json --debug
    }
    

    【讨论】:

    • 非常感谢您的回复。它对我有用!
    猜你喜欢
    • 2020-03-07
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多