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"
}
]
}
]
}
根据上面的结果,您可以使用 Name
、Description
或 Tags
(如果已设置)的值来决定下一步要做什么。
如果您不想依赖 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
我知道这是实现此目的的一种相对初级的方法,但它适合我在时间紧迫时的需要。稍后我会评估更有效的选择!
感谢您的帮助!
我正在尝试编写一个脚本来安装可靠的代理。它每小时运行一次维护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"
}
]
}
]
}
根据上面的结果,您可以使用 Name
、Description
或 Tags
(如果已设置)的值来决定下一步要做什么。
如果您不想依赖 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
我知道这是实现此目的的一种相对初级的方法,但它适合我在时间紧迫时的需要。稍后我会评估更有效的选择!
感谢您的帮助!