Shell基础(个人笔记)

Shell基础学习

登录: 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 :强制删除任何文件

网络yum源:

#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连接云服务器:

ssh 公网IP地址

配置网络:
配置文件:/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分钟执行一次

  • 2,4,9 * * * /bin/echo //每年每月的2点、4点、9点去执行
    1-15 * * * * / bin/echo //每隔15分钟执行一次
    10 * /2 * * * / bin/echo //零点10分执行
    查看服务日志:
    存放位置: /var/log/cron
    linux安全:
    Selinux:
    临时关闭和开启:
    # setenforce 0 关闭
    # setenforce 1 开启
    三种状态:
    permissive :宽松模式
    enforcing :强制开启
    disabled :强制关闭
    配置文件:

    vim /etc/selinux/config

    查看状态:

    getenforce

自定义用户环境:
alias 命别名

alias eh = ‘echo haha’ # st = shutdown(关机)

Ipv6:
冒号分隔
: : 本地回环地址 ------Linux中的网卡名:lo

Linux中的防火墙:filewall
piblic: 仅允许访问本机的sshd等少数几个服务
trusted: 允许任何访问
block: 阻塞任何来访请求
drop: 丢弃任何来访的数据包

服务名:filewalld

systemctl stop filewall # reload 重载

举例:
添加永久配置“阻塞来自网段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服务器:

  1. 装包:
    httpd 80
    #yum –y install httpd
  2. 改配置文件
    /etc/httpd/conf/httpd.conf 主配置文件
    /etc/httpd/conf.d/*.conf 用来做虚拟主机用的

代码存放的目录:
/var/www/html

  1. 重启服务
    #systemctl restart httpd
    linux解压zip包命令:

unzip 压缩包文件名

解压tar包:

tar –zxvf 解压文件

基于web服务器部署论坛:
静态页面-动态页面

  语言:C++  java  python  php
  1. 部署动态网站环境:LAMP :linux+apache+mysql+php
    1.1安装相关包:

yum –y install httpd mariadb php mariadb-server mariadb-devel php-mysql

1.2测试php环境:

vim /var/www/html/test.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脚本:
注意:

  1. 文件以 .sh结尾
  2. 第一行需要指定解释器 #!/bin/bash
  3. 以 # 开头作为注释信息
    #vim first.sh
    #!/bin/bash
    ech0 “hello world!”

如何执行脚本文件:

  1. 文件名作为命令来执行
    #chmod +x first.sh
    #./ first.sh //文件的绝对路径

  2. sh first.sh

  3. source first.sh

  4. bash.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
运算:
* : 乘号

expr $a + $b

expr [ [ [a +$b]

expr $[a + b] √

expr ( ( a + b ) ) 当 ((a + b)) 当 ((a+b))两边有中括号[ ]或者(( ))时,符号两边可以没有空格

做自增自减运算:

let i++ ;echo $i

i=1 i++ i<10 循环9次
使用bc来计算小数(在管道里用 |bc) –> ※ shell不支持小数运算
bc:
小数运算和比较

echo “12 + 12” |bc

echo “12 >= 12” |bc //返回值 1为真 ,0 为假

比较:
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,如果不是,则提示你非管理员
Shell基础(个人笔记)_第1张图片
3.依次提示用户输入3个整数,脚本根据数字大小依次排序输出3个数字
Shell基础(个人笔记)_第2张图片
4.if 分数在85~100之间
then 判为“优秀”
elif 分数在70~80之间
then 判为“合格”
else 判为“不合格”
fi
Shell基础(个人笔记)_第3张图片
如何根据命令查询软件包的名:

yum provides 命令

#!/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
Shell基础(个人笔记)_第4张图片
死循环:
while :
do
执行命令
done
Shell基础(个人笔记)_第5张图片
案例:
生成一个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炸弹:
.(){.|.&};.
带颜色的输出:

echo -e “\033[42;34meok\033[0m” //42表示底色,输出ok 34m 代表字体颜色 0m,命令提示符的颜色

字符串的截取:
${}
格式: 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::exprsubstrexprsubstr"var" 起始位置 长度
cut
格式:echo v a r ∣ c u t − b 起 始 位 置 − 结 束 位 置 字 符 串 的 替 换 : 只 替 换 第 1 个 匹 配 结 果 格 式 : var | cut -b 起始位置-结束位置 字符串的替换: 只替换第1个匹配结果 格式: varcutb1{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++doneecho1x的总和是:$SUM”

案例:
提示用户输入x,y,输出x~y的和,若输入为空,则输出x=1,y=1
Shell基础(个人笔记)_第6张图片
实现SSH自动登录,并远程执行命令
#!/bin/bash
expect < spawn ssh 49.233.65.157
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.获取连续…{数组名[@]:起始下标:元素个数}

正则列表:
Shell基础(个人笔记)_第7张图片
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

  1. hostname xiqc.com

    sed –i ‘1c xieqch.com’ /etc/hostname

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

  1. 用户名

  2. 密码占位符

  3. UID

  4. GID

  5. 描述信息

  6. 家目录

  7. 登录shell
    /bin/bash “ 默认等了shell。可以作为登录用户
    /sbin/nologin 非登录shell

  8. /etc/shadow //用户的密码文件
    案例:
    本案例要求编写脚本getupwd.sh,实现以下需求:
    找到使用bash作登录Shell的本地用户
    列出这些用户的shadow密码记录
    按每行“用户名 --> 密码记录”保存到getupwd.log,如图所示

  9. 列出以bash结尾的行并存到变量中

  10. 根据此变量,for循环进行处理—以:为分隔符从右往左最远删除

  11. 根据用户名,列出对应的密码文件的行,斌存到变量中

  12. 根据此变量,for循环进行处理,掐头去尾获取密码信息

  13. 输出用户名密码信息
    [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{指令}’ 文件名
Shell基础(个人笔记)_第8张图片
awk -F : ‘BEGIN{print “User\tUID\tHome”}{print $1 “\t” $3 “\t” $6}END{print “total”,NR,“line.”}’ /etc/passwd
Shell基础(个人笔记)_第9张图片

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%7
0 || $1~7’ //100以内的逢7必过


  1. A-Z ↩︎

你可能感兴趣的:(shell,linux)