AWS - 在 Linux 中区分 OSTYPE

AWS - Differentiate OSTYPE in Linux

我正在尝试编写一个脚本来安装可靠的代理。它每小时运行一次维护window,如果代理已经存在,它将跳过安装。我目前有 2 个任务,一个用于 RHEL,一个用于 Amazon Linux 2,但是 RHEL 出于某种原因一直失败,所以我想将脚本换成 linux 一个只包含 RHEL。

问题是,Amazon Linux 和 RHEL 在使用 uname (Linux) 和 $OSTYPE (linux-gnu) 时都返回非常相似的信息,但每个都需要不同的 Nessus 文件:

亚马逊 Linux 2 要求 - “NessusAgent-8.2.0-amzn.x86_64.rpm”
Redhat EL 8 需要 - “NessusAgent-8.2.0-es8.x86_64.rpm”

有谁知道区分的好方法吗?

这是我目前所拥有的。我交换了 OSTYPE 值以显示我需要的内容:

serviceName="nessusagent"

if systemctl --all --type service | grep -q "$serviceName";then
    echo "$serviceName exists."
else
    if [[ "$OSTYPE" == "Amazon Linux 2"* ]]; then
        wget "https://lmi-infosec-tenable.s3.amazonaws.com/NessusAgent-8.2.0-amzn.x86_64.rpm" -P /tmp/nessus/
        sudo rpm -ivh /tmp/nessus/NessusAgent-8.2.0-amzn.x86_64.rpm
        sudo /sbin/service nessusagent start
        sudo /opt/nessus_agent/sbin/nessuscli agent link --key=<key_value>--groups=<groups> --cloud
    else [[ "$OSTYPE" == "Redhat Enterprise Linux 8"* ]]; then
        mkdir /tmp/nessus/
        curl "https://lmi-infosec-tenable.s3.amazonaws.com/NessusAgent-8.2.0-es8.x86_64.rpm" --output /tmp/nessus/NessusAgent-8.2.0-es8.x86_64.rpm --silent
        sudo rpm -ivh /tmp/nessus/NessusAgent-8.2.0-es8.x86_64.rpm
        sudo /sbin/service nessusagent start
        sudo /opt/nessus_agent/sbin/nessuscli agent link --key=<key_value>--groups=<groups> --cloud
    fi
fi

假设您的 EC2 实例使用正确 tagged/named 的 AMI,您可以通过将 EC2 实例元数据与 AWS CLI 结合使用来告诉 OS(最后一个是可选的)。

第一步,您可以向 Instance Metadata endpoint 发出请求以检索 AMI ID:

curl http://169.254.169.254/latest/meta-data/ami-id

此时,您可以像这样使用 AWS CLI 的 describe-images 命令:

aws ec2 describe-images --image-ids ami-1234567890EXAMPLE

这会 return 像这样:

{
    "Images": [
        {
            "VirtualizationType": "hvm",
            "Description": "Provided by Red Hat, Inc.",
            "PlatformDetails": "Red Hat Enterprise Linux",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "State": "available",
            "SriovNetSupport": "simple",
            "ImageId": "ami-1234567890EXAMPLE",
            "UsageOperation": "RunInstances:0010",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "SnapshotId": "snap-111222333444aaabb",
                        "DeleteOnTermination": true,
                        "VolumeType": "gp2",
                        "VolumeSize": 10,
                        "Encrypted": false
                    }
                }
            ],
            "Architecture": "x86_64",
            "ImageLocation": "123456789012/RHEL-8.0.0_HVM-20190618-x86_64-1-Hourly2-GP2",
            "RootDeviceType": "ebs",
            "OwnerId": "123456789012",
            "RootDeviceName": "/dev/sda1",
            "CreationDate": "2019-05-10T13:17:12.000Z",
            "Public": true,
            "ImageType": "machine",
            "Name": "RHEL-8.0.0_HVM-20190618-x86_64-1-Hourly2-GP2",
            "Tags": [
              {
                 "OS": "RHEL"
              }
            ]
        }
    ]
}

根据上面的结果,您可以使用 NameDescriptionTags(如果已设置)的值来决定下一步要做什么。

如果您不想依赖 AWS CLI(或管理描述图像的权限),您可以简单地在 S3 上保留一个配置文件(您已经在使用它来检索文件),其中包含一个列表AMI ID 并获得相同的结果。

作为更新。我发现最简单的区分方法实际上是使用 wget 工具。它在 AL2 上是本机的,但在 RHEL 8 上你必须安装它,所以我修改了脚本以实质上尝试使用 wget 检索文件,如果失败,则它继续 curl 并下载 RHEL代理文件。完成的脚本如下所示:

serviceName="nessusagent"

if systemctl --all --type service | grep -q "$serviceName";then
    echo "$serviceName exists."
else

    wget "https://<bucket-name>/NessusAgent-8.2.0-amzn.x86_64.rpm" -P /tmp/nessus/

    if [ $? -ne 0 ] then

        mkdir /tmp/nessus/

        curl "https://<bucket-name>/NessusAgent-8.2.0-es8.x86_64.rpm" --output /tmp/nessus/NessusAgent-8.2.0-es8.x86_64.rpm --silent

        sudo rpm -ivh /tmp/nessus/NessusAgent-8.2.0-es8.x86_64.rpm

        sudo /sbin/service nessusagent start

        sudo /opt/nessus_agent/sbin/nessuscli agent link --key=<key>--groups=<groups> --cloud
   
    else

        sudo rpm -ivh /tmp/nessus/NessusAgent-8.2.0-amzn.x86_64.rpm

        sudo /sbin/service nessusagent start

        sudo /opt/nessus_agent/sbin/nessuscli agent link --key=<key>--groups=<groups> --cloud

    fi
fi

我知道这是实现此目的的一种相对初级的方法,但它适合我在时间紧迫时的需要。稍后我会评估更有效的选择!

感谢您的帮助!