【问题标题】:AWS Session Manager is not sourcing bash rcAWS Session Manager 没有采购 bash rc
【发布时间】:2020-09-24 10:33:29
【问题描述】:

我正在使用AWS Systems Manager Session Manager 连接到我的 EC2 实例。

当我连接时,会话不会获取我的 .bashrc 或 .bash_profile,所以我得到了一个非常简单的 shell,并希望在它启动时设置一些配置。

会话管理器以 ec2-user 身份连接我,但 shell 从 / 目录而不是用户目录开始。

我无法确定它在启动时是否正在获取任何配置文件。
如何获取用户配置文件的来源?

我已通过启用“作为支持运行”设置来设置会话管理器以使用 ec2 用户。

如果我使用 EC2 实例连接连接到一个实例,那么它的工作原理如下所示:

但是,如果我使用会话管理器,则配置文件不是来源,如您在此处看到的:

【问题讨论】:

    标签: bash amazon-web-services


    【解决方案1】:

    发生这种情况是因为默认情况下您登录为ssm-user,而不是ec2-user。因此要以ec2-user 登录,您可以执行以下命令:

    sudo su - ec2-user
    

    这将使您以ec2-user 登录,获取您的.bashrc 并将您置于/home/ec2-user

    或者,如果您使用EC2 Instance connect,则将ec2-user 指定为默认值,它会正确加载您到/home/ec2-user 并获取您的bash。

    【讨论】:

    • 我将会话管理器更改为使用“运行身份支持”首选项以 ec2 用户身份登录。因此,如果我在连接后立即运行“whoami”,它会告诉我我是“ec2-user”
    • @morras 感谢您告诉我。那么它现在可以工作了吗?
    • 不,这就是问题所在。即使它以 ec2-user 身份登录我,它也不会获取我的任何配置文件。如果我之后手动获取它们或运行bash,那么它可以正常工作。但是为什么它不自己获取配置文件呢?
    • @morras 我明白你现在的意思了。我将尝试启动一个实例并检查其行为。
    • 谢谢@Marcin 我测试了你的方法,如果我使用 EC2 Instance Connect,那么配置文件是有源的,但如果我使用会话管理器,它们不是。我已经用这些信息和屏幕截图更新了我的问题。我将通过 AWS 支持提出这个问题,因为这可能只是一个缺失的功能。
    【解决方案2】:

    AWS Systems Manager Session Manager 使用“代理”建立与 Amazon EC2 实例的连接。代理向 Systems Manager 注册实例。当请求连接时,会向代理发送一条消息。然后将命令发送到代理,代理在本地执行命令并将结果发回。

    因此,会话管理器实际上并未登录到 bash 会话。它只是按照接收到的方式一次执行一个命令。

    Session Manager 的好处是它可以用来连接到私有 EC2 实例,因为代理会建立到 AWS 的“出站”连接,而不是将连接请求发送到“实例”。

    相比之下,

    Amazon EC2 Instance Connect 实际上与实例建立了正常的 SSH 连接。 Web 浏览器使用鳄梨酱连接到 AWS,然后使用普通 SSH(带有额外的 hack 以允许临时密钥对)运行命令。因此,它看起来像是针对 shell 运行的正常连接。

    您实际上可以将 EC2 Instance Connect 的“临时 SSH 密钥”功能与普通 SSH 客户端一起使用,而无需使用基于 Web 的 SSH 客户端。因此,它实际上是两个功能合二为一:基于 Web 的 SSH 客户端,以及使用临时密钥对建立 SSH 连接的方法。

    【讨论】:

    • 谢谢约翰,这解释了它。我测试过,正如您的回答所预期的那样,这也意味着如果安全组上未打开 SSH 端口,您将无法使用 Instance Connect。
    • 正确。安全组需要允许来自 EC2 Instance Connect 服务范围的入站 SSH(不是您自己的 IP 地址)。
    【解决方案3】:

    由于会话管理器实际上并没有登录到 bash 会话,但我们可以通过创建一个自定义的 InteractiveCommands 会话文档来做到这一点,该文档只会切换到 ssm-user bash。步骤如下。

    1. 创建名为“SSM-LogLinuxBash”的 AWS SSM 文档“会话”类型并粘贴以下内容。
       {
          "schemaVersion": "1.0",
          "description": "Document to run single interactive command on an instance",
          "sessionType": "InteractiveCommands",
          "parameters": {
            "logpath": {
              "type": "String",
              "description": "Logged in as bash shell",
              "default": "",
              "allowedPattern": "^[a-zA-Z0-9-_/]+(.log)$"
            }
          },
          "properties": {
            "linux": {
              "commands": "su ssm-user",
              "runAsElevated": true
            }
          }
        }
    
    1. 创建可以访问上述 SSM 文档和 ec2 实例的 IAM 策略。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "SSM-LogLinuxBash-IAMPolicy",
                "Effect": "Allow",
                "Action": "ssm:StartSession",
                "Resource": [
                    "arn:aws:ssm:*:*:document/SSM-LogLinuxBash",
                    "arn:aws:ec2:*:*:instance/<instanceid>or*"
                ]
            },
            {
                "Sid": "TerminateSSM Session",
                "Effect": "Allow",
                "Action": "ssm:TerminateSession",
                "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*"
            }
        ]
    }
    
    1. 将策略附加到 IAM 组或 IAM 用户。
    2. 访问实例
    aws ssm start-session --target <instance-id-here> --document-name SSM-LogLinuxBash
    

    详情请浏览以下博客。 For complete implementation

    【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2020-07-30
    • 2015-05-12
    • 2020-10-11
    • 2021-03-17
    • 2016-12-04
    • 2020-01-12
    • 2020-10-21
    • 2019-12-14
    相关资源
    最近更新 更多