本文正在参加「金石计划 . 瓜分6万现金大奖」
各个厂商会制作自己的发行版本
linux内核 kernel,不同厂家会根据内核发布不同的版本。
- redhat 收费版本。
- CentOS 就是redhat开源版本。但是功能较少。
- ubuntu 桌面系统。
- fedora redhat测试版本,具有很多新的特性。
Linux与Windows的不同
-
Linux严格区分大小写。
-
Linux中所有的内容以文件形式保存,包括硬件、用户和文件。
-
Linux不靠扩展名区分文件类型,是靠权限来区分,但是有一些约定的扩展名,是给管理员看的。
- 压缩包
.gz
.bz2
.tar.bz2
.tgz
- 二进制文件
.rpm
- 网页文件
.html .php
- 脚本文件
.sh
- 配置文件
.conf
- 压缩包
-
Windows下的程序不能直接在Linux中安装和运行。
-
Linux更多使用字符界面。
-
占用的系统资源更少
-
减少了出错和被攻击的可能性,会让系统更稳定
-
磁盘分区
- 磁盘分区是使用分区编辑器在磁盘上划分几个逻辑部分。
- 磁盘一旦划分成多个分区,不同类的目录与文件可以存储进不同的分区内。
- 分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以一个硬盘最多只能分四个一级分区,又叫做主分区。
扩展分区
随着硬盘越来越大,四个主分区已经不够了,需要更多地分区,规定有且仅有一个主分区可以被定义为扩展分区。就是在主分区中再进行划分,叫做逻辑分区。逻辑分区最多有23个。
注意这个扩展分区中不能存放数据,只能划分逻辑分区。 所以主分区加逻辑分区最多只能划分26个。
MBR(主引导记录 ):读取磁盘的前512个字节。VBR(卷引导记录):读取操盘其中一个分区的第一个扇区。
格式化
- 格式化是指用户选定的文件系统(如FAT16(2G), FAT32(4G),NTFS,EXT2,EXT3,EXT4)对分区进行划分。
- 目的是更好的写入和读取数据。
挂载点
- 为了让Linux系统中可以访问这些 分区,需要把这些分区挂载到对应的目录上
- 在Linux中是把目录称为
挂载点
- 把目录和分区链接在一起的过程成为
挂载
/
为根目录,必须挂载到一个分区上,默认所有子目录都会写入这个分区- 同一级目录下面的所有子目录可以有自己的独立存储空间
- 必须有的分区
- / 根分区
- swap分区(交换分区,虚拟内存,一般为内存的2倍,不要超过2G)
- 推荐分区
- /boot (启动分区,200M) 单独分区,避免分区写满造成系统无法启动
虚拟机
- 可以在现有的操作系统上虚拟出一个新的硬件环境。
- 相当于模拟出一台新的个人电脑。
- 可以实现在一台机器上真正同时运行两个独立的操作系统。
虚拟机的主要特点
- 不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统
- 本机系统可以与虚拟机系统网络通信
- 可以设定并且随时修改虚拟机操作系统的硬件环境
- 系统快照可以方便备份和回滚
网络链接
- 虚拟机网卡-查看网络属性
- Vmware Virtual Ethernet Adapter For VMnet1
- Vmware Virtual Ethernet Adapter For VMnet8
- 网络连接
- 桥接 直接连接到物理网络,会占用一个局域网内的真实IP地址,优先选择桥接
- NAT 使用已共享的主机IP地址,可以上网,利用VMnet8网卡通信。间接和其他主机通信。
- Host-Only 与主机共享一个私有网络,只能本机使用,利用VMnet1进行通信,不能上网。不能和其他主机通信。只能和宿主主机通信。
linux常见命令
// 修改密码
sudo passwd
// 切换root用户
su
// 编辑文件
vi
// 查看文件内容
cat
// 退出并保存
:x
ls
- 查询目录中的内容
- ls [选项] [文件或者目录]
- 选项
- -a 显示所有文件,包括隐藏文件
- -l 显示详细信息
- -d 查看目录本身的属性而非子文件 ls /etc/
- -h 人性化的方式显示文件大小
- -i 显示inode,也就是i节点,每个节点都有ID号
drwxr-xr-x | . | 1 | root | root | 800 | Sep 16 00:19 | logs |
---|---|---|---|---|---|---|---|
文件类型和权限 | ACL权限 | 硬链接引用计数 | 所有者 | 所属组 | 文件大小 | 最后修改时间 | 文件名 |
- 文件类型和权限
-rw-r--r-- // 三个权限分别代表u, g, o
- 文件类型 - 文件、d 目录、l 软链接文件
- u(所有者)、g(所属组)、o(其他人)
- r(read) 读取、w(write) 写入、x(execute) 执行
- 默认当前目录下的文件列表
文件处理命令
mkdir
- 建立目录 make directory
- mkdir -p [目录名]
- -p 递归创建
cd
- 切换所在目录 change directory
- cd [目录]
- ~ 家目录
- . 当前目录
- .. 上级目录
- 相对路径是参照当前所在目录
- 绝对路径是从根目录开始
- 按TAB键可以补全命令和目录
pwd
- 显示当前目录 pwd
rmdir
- 删除目录 remove empty directory, 能删除空文件夹。
- rmdir [目录名]
rm
- 删除文件或者目录 remove。 默认只能删除文件,如果想要删除文件夹需要携带参数
-r
- rm [文件或者目录]
- -r 删除目录
- -f 强制删除
- rm -rf [文件或者目录] 递归强制删除所有目录
cp
- 默认只能拷贝文件,想要拷贝文件夹需要加
-r
参数。 - copy [源文件或者目录] [目标文件]
- -r 复制目录,默认是复制文件
- -p 连带文件属性复制
- -d 若源文件是链接文件,则复制连接属性
- -a 相当于 -rpd
mv
- 移动文件或者改名 move
- mv [源文件或者目录] [目标文件]
ln
- 链接命令,生成链接文件
link
硬链接特征
- 拥有相同的i节点和存储block块,可以看作是同一个文件
- 可以通过i节点访问
- 不能跨分区
- 不能针对目录使用
- 一般不使用
软链接特征
- ln -s [源文件] [目标文件]
- -s 创建软链接
- 类似Windows快捷方式
- 软链接拥有自己的i节点和Block块,但是数据块中只保存源文件的文件名和i节点号,并没有实际的文件数据
- lrwxrwxrwx l 软链接 软链接的文件权限都是 777
- 修改任意一个文件,另一个都会改变
- 删除源文件,软链接不能使用
- 软链接源文件必须写绝对路径
文件搜索命令
locate
需要安装 yum -y install mlocate
,然后执行updatedb
命令就可以使用了。
whereis
- 搜索命令所在路径以及帮助文档所在位置
- whereis 命令名
whereis ls
- -b 只查找可执行文件
- -m 只查找帮助文件
which
- 可以看到别名
which ls
- 能看到的都是外部安装的命令
- 无法查看Shell自带的命令,如
which cd
find
- find [搜索范围] [搜索条件]
帮助命令
man ls
压缩与解压缩命令
.zip
.gz
.bz2
.tar.gz
.tar.bz2
zip格式
-
压缩文件 zip 压缩文件名 源文件
-
压缩目录
zip -r 压缩文件名 源目录
-
解压
unzip 压缩文件名
gzip
高压,将文件压缩的更小。只能压缩文件,不能压缩文件夹。并且默认源文件会被删除。
命令 | 示例 | 含义 |
---|---|---|
gzip 源文件 | gzip a.txt | 压缩为.gz格式的压缩文件,源文件会消失 |
gzip -c 源文件 > 压缩文件 | gzip -c yum.txt > yum.txt.gz | 压缩为.gz格式的压缩文件,源文件不会消失 |
gzip -r 目录 | gzip -r xx | 压缩目录下的所有子文件,但是不压缩目录 |
gzip -d 压缩文件名 | gzip -d yum.txt.gz | 解压缩文件,不保留压缩包 |
gunzip 压缩文件 | gunzip yum.txt.gz | 解压缩文件,不保留压缩包 |
gzip与zip压缩对比
.bz2格式压缩
压缩能力更强的压缩程序。**bzip2 不能压缩目录。 **
命令 | 示例 | 含义 |
---|---|---|
bzip2 源文件 | bzip2 1.txt | 压缩为.bz2格式的文件,不保留源文件 |
bzip2 -k 源文件 | zip2 -k 1.txt | 压缩为.bz2格式的文件,保留源文件 |
bzip2 -d 压缩文件名 | bzip2 -d 1.txt.bz2 | 解压压缩包 |
bunzip2 压缩文件名 | bunzip2 1.txt.bz2 | 解压压缩包 |
tar
打包命令,只打包不压缩。然后就可以使用高压缩比的压缩程序对该打包后的文件进行压缩了。
tar -cvf 打包文件名 源文件
- -c 打包
- -v 显示过程
- -f 指定打包后的文件名
tar -cvf book.tar book
gzip book.tar
bzip2 book.tar
- x 解打包
tar -xvf book.tar
tar.gz压缩格式
-c
:压缩文件, -x
:解压文件。
命令 | 示例 | 含义 |
---|---|---|
tar -zcvf 压缩包名 .tar.gz 源文件 | tar -zcvf book.tar.gz book | 可以先打包为.tar 格式,再压缩为.gz 格式 |
tar -zxvf 压缩包名.tar.gz | tar -zxvf book.tar.gz | 解压tar.gz压缩包 |
tar -jcvf 压缩包名 .tar.bz2 源文件 | tar -zcvf .tar.bz2 book | 可以先打包为.tar 格式,再压缩为.bz2 格式 |
tar -jxvf 压缩包名.tar.bz2 | tar -zxvf book.tar.bz2 | 解压tar.bz2压缩包 |
关机和重启命令
shutdown
shutdown 关机命令
-
-c 取消前一个关机命令
-
-h 关机
-
-r 重启。指定多长时间重启。
shutdown -r 06:00 shutdown -c
init
关机
init 0
重启
init 6
系统的运行级别
- 0 关机
- 1 但用户
- 2 不 完全多用户,不包含NFS服务
- 3 完全多用户
- 4 未分配
- 5 图形界面
- 6 重启
logout
退出登录
查看登录用户信息
- w 查询登录用户信息,比较详细。
- who 查询的信息比w少。
- last 查询登录历史。默认读取
/var/log/wtmp
文件。 - lastlog 查看所有用户的最后一次登录时间。
文件查看命令
-
cat 命令用于连接文件并打印到标准输出设备上。
cat -n a.txt // 输出内容标记行号。
-
more
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
more a.txt
-
head 用来显示开头某个数量的文字区块.
head -n a.txt // 指定行数显示
-
tail 用来显示最后数量行数的文本。
- -f 循环读取。当文件发生变化的时候,将会自动读取。
- -n<行数> 显示文件的尾部 n 行内容
tail -n a.txt tail -f a.log
通过head, tail可以分页查取内容。
eg: 每页查询五条,查找第二页。
head -10 filename | tail -5
vi
VI visual interface, 可视化接口。类似与windows中的记事本,vim支持多级撤销,跨平台,语法高亮,支持图形界面。
vi常用指令
操作模式
模式名 | 含义 |
---|---|
命令模式 | 等待输入的模式 |
输入模式 | 编辑模式,用于输入文本 |
底行(尾行、末行)模式 | 可以输入指令,搜索,保存 |
打开文件
- 输入
vi 文件名
可以进入这个模式 - vimtutor
命令 | 含义 |
---|---|
vim 文件名 | 打开文件定位到第一行 |
vim + 文件名 | 打开文件定位到最后一行 |
vim +2 文件名 | 打开文件定位到第三行,如果没有这么多行定位到最后一行 |
底行模式(结束输入)
命令 | 含义 |
---|---|
:w | 把写入保存到硬盘中 |
:q | 退出当前VI编辑器打开的文件 |
:wq! | 强制保存 |
:数字 | 快速当位到当前文件的第几行 |
/xxx | 从光标位置开始向后搜索 xxx 字符串 |
?xxx | 从光标位置开始向前搜索 |
命令模式(非输入模式)
光标
命令 | 含义 |
---|---|
h | 光标左移 |
j | 光标下移 |
k | 光标上移 |
l | 光标右移 |
翻页
命令 | 含义 |
---|---|
ctrl+f | 向下翻页 |
ctrl+b | 向上翻页 |
ctrl+d | 向下翻半页 |
ctrl+u | 向上翻半页 |
插入类
命令 | 含义 |
---|---|
i | 在当前位置插入 |
a | 在当前光标右边插入 |
A | 在当前光标右的行末插入文件 |
o | 在光标所在行的下方插入一行并切换到输入模式 |
O | 在光标所在行的上方插入一行并切换到输入模式 |
s | 删除当前光标位置并插入 |
删除类
命令 | 含义 |
---|---|
x | 删除当前字符 |
dw | 从当前光标当前位置直到单字/单字末尾,包括空格 |
de | 从当前光标当前位置直到单字/单字末尾,但是不包括空格 |
d$ | 从当前光标当前位置删除到当前行末 |
行删除类
命令 | 含义 |
---|---|
dd | 删除光标所在行 |
2dd | 删除光标2行 |
撤销
命令 | 含义 |
---|---|
u | 撤消最后执行的一次命令 |
U | 恢复该行的原始状态 |
CTRL-R | 恢复重做命令 |
剪切类
命令 | 含义 |
---|---|
dd | 删除光标所在行 |
yy | 复制光标所在的行 |
p | 在光标所在行的下方粘贴 |
P | 在光标所在行的上方粘贴 |
替换类
命令 | 含义 |
---|---|
r | 替换当前位置字符 |
cw | 修改单词 |
c$ | 修改当前位置到行尾 |
跳转指定行
命令 | 含义 |
---|---|
CTRL-g | 显示当前编辑文件中当前光标所在行位置以及文件状态信息 |
SHIFT-G | 当前光标跳到文件中的文件最后一行 |
number SHIFT-G | 先输入数字再按SHIFT+G则当前光标跳到文件中的文件对应数字的行 |
搜索
命令 | 含义 |
---|---|
/ | 输入/可以在当前的文件中查找该字符串 |
n | 查找下一个 |
Shift-N | 查找上一个 |
? | 逆向查找字符串 |
shift+% | 可以将光标移动到匹配的括号上 |
shift+$ | 可以将光标移动到行尾 |
修正错误
命令 | 含义 |
---|---|
:s/old/new | 把光标所在行的old替换成new |
:s/old/new/g | 把所有行的old替换成new |
键位图
shell
- shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序
- 用户可以用Shell来启动、挂起、停止或者编写一些程序
- Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。
- Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
echo
输出命令。
-e 支持反斜线控制的字符转换。
echo -e "\na\nb"
编写执行shell
// hello.sh
#!/bin/bash
echo -e "\e[1;34m hello world \e[0m"
执行
bash hello.sh
别名
alias可查看别名列表。临时生效。
设置别名的格式
alias rm="rm -i"
因为别名设置是临时的,所以可以写入环境变量配置文件 vi ~/.bashrc
,并执行source ~/.bashrc
, 让其永久生效。
unalias 别名 删除别名
命令的生效顺序
- 绝对路径或者相对路径
- 别名
- bash内部命令
- 按照$PATH环境变量定义的目录查找顺序找到的第一个命令
历史命令
-
history
- -c 清空历史命令
- -w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history中。
-
默认保存1000条 /etc/profile HISSIZE=10000
管道符号
多命令顺序执行
|多命令执行符 | 格式 | 作用 | 案例 |
|;
|命令1;命令2| 多个命令执行,命令之间没有任何逻辑联系 | echo 1;echo 2;|
|&&
| 命令1&&命令2 | 逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行 | ecgo1&&echo2|
|||
| 命令1||
命令2|逻辑或 当命令1执行不正确,则命令2才会执行 当命令1正确执行,则命令2不会执行|echo 1;\echo2|
管道符号
- 命令1的正确输出会作为命令2的操作对象
- 命令1|命令2
ls /etc/ | more netstat -an | grep ESTABLISHED | wc -l
其它符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如$和`都没有特殊含义 |
"" | 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` \ 例外,拥有调用变量值,引用命令和转义的含义 |
`` | 反引号,扩起来的是系统命令,比如ls 查看当前文件夹文件 |
$() | 和反引号一样 |
# | 在shell脚本中,#开头的行代表注释 |
$ | 用于调用变量的值 |
\ | 转义符号 |
变量的分类
- 字符串
- 整型
- 浮点型
- 日期型
用户自定义变量
变量名不能为数字开头,等号左右两边不能有空格。
name="zh"
echo $变量名 // 输出变量值
// 获取变量进行计算
"$y"
${y}
查看,删除系统变量
- set 查询系统中默认所有已经生效的变量,包括系统变量,也包括自定义变量
- unset 删除变量。
unset a
环境变量
默认情况下,用户设置的变量只在当前shell下生效。但是环境变量会在当前shell以及子shell下生效,他是全局变量。
// export 变量名=变量值
export envname=prod
// 添加临时路径到环境变量中
export PATH="$PATH":/root/myshell //临时生效
env
仅仅用来查看环境变量,而不看到本地变量(用户自定义变量)。这是和set的不同。
位置变量参数
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
位置参数变量 | 作用 |
---|---|
$n | n为数字,1-{10} |
$* | 这个变量代表命令中所有的参数,$*把所有的变看数看成一个整体。把所有参数放在一个字符串中用空格隔开。 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数进行区分。把参数一个一个拿出来。 |
$# | 这个变量代表命令行中所有参数的个数 |
#!/bin/bash
num1=$1
num2=$2
sum=$((num1+num2))
echo $sum
#!/bin/bash
for i in "$@"
do
echo "i=$i"
done
read
表示读取用户输入的信息到一个变量中。类似于命令行窗口的交互。 read [选项] [变量名]
选项 | 含义 |
---|---|
-p | 提示信息,在等待read输入时,输出提示信息 |
-t | 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间 |
-n | 字符数,read命令只接受指定的字符数,就会执行 |
-s | 隐藏输入的数据,适用于机密信息的输入 |
#!/bin/bash
read -p 'please input your name:' -t 5 name
echo -e "\n"
read -p 'please input you gender[m/f]:' -n 1 gender
echo -e "\n"
read -p 'please input your password:' -s password
echo -e "\n"
echo $name,$gender,$password
运算符
declare命令
用来声明变量类型
- declare [+/-] [选项] 变量名
选项 | 含义 |
---|---|
- | 给变量设定类型属性 |
+ | 取消变量的类型属性 |
-a | 将变量声明为数组类型 |
-i | 将变量声明为整数型(integer) |
-x | 将变量声明为环境变量 |
-r | 将变量声明为只读变量 |
-p | 显示指定变量的被声明的类型 |
[lighthouse@VM-16-8-centos ~]$ declare -i a
[lighthouse@VM-16-8-centos ~]$ a=1
[lighthouse@VM-16-8-centos ~]$ declare -i b
[lighthouse@VM-16-8-centos ~]$ b=2
[lighthouse@VM-16-8-centos ~]$ echo $a+$b
1+2
[lighthouse@VM-16-8-centos ~]$ declare -i c=$a+$b
[lighthouse@VM-16-8-centos ~]$ echo $c
3
[lighthouse@VM-16-8-centos ~]$
数值运算的方法
num1=1
num2=3
s=$(expr $num1 + $num2) // 方法一
s=$(($num1+$num2)) // 方法二
s=$[$num1+$num2] // 方法三
环境变量配置文件
source 命令
- 修改完配置文件后,必须注销重新登录才能生效,使用source命令可以不用重新登录
- source 和
.
是一样的。
环境变量配置文件简介
- PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
- 环境变量配置文件中主要是定义地系统操作环境生效的系统默认环境变量,如PATH等 此下文件登录时起作用的环境变量
路径 | 说明 |
---|---|
/etc/profile | |
/etc/profile.d/*.sh | |
/etc/bashrc | |
~/.bash_profile | 只会对当前用户生效 |
~/.bashrc | 只会对当前用户生效 |
环境变量配置文件的功能
/etc/profile
,在这里修改系统变量。~/.bash_profile
,在这里修改PATH路径,内部调用~/.bashrc
~/.bashrc
, 配置alias 改别名在这里,内部调用/etc/bashrc
/etc/bashrc
, PS1 登录提示符、umask、PATH变量在这里修改,内部调用/etc/profile.d/*.sh
- 其它配置文件
- 注销时生效的环境变量配置文件,
~/.bash_logout
- 脚本历史,历史记录命令会写入该文件
~/.bash_history
- 注销时生效的环境变量配置文件,
函数
可以直接定义函数,也可以通过function
关键字定义函数。
function fn() {}
fn() {}
给函数传递参数,多个参数通过空格分隔。
fn params1 params2
获取参数的说明
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
>function fn() {
> res=0
> res=$[$1+$2]
> echo $res # 3
> return $res
> }
fn 1 2
我们可以使用local定义局部变量,local只能用在一个函数中。
$-的介绍
打印当前shell的选项
echo $-
# himBHs
$-
记录着当前设置的shell选项,himBH
是默认值,你可以通过 set 命令来设置或者取消一个选项配置。例如:
set -x
- 这个可以打开 shell 的调试开关,调试 shell 脚本非常有用,这个时候再检查下 $- 变量的值,可以看到多了 x 字符:
echo $-
+ echo himxBHs
# himxBHs
上述选项的意思
查看当前 shell 的选项配置
set -o
i - interactive
包含这个选项说明当前的 shell 是一个交互式的 shell。
何为交互式?你输入命令,shell 解释执行后给你返回结果,我们在 Terminal 下使用的 shell 就是交互式的 如果我们在一个脚本里面 echo $-,结果是不会包含 i 的
H - history expand
history expand 就是展开历史列表中的命令,可以通过!感叹号来完成,例如"!!"返回上最近的一个历史命令,"!n"返回第 n 个历史命令,等等
B - brace expansion
大括号扩展,是可以让bash生成任意字符串的一种扩展功能。
echo g{a,b,c}$
m - monitor mode
- 打开监控模式,可以控制进程的停止、继续,后台或者前台执行
- 正常情况下,在交互式模式下,该选项默认是打开的,所以再执行一个比较耗时的命令时,你可以按下
CTRL+Z
让它在后台运行,然后可以用fg
命令将后台运行的任务恢复到前台执行
sleep 10s
h - hashal
Remember the location of commands as they are looked up for execution. This is enabled by default. 记录命令的位置
删除
从左往右看,删除掉 $-
变量的值中第一个 i
字符以及之前的内容。
${-#*i}
%与#号的意义刚好相反,从右往左看,删除掉 $- 变量的值中最后一个 i 字符以及之后的内容。
${-%i*}
shell练习
获取随机8位字符串
echo $RANDOM | md5sum | cut -c 1-8
cat /proc/sys/kernel/random/uuid | cut -c 1-8
获取随机8位数字
echo $RANDOM |cksum|cut -c 1-8
date +%N | cut -c 1-8
批量创建用户
错误版本
#!bin/bash
USER_FILE=user.txt
for USER in dev{1..5}; do
# 判断用户是否存在,把日志输入到空文件中
if ! id $USER &>/dev/null ;then
useradd $USER # 创建用户
PASS=$RANDOM|md5sum|cut -c 1-8
# 将密码与用户关联
$PASS | passwd --stdin $USER &>/dev/null
"$USER $PASS" >> $USER_FILE
echo "$USER success!"
else
echo "$USER fail!"
fi
done
正确版本
#!/bin/bash
USER_FILE=users.txt
for USER in user{1..5}; do
# 判断用户是否存在
if ! id $USER &>/dev/null; then
# 获取密码值,这里需要通过echo来输出密码,然后作为后续的参数处理
PASS=$(echo $RANDOM | md5sum | cut -c 1-8)
useradd $USER
# 通过打印来取代手动输入密码
echo $PASS | passwd --stdin $USER &> /dev/null
# 将账号名和密码输入到文件中
echo -e "$USER\t$PASS" >> $USER_FILE
echo "$USER user create successfully."
else
echo_color red "$USER already exists.";
fi
done
批量查看主机是否运行中
#!/bin/bash
for IP in $@; do
# ping 一次
if ping -c 1 $IP &>/dev/null; then
echo "$IP is ok."
else
echo "$IP is wrong!"
fi
done
监控网络流量
function network(){
local old_in old_out new_in new_out
old_in=$(ifconfig ens33 | awk '/RX/&&/bytes/{print $5}')
old_out=$(ifconfig ens33 | awk '/TX/&&/bytes/{print $5}')
sleep 1s
new_in=$(ifconfig ens33 | awk '/RX/&&/bytes/{print $5}')
new_out=$(ifconfig ens33 | awk '/TX/&&/bytes/{print $5}')
in=$(($new_in - $old_in))
out=$(($new_out - $old_out))
echo "$1 入口流量=${in}/s 出口流量=${out}bytes/s"
}
network
监控网站状态
- -w 可以获取一些变量的值
# 输出到 /dev/null -s 表示默认输出,不在控制台答应内容。 -w返回格式的内容
curl -o /dev/null -s -w "%{http_code}" http://www.baidu.com
function check_url(){
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" $1)
# 状态码不等于200
if [ $HTTP_CODE -ne 200 ]; then
echo "$1不可达"
else
echo "$1状态正常"
fi
}