Day14 LinuxCommand2、AWS CLI
Day14 LinuxCommand2、AWS CLI

Day14 LinuxCommand2、AWS CLI

内容纲要

Day14 LinuxCommand2、AWS CLI

回顾

cloudformation暂时告一段落了,之前我们学过Linux一些简单的命令使用,今天是第二弹!( ・∇・)

LinuxCommand

1.echo

echo 是 Linux 中一个常用的命令,它可以用来输出一个字符串或者变量的值。

echo "$A" 这个命令会输出变量 A 的值。在使用 echo 输出变量值时,一定要加上双引号,这样可以避免一些空格等特殊字符导致的问题。

在 Linux 中,echo 命令中使用三种不同符号引用字符串时会有不同的效果:

  • 双引号 (") : 当字符串被引用在双引号中时,会对其中的变量进行替换。如果变量没有被定义,则会保留变量名。

  • 单引号 (‘) : 当字符串被引用在单引号中时,会对其中的所有字符进行转义。变量和命令替换都不会发生。

  • 反引号 (`) : 反引号用来执行命令,并将输出作为字符串。

  • 简单示例:

    A=hello
    echo "A is $A"  # A is hello
    echo 'A is $A'  # A is $A
    echo date    
    

这些引用符号主要用于对字符串进行不同级别的转义,具体应用取决于你需要输出的字符串是否含有变量或特殊字符。

$ 符号是 Linux 中的变量引用符号,用来访问变量的值。当一个变量名紧随其后时,就可以使用这个符号来引用变量的值。

例如:

A=hello
echo "A is $A"  # A is hello

在这个例子中,变量 A 的值是 hello,在使用 echo 命令输出字符串时,变量 A 被引用为其值,最终会输出 "A is hello"。

需要注意的是,只有在双引号或者反引号中才会对变量进行替换,在单引号中会对其中的所有字符进行转义,变量和命令替换都不会发生。

2.find -name命令

find 命令是 Linux 中一个用来查找文件的常用命令。-name 选项是 find 命令的一个子选项,用来指定查找文件的名称模式。

语法格式如下:

find [path] -name [pattern]
  • [path] 是可选的,用来指定查找的起始目录,如果不指定则默认为当前目录。
  • -name 是必须的,用来指定查找文件的名称模式。
  • [pattern] 是必须的,用来指定文件名称的匹配模式。

例如,在当前目录下查找所有后缀为 .txt 的文件,可以使用如下命令:

find . -name "*.txt"

在指定目录下查找文件,可以使用如下命令:

find /home/user -name "*.txt"

find 命令还有很多其他选项,例如 -type, -exec, -user等,可以根据实际需要来选择使用。

需要注意的是,在使用 -name选项时,文件名匹配是大小写敏感的,如果要忽略大小写可以使用 -iname选项。

练习

如果我们后面添加-type d的话就是查找目录,-type f就是查找文件。例如:

[ec2-user@bas ~]$ find -name 54321 -type d

./54321

[ec2-user@bas ~]$ find -name 54321 -type f

-or

我们再看一个

find -name "*.txt" -type f -or -size 0

find -name "*.txt" -type f -or -size 0 这一段命令是在查找当前目录及其子目录中,名称以 .txt 结尾并且类型为普通文件或者大小为0的文件。

  • find -name "*.txt" 表示查找名称以 .txt 结尾的文件。
  • -type f 表示查找类型为普通文件的文件。
  • -or 表示或者的意思
  • -size 0 表示查找大小为0的文件。

这样的话, 整个命令就是在查找当前目录及其子目录中,名称以 .txt 结尾并且类型为普通文件或者大小为0的文件。

需要注意的是,在 find 命令中, -or 会将前面的条件与后面的条件联结在一起,如果你有多个条件需要组合在一起,可以使用 -or 来连接。

-and

-andfind 命令的一个子选项,用来将多个条件组合起来。它的作用类似于 -or , 只是它是将条件连接起来,只有当所有条件都满足时才会返回结果。

语法格式如下:

find [path] (condition1 -and condition2 -and condition3)

例如,在当前目录下查找所有后缀为 .txt 并且大小小于100K的文件,可以使用如下命令:

find . -name "*.txt" -and -size -100k

这条命令就是查找所有在当前目录下的文件中,文件名称是.txt结尾且文件大小小于100KB的文件。

-and选项和-or选项一样,也可以用于多个条件组合在一起,满足所有条件才会返回结果。

-exec

最后再来看个例子:

find -name "*.txt" -exec ls -l {} \;

find -name "*.txt" -exec ls -l {} \; 这一行命令是在查找当前目录及其子目录中,名称以 .txt 结尾的文件,并对查找到的文件执行 ls -l 命令。

  • find -name "*.txt" 表示查找名称以 .txt 结尾的文件。
  • -exec 表示执行下面的命令
  • ls -l 命令用来列出文件详细信息,包括文件权限、所有者、文件大小等信息。
  • {} 表示当前文件的路径
  • \; 表示命令的结束

这样的话整个命令就是在查找当前目录及其子目录中,名称以 .txt 结尾的文件,并对查找到的文件执行 ls -l 命令,显示出这些文件的详细信息。

-exec选项可以用来执行任何命令,不只是ls命令,可以根据需要来替换命令。

注意⚠️; 代表命令的结束,必须要有,否则命令会报错。

还有在-exec后面的命令中, 可能会涉及到对文件的删除,修改等操作,需要格外小心,避免误操作。

-not

在 find 命令中,-not 选项用于排除满足特定条件的文件或文件夹。它可以与其他条件选项(如 -name、-type、-size 等)一起使用。例如,如果要查找当前目录及其子目录中不是 .txt 文件的文件,可以使用如下命令:

find . -not -name "*.txt"

这个命令会在当前目录和它的子目录中查找所有文件,并且排除以.txt结尾的文件。

还有其他用法,比如:

find . -not -type d #查找当前目录及其子目录中不是文件夹的文件
find . -not -size +100k  #查找当前目录及其子目录中文件大小不超过100K的文件

这个-not是取反的意思, 所以在上面的例子中表示不是.txt文件,不是文件夹,文件大小不超过100K

-empty

-emptyfind 命令的一个子选项,用来查找空文件。空文件是指文件大小为0的文件。

语法格式如下:

find [path] -empty
  • [path] 是可选的,用来指定查找的起始目录,如果不指定则默认为当前目录。
  • -empty 是必须的,用来指定查找空文件。

例如,在当前目录下查找所有空文件,可以使用如下命令:

find . -empty

sed命令

sed替换

sed 是一个文本编辑器,用来在 Linux 和 UNIX 系统上对文本文件进行快速编辑。它可以用来执行各种文本操作,如查找、替换、删除、插入等。

语法格式如下:

sed 'command' file
  • command 是要执行的命令,可以是单个或多个命令。
  • file 是要编辑的文件。

例如,将文件 test.txt 中所有的 "hello" 替换成 "hi" 可以使用如下命令:

sed 's/hello/hi/g' test.txt
  • s/hello/hi/g 表示将文件中的所有 hello 替换为 hi。
  • g表示全局替换

如果想删除所有11111的字符串

我们可以输入

sed 's/11111//g' test.txt

sed删除

在 sed 中可以使用 d 命令来删除文件中的某一行。语法格式如下:

sed '{line_number}d' file
  • {line_number} 是要删除的行号
  • d 命令表示删除
  • file 是要编辑的文件

例如,删除文件 test.txt 中第 3 行,可以使用如下命令:

sed '3d' test.txt

如果要删除文件中多行,可以在行号前面加上逗号,如:

sed '3,5d' test.txt

这个命令就是删除文件test.txt中第3行到第5行。

需要注意的是,如果要将删除的操作直接写入文件,可以使用 -i 参数。

sed -i '3d' test.txt

上面这里将会删除 test.txt 文件中第3行,并将删除后的文件内容输出到屏幕上。

注意⚠️:如果不加 -i 参数,sed 命令所做的修改将不会直接写入文件,而是将修改后的结果输出到屏幕上。文件的内容并不会发生改变。

如果想要删除某一行下面 的所有内容可以使用$d

比如我想删除从第5行开始下面的所有内容

sed -i ‘5,$d’ text.txt

sed写入

想要快速写入一段内容

可以这样。

在 sed 中可以使用 i 命令来在文件中插入新的内容。语法格式如下:

sed '{line_number}i\new_content' file
  • {line_number} 是要插入内容的行号
  • i 命令表示插入
  • \new_content 是要插入的内容
  • file 是要编辑的文件

例如,在文件 test.txt 的第3行前插入新内容 “Hello World”, 可以使用如下命令:

sed '3i\Hello World' test.txt

在3i这里,使用i命令和a命令插入新内容的结果是一样的,只是插入的位置不同,i命令是在指定行前插入新内容,a命令是在指定行后添加新内容。

AWS CLI

AWS CLI简介

AWS CLI (Command Line Interface) 是一种命令行工具,可以让用户在本地系统上使用命令行来管理 AWS 资源。可以使用AWS CLI来管理云服务器,数据库,存储,网络等等。它支持各种操作系统,如 Windows, Linux, macOS。AWS CLI可以通过安装软件包或pip进行安装,并使用access keys 认证来使用相应的AWS services。

使用文档:https://docs.aws.amazon.com/cli/latest/reference/

目标:

  1. 使用CLI查询query和filters的区别

  2. 使用CLI创建资源练习用:从vpc到ec2

    (需要的流程和资源数量与网页/vscode相同,是第三种方式)

使用CLI

来我们服务器或者自己电脑

aws --version  #查看版本

sudo yum -y install awscli #如果没有就执行安装

aws configure   #输入后配置下面的信息
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: JSON

配置完成我们开始练习

练习1

  • 查询
aws ec2 describe-subnets --query "Subnets[*].[AvailabilityZone]"
[
    [
        "ap-northeast-1a"
    ], 
    [
        "ap-northeast-1a"
    ], 
    [
        "ap-northeast-1c"
    ], 
    [
        "ap-northeast-1c"
    ], 
    [
        "ap-northeast-1c"
    ], 
    [
        "ap-northeast-1a"
    ]
]

aws ec2 describe-subnets 命令用于查询现有的EC2子网的信息。

--query 是一个选项,它可以用来指定返回结果中需要显示的字段。

"Subnets[*].[AvailabilityZone]" 是一个JMESPath语句,用于指定在返回结果中需要显示的字段。

其中 Subnets[*]表示查询所有的子网, .[AvailabilityZone] 表示子网的AvailabilityZone字段。

所以这个命令将会返回所有子网的AvailabilityZone字段值。

如果你想查询其他字段,可以将AvailabilityZone替换成你想查询的字段名称,比如VpcId, CidrBlock等。

这个命令可以帮助你查询当前VPC中所有子网的AvailabilityZone信息,例如子网所属的可用区。这可以帮助你了解你的资源分布情况,以便了解是否需要做出调整来提高可用性或容错性。

需要注意的是, 这个命令只会返回你有权限查看的所有子网的AvailabilityZone字段值, 如果你需要查询更多的子网信息, 你可以使用其他过滤条件, 比如 –filters, –subnet-ids等.

练习2

如果你想查询VPC的CidrBlock,可以使用 aws ec2 describe-vpcs 命令。

这个命令将会返回所有VPC的信息,其中包括CidrBlock。

你可以使用 --query 选项来缩小返回结果中显示的字段,比如:

aws ec2 describe-vpcs --query 'Vpcs[*].CidrBlock'

这个命令只会返回所有VPC的CidrBlock字段值。

如果你只需要查询一个特定的VPC, 可以使用 –vpc-ids 选项, 比如:

aws ec2 describe-vpcs --vpc-ids vpc-12345678 --query 'Vpcs[*].CidrBlock'

这个命令只会返回vpc-id为vpc-12345678 的VPC的CidrBlock字段值。

需要注意的是, 这些命令只会返回你有权限查看的VPC的信息.

拓展:符号’ . ‘

在JMESPath表达式中, 符号 ‘.’ 代表访问当前对象的子对象。

所以 ‘Vpcs[].CidrBlock’ 中的 ‘.’ 代表访问当前对象(Vpcs[])的子对象CidrBlock。

在这个例子中,Vpcs[*] 代表所有的VPC, .CidrBlock 代表所有VPC的CidrBlock字段。

更一般的来说, 对于一个JMESPath表达式 object.field, 那么object就是你所要查询的对象,field 就是你要查询的字段。

在这种情况下, 你可以用这种方式来查询其他资源的信息, 比如查询某个EC2实例的InstanceType, 某个S3 bucket 的CreationDate等.

–query和 –filters

aws ec2 describe-subnets --filters "Name=availabilityZone,Values=ap-northeast-1c" --query "Subnets[*].[AvailabilityZone]" 

简单来说, –query 是用来缩小返回结果的字段, –filters 是用来缩小返回结果的资源。

它们可以结合使用,来达到更精细的查询和筛选目的,比如你可以使用 –filters 筛选出符合条件的资源,再使用 –query 查询出所需要的字段。

–Output table

aws ec2 describe-subnets --filters "Name=availabilityZone,Values=ap-northeast-1c" --query "Subnets[*].[AvailabilityZone]" --output table

使用Output table

--output 是 AWS CLI 中的一个选项,用于指定 AWS CLI 命令返回结果的输出格式。

其中 table 是一种可用的输出格式之一,它会将返回结果以表格的形式输出。

尝试创建整个资源

截屏2023-01-24 15.41.41

vpc

aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--tag-specifications ‘ResourceType=vpc, Tags=[{Key=Name, Value=qlite-dev-oyb-vpc}]’

subnet

aws ec2 create-subnet \
--vpc-id vpc-0b889e75f86cc788e \
--availability-zone ap-northeast-1a \
--cidr-block 10.0.0.0/24 \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=qlite-dev-oyb-cli-subnet-pub1a}]'
aws ec2 create-subnet \
--vpc-id vpc-0b889e75f86cc788e \
--availability-zone ap-northeast-1a \
--cidr-block 10.0.1.0/24 \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=qlite-dev-oyb-cli-subnet-pri1a}]'
aws ec2 create-subnet \
--vpc-id vpc-0b889e75f86cc788e \
--availability-zone ap-northeast-1c \
--cidr-block 10.0.2.0/24 \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=qlite-dev-oyb-cli-subnet-pub1c}]'
aws ec2 create-subnet \
--vpc-id vpc-0b889e75f86cc788e \
--availability-zone ap-northeast-1c \
--cidr-block 10.0.3.0/24 \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=qlite-dev-oyb-cli-subnet-pri1c}]'

创建IGW和关联VPC

aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=qlite-dev-oyb-cli-igw}]'

关联vpc

aws ec2 attach-internet-gateway \
--vpc-id vpc-0b889e75f86cc788e --internet-gateway-id igw-03d7c1caaa9eb8b3f

创建路由表

aws ec2 create-route-table \
--vpc-id vpc-0b889e75f86cc788e \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=qlite-dev-oyb-route-table-pub}]'
aws ec2 create-route-table \
--vpc-id vpc-0b889e75f86cc788e \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=qlite-dev-oyb-route-table-pri1c}]'
aws ec2 create-route-table \
--vpc-id vpc-0b889e75f86cc788e \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=qlite-dev-oyb-route-table-pri1a}]'

关联路由表

pub1a

aws ec2 associate-route-table \
--route-table-id rtb-029fd146b524e49fa \
--subnet-id subnet-0f98dc9a00319d03d

pri1a

aws ec2 associate-route-table 
--route-table-id rtb-0aa73923b290ec759 
--subnet-id subnet-09d98488a94211481

pub1c

aws ec2 associate-route-table \
--route-table-id rtb-029fd146b524e49fa \
--subnet-id subnet-0ca21d53a79b13a6b

pri1c

aws ec2 associate-route-table \
--route-table-id rtb-09c84b4889053e2d1 \
--subnet-id subnet-00105d9b73879f100

添加路由IGW

pub1a

aws ec2 create-route \
--route-table-id rtb-029fd146b524e49fa \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id igw-03d7c1caaa9eb8b3f

pub1c

aws ec2 create-route \
--route-table-id rtb-029fd146b524e49fa \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id igw-03d7c1caaa9eb8b3f

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注