登录: ssh ip地址
修改主机名: vim /etc/hostname
查看谁在登录:who
更新: yum update
查看现有仓库:yum repolist
清空缓存:yum clean all
部署本地yum源;
1.本地镜像连接到虚拟机
搭建一个样本仓库或者样本源,需要写配置文件
baseurl=file:///centos (地址:本地)
http://
ftp://
file://–(本地)
删除所有:rm –rf(选项合并写) *
-r :删除目录 -f :确认删除 -rf :强制删除任何文件
#baseurl=http://xxx
gpgcheck=0 //0是关闭 1是开启 (红帽的签名检查)
enabled=1 //是否开启开机自启
网络配置:
Vmware —虚拟机
ipaddress —IP地址
netmask —子网掩码
gateway —网关:连接两个不同的网段 (网关一般放在路由器上,路由器连接不同网段)
DNS1 DNS2 —DNS服务器地址:8.8.8.8 222.222.222.222
DNS:域名解析(域名 -----> IP地址)
本地域名解析文件:hosts
linux -------/etc/hosts
windows ----
www.baidu.com 220.181.38.150
查看window的DNS地址:ipconfig /all
云服务器 – 网络安全(基于协议、端口、源IP、目标IP指定的访问规则)
tcp http 80 source
Xshell连接云服务器:
配置网络:
配置文件:/etc/sysconfig/network-scripts/ifcfg-网卡名
ifcfg-eth0
ifcfg-eno16777736
#vim /etc/sysconfig/network-scripts/ifcfg- ifcfg-eth0
进入编辑器后若想快速的将光标移动到最后一行用GG
BOOTPROTO=static //IP获取方式
IPADDR=192.168.153.112
NETMASK=255.255.255.0 //PREFIX=24
GETEWAY=59.74.223.1
DNS1=8.8.8.8
DNS2=222.222.222.222
// 192.168.153.4.1/255.255.255.0 = 192.168.153.4.1/24
// 192.168.153.4.1/255.255.0.0 = 192.168.153.4.1/16
服务名称:network
重启服务:
# systemctl restart network
停止: stop
static
启动: start
查看系统版本信息:
cat /etc/redhat-release
所有者 所属组chown 其他人
读 r 写w 执行 x
NTP时间服务:
#date //查看时间、修改系统时间
更新、同步、校正时间
1. 装包
chrony
1.1验证chrony包是否安装?
#rpm -q chrony
rpm和yum的区别:
1.2 rpm安装单独的软件包
rpm -ivh 完整的包名(http-4.2.rpm)
1.3 yum安装带依赖的软件包
yum -y install 包名(http)
2. 该配置文件
/etc/chrony.config
server 0.centos.pool.ntp.org iburst
3. 重启服务
chronyd
周期性计划任务:
服务名: crond
#systemctl restart crond
#systemutl enable crond(开机自启)
分 时 日 月 周 命令
0-59 0-23 1-31 1-12 0-6
#crontab -e
规则:
*: 匹配范围内任意时间
, : 分隔多个不连续的时间点
-: 指定连续时间范围
/n : 指定时间频率,每年. . .
#crontab -e (编辑) crontab -l (列出)
32 * 1 * * /bin/echo //每月每周一日的每时的32分钟执行一次
自定义用户环境:
alias 命别名
Ipv6:
冒号分隔
: : 本地回环地址 ------Linux中的网卡名:lo
Linux中的防火墙:filewall
piblic: 仅允许访问本机的sshd等少数几个服务
trusted: 允许任何访问
block: 阻塞任何来访请求
drop: 丢弃任何来访的数据包
服务名:filewalld
举例:
添加永久配置“阻塞来自网段172.34.0.0/24的任何访问”
filewall-cmd --permanent --zone=block --add-source=172.34.0.0/24
url: http://地址:端口
浏览器会帮你完善 协议 端口
http://www.baidu.com:80
baidu.com
浏览器上访问5423 ,与访问端口80的效果一样
http:// ---80
https:// ---443 (加 s 指加密)
部署web服务器:
代码存放的目录:
/var/www/html
解压tar包:
基于web服务器部署论坛:
静态页面-动态页面
语言:C++ java python php
1.2测试php环境:
#systemctl restart httpd
浏览器中输入:IP/test.php
2. mysql:
2.1创建登录密码:
#mysqladmin –u root password ‘qwer’
2.2 创建bbs库并设置权限和密码 #systemctl restart mariadb
#mysql –u root –p
enter password: //非明文输入
create database bbs
grant all on bbs.* to root@localhost identified by ‘qwer’;
exit; //退出
3.部署论坛:
清空环境:rm –rf * /root
下载—上传服务器
3.1解压论坛文件:
#unzip 压缩文件名 ls
ls upload
ls regmed
rwx rwx rwx
7 7 7
chomd u=rwx,g=rwx,o=rwx
r=1 w=4 x=4
//复制upload下所有文件到/var/www/html
#cp –rf upload/* /var/www/html
#chmod –R ## 标题777 /var/www/html/* //递归修改权限为777
#关闭防火墙 systemctl stop firewalled //关闭防火墙
#关闭selinux //默认是关闭的
//重启httpd、mariadb
#systemctl restart httpd
#systemctl restart mariadb
4.安装:
浏览器打开:
http://IP地址/install/index.php
shell脚本编程
~/.bash_history
~ : /root
调用历史命令:
!87 //重复执行第87条历史命令
!str //执行最近一次命令
重定向:
: 将标准输出重定向、覆盖
: 追加重定向
2>: 错误信息重定向、覆盖
2>> : 错误信息追加重定向
&> : 无论正确错误都进行重定向 &> /dev/null
< :
| : 管道
第一个shell脚本:
注意:
如何执行脚本文件:
文件名作为命令来执行
#chmod +x first.sh
#./ first.sh //文件的绝对路径
自动部署本地yum源的脚本:
#vim yum.sh
#!/bin/bash
mkdir /centos
mount /dev/cdrom /centos
rm –rf /etc/yum.repos.d/*
echo ‘[centos]
name=centos
baseurl=file:///centos
gpgcheck=0
‘ > /etc/yum.repos.d/centos.repo
隔离变量和常量的用法:{ }
${var}12
预定义变量:
$0 : 当前所在的进程或脚本名
$$ : 当前运行进程的PID号 (可以根据PID杀死进程 kill -9 进程名)
$? : 命令执行后的返回状态,0表示正常,1或者他值表示异常
$# : 已加载的位置变量的个数 (由内向外传递位置参数)
$* : 所有位置变量的值
非交互设置密码:(只写在脚本里面)
echo 密码 | passwd –stdin 用户名
单引号和双引号的区别:
单引号中写什么是什么!
定界符:
‘ ’ :将命令的执行输出作为变量的值
#var=’cat a.txt’
KaTeX parse error: Expected 'EOF', got '#' at position 12: ( ) :作用同上 #̲var=(cat a.txt)
read : 从键盘获取变量值进行赋值
格式:read [-p “提示信息”] 变量名
-p 可选
终端显示控制:
stty –echo //关闭回显
stty echo //打开回显
#!/bin/bash
read -p “请输入你要创建的用户名:” user
useradd $user
stty -echo
read -p “请输入 $user 的秘密:” passwd
stty -echo
echo $passwd | passwd --stdin $user &> /dev/null
局部变量:定义默认变量的只在当前shell下有效
定义全局变量:对当前shell和子shell有效
# export a=11
# a=11
# export a
运算:
* : 乘号
做自增自减运算:
i=1 i++ i<10 循环9次
使用bc来计算小数(在管道里用 |bc) –> ※ shell不支持小数运算
bc:
小数运算和比较
比较:
test 表达式:
[ 表达式 ] :中括号两边有空格
字符串的比较: == !=
&& ||
-z 是否为空 (为空即真)
#[ -z $a ] F
! –z :不为空即真
-n : 不为空即真 ! –n :为空为真
整数比较
-gt : 大于
-eq : 等于
-ne : 不等于
-lt : 小于
-ge : 大于等于
-le :小于等于
[ 6 –gt 7 ] && echo “yes” || echo “no”
no
#[$(who | wc-1) –le 5] && echo “OK” OK
文件状态测试
写一个交互式的判断IP地址
#!/bin/bash
read -p “请输入要交互的IP地址:” IP
ping –c 2 –w1 –i 0.1 KaTeX parse error: Expected 'EOF', got '&' at position 4: ip &̲> /dev/null [? –eq 0] && echo YES || echo NO
条件判断:
if 条件判断
then
执行的命令
if
或者
if 条件判断 :then
fi
练习:
1.每周5使用tar命令存储所有文件
tar –czf log-‘date + %Y%m%d’.tar,gz /var/log
2.检测本机当前用户是否为超级管理员,如果是管理员,则使用yum安装vsftpd,如果不是,则提示你非管理员
3.依次提示用户输入3个整数,脚本根据数字大小依次排序输出3个数字
4.if 分数在85~100之间
then 判为“优秀”
elif 分数在70~80之间
then 判为“合格”
else 判为“不合格”
fi
如何根据命令查询软件包的名:
#!/bin/bash
s=1
for i in {1…5}
do
if [ $s -le $i ];then
echo $s
let s+=2
fi
done
while :循环条件
do
执行循环
done
死循环:
while :
do
执行命令
done
案例:
生成一个100以内的随机数,提示用户猜数字并将随即生成的数字显示
使用read提示用户猜数字
使用if判断用户猜数字的大小关系 猜对了 猜大了 猜小了
使用while循环输入
#!/bin/bash
i=1
j=$[RANDOM%100+1]
while [ $i -le 3 ]
do
read -p “计算机上输入一个1~100的随机数,猜一下:” num
if [ $j -eq $num ];then
echo “恭喜,猜对了”
exit
elif [ $num -gt $j ];then
echo “不好意思,猜大了”
else
echo “不好意思,猜小了”
fi
let i++
done
#seq 100可以快速自动生成100个整数
fork炸弹:
.(){.|.&};.
带颜色的输出:
字符串的截取:
${}
格式: v a r : 起 始 位 置 : 长 度 e x p r s u b s t r 格 式 : e x p r s u b s t r " {var:起始位置:长度} expr substr 格式:expr substr " var:起始位置:长度exprsubstr格式:exprsubstr"var" 起始位置 长度
cut
格式:echo v a r ∣ c u t − b 起 始 位 置 − 结 束 位 置 字 符 串 的 替 换 : 只 替 换 第 1 个 匹 配 结 果 格 式 : var | cut -b 起始位置-结束位置 字符串的替换: 只替换第1个匹配结果 格式: var∣cut−b起始位置−结束位置字符串的替换:只替换第1个匹配结果格式:{var/old/new}
替换全部匹配结果
格式: v a r / / o l d / n e w 字 符 串 掐 头 从 左 往 右 , 最 短 匹 配 删 除 格 式 : {var//old/new} 字符串掐头 从左往右,最短匹配删除 格式: var//old/new字符串掐头从左往右,最短匹配删除格式:{变量名#关键词}
从左向右,最长匹配删除
格式:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键词} 字符串去尾 …{变量名%关键词}
从右向左,最长匹配删除
格式:${变量名%%关键词*}
实例:
批量改名,将txt结尾的改为doc结尾
#mkdir txt; cd txt
#touch {a,b,c,d,e}.txt
#!/bin/bash
for i in $(ls .txt)
do
mv $i ${i%.}.doc
done
变量的初始值处理:${var:-word}
案例:
请输入一个正整数,求从1~x的和
–若用户未输入值,则赋初始值x=1,避免执行出错
#!/bin/bash
read –p “请输入一个正整数:” x
x= x : − 1 ; i = 1 ; {x:-1} ; i=1; x:−1;i=1;SUM=0
while [ $i –le x ] d o l e t S U M + = I ; l e t i + + d o n e e c h o “ 从 1 到 x ] do let SUM+=I;let i++ done echo “从1到 x]doletSUM+=I;leti++doneecho“从1到x的总和是:$SUM”
案例:
提示用户输入x,y,输出x~y的和,若输入为空,则输出x=1,y=1
实现SSH自动登录,并远程执行命令
#!/bin/bash
expect <
expect “password:” {send “[email protected]\r” }
expect “#” {send “cd longdong\r” }
expect “#” { send “cd longdong\r” }
expect “#” { send “cd exit\r” }
EOF
获取元素数组:
1.获取元素单个数组
格式: 数 组 名 [ 下 标 ] 2. 获 取 所 有 元 素 数 组 格 式 : {数组名[下标]} 2.获取所有元素数组 格式: 数组名[下标]2.获取所有元素数组格式:{数组名[@]}
3.获取数组元素个数
格式:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[@]} 4.获取连续…{数组名[@]:起始下标:元素个数}
正则列表:
grep “root|user” passwd = egrep “root|user” passwd
过滤文件的空行 :egrep -v “^$” passwd
正则表达式 \w \s \d \b 用法:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字 等价于[0-9]
\D 匹配非数字字符
\b 匹配单词的开始或结束
其中,[A-Z]表示除了不包含大写字母,取反;1表示以大写字母开头
sed:
语法格式:
#sed [选项] ‘编辑指令’ 文件名
选项:
-n : 屏蔽默认输入出 √
-i : 直接修改文件内容
-r : 启用扩展正则
编辑指令:条件+指令
条件:
行号
/正则/
指令:
p : 输出(print)
例:打印第一行:
# sed –n ‘1p’ passwd
打印第一到四行
# sed –n ‘1,4p’ passwd
打印第三行,第五行:
# sed –n ‘3p;5p’ passwd
打印第三行之后的十行:
# sed –n ‘3,+10p’ passwd
打印奇数行: 步长
# sed –n ‘1~2p’ passwd
# sed –n ‘2~2p’ passwd //第二行开始打印 (偶数)
正则:
包含root的行:
# grep root passwd
# sed –n ‘/root/p’ passwd
以root开头的行:
# sed –n ‘/^root/p’ passwd
以bash结尾的行:
# sed –n ‘/bash$/p’ passwd
删除指令:d
# sed ‘^KaTeX parse error: Expected 'EOF', got '#' at position 27: … //删除空行 #̲ sed ‘d’ passwd //删除最后一行
替换指令:s
语法格式:
‘s/old/new’ 替换第一个
‘s/old/new/3’ 替换第三个
‘s/old/new/g’ 替换所有
分隔符“/”也可用 # , $
输出行数:
# sed ‘KaTeX parse error: Expected 'EOF', got '#' at position 33: …删除最后一行: #̲ sed –n ‘d’ passwd
文件共享:ftp 、http 、samba
文本行操作:
i : 行前添加文本
a: 行后添加文本
c: 替换指定行
修改主机名:
# vim /etc/hostname
# vim modify_hostname.sh
# bin/bash
hosts文件:
本地域名解析文件
#sed –i ‘1a 127.0.0.1 tedu.cn’ /etc/hosts
用户管理:
命令: useradd / group / userde1 / groupde1
文件:
/etc/passwd //用户的详细信息
root❌0:0:root:/root:/bin/bash
用户名
密码占位符
UID
GID
描述信息
家目录
登录shell
/bin/bash “ 默认等了shell。可以作为登录用户
/sbin/nologin 非登录shell
/etc/shadow //用户的密码文件
案例:
本案例要求编写脚本getupwd.sh,实现以下需求:
找到使用bash作登录Shell的本地用户
列出这些用户的shadow密码记录
按每行“用户名 --> 密码记录”保存到getupwd.log,如图所示
列出以bash结尾的行并存到变量中
根据此变量,for循环进行处理—以:为分隔符从右往左最远删除
根据用户名,列出对应的密码文件的行,斌存到变量中
根据此变量,for循环进行处理,掐头去尾获取密码信息
输出用户名密码信息
[root@svr5 ~]# vim ./getupwd.sh
#/bin/bash
/tmp/getupwd.log ## 创建空文件
sed -n '/:/bin/bashKaTeX parse error: Expected 'EOF', got '#' at position 33: … /etc/passwd #̲# 提取符合条件的账号记录 U…(egrep -c ‘.’ /tmp/urec.tmp) ## 取得记录个数
while [ ${i:=1} -le KaTeX parse error: Expected 'EOF', got '#' at position 17: …NUM ] #̲# 从第1行开始,遍历账号记录…(sed -n "KaTeX parse error: Expected 'EOF', got '#' at position 26: …/urec.tmp) #̲# 取指定行数的记录 …{UREC%%:} ## 截取用户名(记录去尾)
PREC=KaTeX parse error: Expected group after '^' at position 11: (sed -n "/^̲NAME:/p" /etc/shadow) ## 查找与用户名对应的密码记录
PASS=KaTeX parse error: Expected '}', got '#' at position 6: {PREC#̲*:} …{PASS%%:} ## 去尾,只留下密码记录
echo “$NAME --> $PASS” >> /tmp/getupwd.log ## 保存结果
let i++ ## 自增1,转下一次循环
done
/bin/rm -rf /tmp/urec.tmp ## 删除临时文件
echo “用户分析完毕,请查阅文件 /tmp/getupwd.log” ## 完成后提示
[root@svr5 ~]# chmod +x ./getupwd.sh
#!bin/bash
A={sed -n '/bash$/s/:.//p’ /etc/passwd} #提取符合条件的账号记录
for i in KaTeX parse error: Expected 'EOF', got '#' at position 18: … #̲遍历账号记录 do …(grep i / e t c / s h a d o w ) P A S S 2 = i /etc/shadow) PASS2= i/etc/shadow)PASS2={PASS1#:}|
PASS=KaTeX parse error: Expected '}', got 'EOF' at end of input: … echo "i -->$PASS"
done
[root@svr5 ~]# chmod +x ./getupwd.sh
替换( )可以用\1
&表示被替换的内容
&= : 表示最后一行
= :获取行号
awk(针对列)
awk [选项] ‘[条件]{指令}’ 文件名
指令:
print
# awk ‘{print $1,$3}’ a.txt //打印第1列和第3列 (awk的分隔符是空格)
选项:
-F :指定分隔符
#awk –F : ‘{print $7}’ /etc/passwd
/user/bin/bash/awk
awk常用内置变量:
$0 文件当前行的全部内容
$1 文件的第1列
$2 文件的第2列
$3 文件的第3列,以此类推
NR 文件当前行的行数
NF 文件当前的列数(有几列)
[root@libinfang ~]# awk -F : ‘/root/{print $7}’ passwd
/bin/bash
/sbin/nologin
[root@libinfang ~]# awk -F : ‘/root/{print $0}’ passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
[root@libinfang ~]# awk -F : ‘/root/{print NR}’ passwd
1
10
[root@libinfang ~]# awk -F : ‘/root/{print NR,NF}’ passwd
1 7
10 7
[root@libinfang ~]# awk -F : ‘{print $1,“的解释器:”,$7}’ passwd
root 的解释器: /bin/bash
bin 的解释器: /sbin/nologin
……
[root@libinfang ~]# awk -F : ‘{print “行数是:”,NR,“列数是:",NF}’ passwd
[root@libinfang ~]# df -h
[root@libinfang ~]# df -h | awk ‘//dev/vdal/{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲' [root@libinf…/{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲' 6% [root@lib…/{print NF}’
6
[root@libinfang ~]# df -h | awk ‘//$/{print KaTeX parse error: Expected 'EOF', got '}' at position 3: NF}̲' / [root@libi…/{print $NR}’
/
[root@libinfang ~]# df -h | awk ‘//dev/{print NR}’
2
3
6
[root@libinfang ~]# df -h | awk ‘//dev/{print KaTeX parse error: Expected 'EOF', got '}' at position 3: NR}̲' 1.9G 0 / [ro…/{print $NR}’
1.9G
[root@libinfang ~]# df -h | awk ‘/^tmpfs/{print $NR}’
0
1.9G
0%
awk [选项] ‘BEGIN{指令}{指令}END{指令}’ 文件名
awk -F : ‘BEGIN{print “User\tUID\tHome”}{print $1 “\t” $3 “\t” $6}END{print “total”,NR,“line.”}’ /etc/passwd
awk -F : ‘ 7 ! / n o l o g i n 7!~/nologin 7! /nologin/’ /etc/passwd //输出不以nologin结尾的第7列
seq 200 | awk ‘$1%30’ //对1~200逐行进行取3的倍数
seq 100 | awk '$1%70 || $1~7’ //100以内的逢7必过
A-Z ↩︎