运维人员必备的 Mac Zsh 配置技巧

作者:SRE运维博客 博客地址:www.cnsre.cn/ 文章地址:www.cnsre.cn/posts/24102... 相关话题:www.cnsre.cn/tags/aws/

运维人员必备的 Mac Zsh 配置技巧

作为一名运维工程师,我们在日常工作中经常需要与 AWS 打交道。为了提高工作效率,我在 Mac 的 Zsh 中配置了一些实用的函数和别名。今天,我想分享这些配置,并通过实际演示,帮助大家更好地理解和使用它们。

一、简化 EC2 实例类型查询

1.1 使用 ec2spot 快速筛选 Spot 实例

当我们需要根据价格和配置选择合适的 EC2 Spot 实例时,可以使用以下别名:

bash 复制代码
alias ec2spot='ec2-instance-selector -o table-wide --cpu-architecture x86_64 --sort-by spot-price'

演示:

在终端中输入:

bash 复制代码
ec2spot --vcpus 4 --memory 16

这将列出所有具有 4 个 vCPU 和 16 GB 内存的实例类型,并按照 Spot 价格排序,方便我们选择性价比最高的实例。

1.2 使用 ec2type 函数查看实例详细信息

有时候,我们需要深入了解某个实例类型的配置细节。ec2type 函数可以帮助我们快速获取这些信息。

bash 复制代码
ec2type() {
  if [ -z "$1" ]; then
    echo "Usage: ec2type <instance-type>"
    return 1
  fi

  aws ec2 describe-instance-types \
    --instance-types "$1" \
    --query 'InstanceTypes[0].[InstanceType, VCpuInfo.DefaultVCpus, MemoryInfo.SizeInMiB, InstanceStorageInfo, NetworkInfo.NetworkPerformance, ProcessorInfo.SupportedArchitectures]' \
    --output table
}

演示:

在终端中输入:

bash 复制代码
ec2type t3.large

输出:

lua 复制代码
-------------------------
|        DescribeInstanceTypes        |
+--------------+----------------------+
|  InstanceType| t3.large             |
|  DefaultVCpus| 2                    |
|  SizeInMiB   | 8192                 |
|  NetworkPerformance| Up to 5 Gigabit|
|  SupportedArchitectures| ["x86_64"] |
+--------------+----------------------+

通过这个输出,我们可以清楚地看到实例的 CPU、内存、网络性能和支持的架构等信息。

二、便捷的 SSM 会话管理

2.1 使用 ssm 函数快速连接实例

AWS Systems Manager(SSM)允许我们在不使用 SSH 密钥的情况下安全地连接 EC2 实例。下面的 ssm 函数简化了这一过程:

bash 复制代码
function ssm() {
    local instance_id=$1
    aws ssm start-session --target "$instance_id" --region cn-north-1
}

演示:

在终端中输入:

bash 复制代码
ssm i-0abcdef1234567890

这将启动与指定实例的 SSM 会话,方便我们进行远程管理。

2.2 使用 ec2 函数交互式选择并连接实例

为了更方便地查找并连接运行中的 EC2 实例,我们可以使用 ec2 函数:

bash 复制代码
function ec2() {
    local search_term=$1
    # 查询运行中的实例并显示实例ID和Name标签
    local instances
    instances=$(aws ec2 describe-instances \
        --filters "Name=instance-state-name,Values=running" \
        --region cn-north-1 \
        --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value[]]' \
        --output text | grep -i "$search_term")

    if [[ -z "$instances" ]]; then
        echo "未找到与搜索词匹配的运行实例: $search_term"
        return 1
    fi

    # 显示匹配的实例列表并编号
    echo "匹配的实例:"
    local i=1
    while read -r line; do
        echo "$i. $line"
        ((i++))
    done <<< "$instances"

    # 提示用户选择
    local instance_number
    read -p "请输入实例编号以通过 SSM 连接: " instance_number

    # 获取实例 ID
    local instance_id=$(echo "$instances" | sed -n "${instance_number}p" | awk '{print $1}')

    if [[ -z "$instance_id" ]]; then
        echo "无效的选择。"
        return 1
    fi

    echo "正在连接实例 ID: $instance_id"
    ssm "$instance_id"
}

演示:

在终端中输入:

bash 复制代码
ec2 web-server

假设我们有以下运行中的实例:

arduino 复制代码
匹配的实例:
1. i-0abcdef1234567890 Web-Server-1
2. i-0abcdef1234567891 Web-Server-2

然后,输入实例编号:

复制代码
请输入实例编号以通过 SSM 连接: 1

系统将连接到 i-0abcdef1234567890 实例。

三、轻松管理 S3 的 s3 函数

s3 函数提供了对 S3 的常用操作,包括上传、下载、删除和生成签名 URL。

