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
-and
是 find
命令的一个子选项,用来将多个条件组合起来。它的作用类似于 -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
-empty
是 find
命令的一个子选项,用来查找空文件。空文件是指文件大小为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/
目标:
-
使用CLI查询query和filters的区别
-
使用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
是一种可用的输出格式之一,它会将返回结果以表格的形式输出。
尝试创建整个资源
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