【问题标题】:Unable to load environment variables from file over ssh无法通过 ssh 从文件加载环境变量
【发布时间】:2022-01-18 07:01:20
【问题描述】:

我运行以下命令:

ssh -i ${SSH_KEY_PATH} ${SSH_SERVER_URI} "export $(grep -v '^#' /home/ubuntu/code/.env.prod | xargs -d '\n') && aws ecr get-login --region eu-central-1"

并出现以下错误:

Unable to locate credentials. You can configure credentials by running "aws configure".

看起来环境变量不可访问。然后如何加载以便我可以通过 AWS CLI 登录到 aws?

【问题讨论】:

  • 当您将字符串放在双引号中时,$(...) 会在本地而非远程主机上执行。
  • 另外,您根本不需要命令替换。 ssh ... 'set -a; . /home/ubuntu/code/.env.prod; set +a; aws ecr get-login --region eu-central-1 你就完成了
  • 顺便说一句,shell 本身使用全大写变量名。理想情况下,您自己的名称应在保留给应用程序使用的命名空间中至少包含一个小写字符,并保证不会对符合 POSIX 的外壳或其他工具产生意外的副作用——请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,请记住设置 shell 变量会覆盖任何类似命名的环境变量(因此相同的命名约定必须适用于两者,至少在 shell 名称的命名空间内)。
  • 另外,请注意${var} 与$var 没有什么不同,除非您需要参数化扩展名或消除部分变量名的尾随字符的歧义,这两种情况都不是。如果您想添加额外的字符以使您的脚本更正确,这些字符应该是 双引号,它指示 shell 禁用字符串拆分和全局扩展(所以 "$var" 或 "${var}") .

标签: bash amazon-web-services ssh


【解决方案1】:

为什么会坏

当您将$(...) 放在双引号字符串中时,它会在评估该字符串时运行,即在 ssh 启动之前。因此,grep 命令在您的本地计算机上运行,​​可能没有相关文件(或至少与远程副本的内容不同)。

如何避免问题

您根本不需要$(...) 或xargs 或export。使用set -a 使所有变量自动导出,然后获取您的文件,使用set +a 用于在完成后关闭自动导出:

ssh -i "$SSH_KEY_PATH" "$SSH_SERVER_URI" \
  'set -a; . /home/ubuntu/code/.env.prod; aws ecr get-login --region eu-central-1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 2018-11-03
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2016-10-19
    相关资源
    最近更新 更多