bash 复制代码
function s3() {
    local operation="$1"
    shift 1  # 移除第一个参数,剩下的参数重新编号

    case "$operation" in
        up)  # 上传文件
            local bucket_name="$1"
            local local_file_path="$2"

            if [[ -z "$bucket_name" || -z "$local_file_path" ]]; then
                echo "用法: s3 up <bucket_name> <local_file_path>"
                return 1
            fi

            if [[ ! -f "$local_file_path" ]]; then
                echo "本地文件 $local_file_path 不存在。"
                return 1
            fi

            local object_key="$(basename "$local_file_path")"

            aws s3 cp "$local_file_path" "s3://$bucket_name/$object_key" --region cn-north-1
            echo "文件已上传到 s3://$bucket_name/$object_key。"
            ;;
        down)  # 下载文件
            local s3_path="$1"
            local local_file_path="$2"

            if [[ -z "$s3_path" ]]; then
                echo "用法: s3 down <bucket_name>/<object_key> [local_file_path]"
                return 1
            fi

            local bucket_name="${s3_path%%/*}"
            local object_key="${s3_path#*/}"

            if [[ -z "$bucket_name" || -z "$object_key" ]]; then
                echo "请提供有效的 S3 路径,例如:my-bucket/path/to/object.txt"
                return 1
            fi

            if [[ -z "$local_file_path" ]]; then
                local_file_path="$(basename "$object_key")"
            fi

            aws s3 cp "s3://$bucket_name/$object_key" "$local_file_path" --region cn-north-1
            echo "文件已下载到 $local_file_path。"
            ;;
        del)  # 删除文件
            local s3_path="$1"

            if [[ -z "$s3_path" ]]; then
                echo "用法: s3 del <bucket_name>/<object_key>"
                return 1
            fi

            local bucket_name="${s3_path%%/*}"
            local object_key="${s3_path#*/}"

            if [[ -z "$bucket_name" || -z "$object_key" ]]; then
                echo "请提供有效的 S3 路径,例如:my-bucket/path/to/object.txt"
                return 1
            fi

            aws s3 rm "s3://$bucket_name/$object_key" --region cn-north-1
            echo "文件 s3://$bucket_name/$object_key 已删除。"
            ;;
        url)  # 生成限时5分钟的签名URL
            local s3_path="$1"

            if [[ -z "$s3_path" ]]; then
                echo "用法: s3 url <bucket_name>/<object_key>"
                return 1
            fi

            local bucket_name="${s3_path%%/*}"
            local object_key="${s3_path#*/}"

            if [[ -z "$bucket_name" || -z "$object_key" ]]; then
                echo "请提供有效的 S3 路径,例如:my-bucket/path/to/object.txt"
                return 1
            fi

            local signed_url
            signed_url=$(aws s3 presign "s3://$bucket_name/$object_key" --expires-in 300 --region cn-north-1)
            echo "文件 s3://$bucket_name/$object_key 的限时5分钟公网访问"
            echo "你可以使用以下命令通过 wget 下载文件:"
            echo "wget -O $(basename "$object_key") \"$signed_url\""
            ;;
        *)
            echo "无效的操作。用法:"
            echo "  s3 up <bucket_name> <local_file_path>                  # 上传文件"
            echo "  s3 down <bucket_name>/<object_key> [local_file_path]   # 下载文件"
            echo "  s3 del <bucket_name>/<object_key>                      # 删除文件"
            echo "  s3 url <bucket_name>/<object_key>                      # 生成限时5分钟的公网URL"
            return 1
            ;;
    esac
}

3.1 上传文件到 S3

演示:

bash 复制代码
s3 up my-bucket /path/to/file.txt

输出:

arduino 复制代码
文件已上传到 s3://my-bucket/file.txt。

3.2 从 S3 下载文件

演示:

bash 复制代码
s3 down my-bucket/path/to/file.txt /local/path/file.txt

输出:

lua 复制代码
文件已下载到 /local/path/file.txt。

3.3 删除 S3 中的文件

演示:

bash 复制代码
s3 del my-bucket/path/to/file.txt

输出:

ruby 复制代码
文件 s3://my-bucket/path/to/file.txt 已删除。

3.4 生成限时访问的签名 URL

演示:

bash 复制代码
s3 url my-bucket/path/to/file.txt

输出:

ruby 复制代码
文件 s3://my-bucket/path/to/file.txt 的限时5分钟公网访问
你可以使用以下命令通过 wget 下载文件:
wget -O file.txt "https://s3.cn-north-1.amazonaws.com.cn/my-bucket/path/to/file.txt?AWSAccessKeyId=..."

四、总结

通过这些实用的 Zsh 配置,我们可以大大提升在命令行中操作 AWS 资源的效率。不再需要繁琐的命令输入,也不必记住复杂的参数。只需简单的函数调用,我们就能完成日常的运维任务。

如果你也有自己的小妙招,欢迎分享出来,一起交流,共同进步!

让我们一起高效运维,享受命令行的乐趣吧!


作者:SRE运维博客 博客地址:www.cnsre.cn/ 文章地址:www.cnsre.cn/posts/24102... 相关话题:www.cnsre.cn/tags/aws/

相关推荐
无责任此方_修行中24 分钟前
我的 2025:写了 48 期周刊、上线 2 款产品、减重 9 公斤
程序员·年终总结
知其然亦知其所以然2 小时前
别再死记硬背了,一篇文章搞懂 JS 乘性操作符
前端·javascript·程序员
宁在春2 小时前
【2025 年终总结】人好像真的只活那么几个瞬间
后端·程序员·年终总结
SimonKing2 小时前
你的网站SSL证书又要过期了?这个工具能让你永久告别焦虑
java·后端·程序员
知识浅谈3 小时前
只需一个域名,零成本拥有无限个自定义邮箱
程序员
行百里er15 小时前
我为自己起了个笔名
程序员
程序员鱼皮18 小时前
从夯到拉,锐评 39 个前端技术!
前端·程序员·编程语言
无限大620 小时前
为什么"DevOps"能提高软件开发效率?——从开发到运维的融合
后端·程序员·架构
Goboy1 天前
贷款上班的我与AI同行的日子
人工智能·机器学习·程序员