一键PXE+Kickstart自动化部署脚本

一键PXE+Kickstart自动化部署脚本(CentOS)

八宝茶&黑兰州

于 2021-03-10 18:53:31 发布

71
收藏
分类专栏: 运维脚本 文章标签: linux centos
版权

运维脚本
专栏收录该内容
4 篇文章0 订阅
订阅专栏
基于shell的自动化部署脚本
淦!由于本人太菜的原因,一度导致就这么个破脚本浪费了四天时间!大量时间都在调错上,累到虚脱!
autoIS.sh

#############by西北苦命漢###################
#!/bin/bash
#LANG=”zh_CN.GB18030
############pxe+kickstart無人值守安裝腳本################
function Divider(){
echo “################################################################”
}
if [ $# -eq 0 ]
then
echo -e “\033[31m 缺少参数!\n使用方法:sh autoIS.sh [服务端IP地址]”
exit
fi
function show(){
echo -e “\033[31m 網絡環境異常,請檢查! \033[0m”
exit
}
function status(){
if [ $1 -eq 0 ]
then
echo -e “\033[32m $2成功! \033[0m”
else
echo -e “\033[31m $2失败! \033[0m”
fi

}
if [ `id -u` -ne 0 ]
then
echo -e “\033[31m 此腳本需管理員執行,當前用戶非管理員! \033[0m”
exit
fi
find /dev/sr0
if [[ $? != 0 ]]
then
echo -e “\033[31m error:sr0! \033[0m”
echo -e “\033[31m 请确认您的光驱内有光盘?(Y/N): \033[0m \c”
read que
if [[ $que == “n” ]] || [[ $que == “N” ]]
then
exit
fi
fi
echo -e “\033[34m 正在檢查網絡狀態,請等待! \033[0m”
ping -c 3 www.baidu.com > /dev/null && echo -e “\033[34m 開始部署環境 \033[0m” || show
####環境部署模塊####
Divider
yum install -y dhcp && echo -e “\033[32m 1.DHCP服務安裝成功! \033[0m” || echo -e “\033[31m 1.DHCP服務安裝失敗! \033[0m”
yum install -y tftp-server && echo -e “\033[32m 2.TFTP服務安裝成功! \033[0m” || echo -e “\033[31m 2.TFTP服務安裝失敗! \033[0m”
yum install -y xinetd && echo -e “\033[32m 3.Xinetd服務安裝成功! \033[0m” || echo -e “\033[31m 3.Xinetd服務安裝失敗! \033[0m”
yum install -y syslinux && echo -e “\033[32m 4.SYSlinux服務安裝成功! \033[0m” || echo -e “\033[31m 4.SYSlinux服務安裝失敗! \033[0m”
yum install -y httpd && echo -e “\033[32m 5.HTTP服務安裝成功! \033[0m” || echo -e “\033[31m 5.HTTP服務安裝失敗! \033[0m”
echo -e “\033[34m 環境部署動作結束!!! \033[0m”
mkdir /media/cdrom
mount /dev/sr0 /media/cdrom/ && echo -e “\033[32m 6.光盘挂载成功! \033[0m” || echo -e “\033[31m 6.光盘挂载失敗! \033[0m”
echo -e “[centos]\nname=centos\nbaseurl=file:///media/cdrom\ngpgcheck=0\nenabled=1” > /etc/yum.repos.d/local.repo && echo -e “\033[32m 7.仓库部署成功! \033[0m” || echo -e “\033[31m 7.仓库部署失敗! \033[0m”
systemctl enable httpd
str=`ifconfig | sed -n ‘1p’`
str1=`echo ${str%%:*}`
nmcli connection modify $str1 ipv4.method manual ipv4.addresses $1/24 ipv4.gateway “” ipv4.dns “” connection.autoconnect yes && echo -e “\033[32m 8.网卡已重新配置! \033[0m” || echo -e “\033[31m 8.网卡配置失败,请自行修改ip地址为$1 \033[0m”
nmcli connection up $str1
IP3=$1
flag=0
IP3=${IP3%.*}
sed -ri “s/([0-9]{1,3}\.){2}[0-9]{1,3}/$IP3/g” dhcpd1.txt || flag=1
sed -ri “s/([0-9]{1,3}\.){2}[0-9]{1,3}/$IP3/g” dhcpd2.txt || flag=1
status $flag “IP地址写入DHCP配置文件”
Divider
####DHCP防报错模块####
flag=0
cat ./dhcpd1.txt > /etc/dhcp/dhcpd.conf || flag=1
sed -i “2asubnet $IP3\.0 netmask 255.255.255.0 {” /etc/dhcp/dhcpd.conf || flag=1
sed -i “4aoption subnet-mask 255.255.255.0;” /etc/dhcp/dhcpd.conf || flag=1

systemctl restart dhcpd || flag=1
status $flag “DHCP服务防报错配置”
####服務配置模塊####
Divider
cat ./dhcpd2.txt > /etc/dhcp/dhcpd.conf && echo -e “\033[32m 1.DHCP配置文件寫入成功! \033[0m” || echo -e “\033[31m 1.DHCP配置文件寫入失敗! \033[0m”
sed -i “4asubnet $IP3\.0 netmask 255.255.255.0 {” /etc/dhcp/dhcpd.conf || flag=1
sed -i “5aoption subnet-mask 255.255.255.0;” /etc/dhcp/dhcpd.conf || flag=1
sed -i “6aoption domain-name-servers $1;” /etc/dhcp/dhcpd.conf || flag=1
sed -i “10anext-server $1;” /etc/dhcp/dhcpd.conf || flag=1
line=`sed -n ‘/disable/=’ /etc/xinetd.d/tftp`
sed -i “$line{s/yes/no/g}” /etc/xinetd.d/tftp && echo -e “\033[32m 2.TFTP配置文件寫入成功! \033[0m” || echo -e “\033[31m 2.TFTP配置文件寫入失敗! \033[0m”
flag=0
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ || flag=1
cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/ || flag=1
cp /media/cdrom/isolinux/{vesamenu.c32,*.msg} /var/lib/tftpboot/ || flag=1
status $flag “3.SYSlinux引导文件拷贝至TFTP目录下”
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default && echo -e “\033[32m 3.开机配置文件拷贝成功! \033[0m” || echo -e “\033[31m 3.开机配置文件拷贝失敗! \033[0m”
flag=0
str1=”hd:LABEL=CentOS\x207\x20x86_64″
sed -i ‘1c default linux’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i ’64d’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i “63aappend initrd=initrd.img inst.repo=http://$1/iso ks=http://$1/pub/ks.cfg quiet” /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i ’70d’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i “69aappend initrd=initrd.img inst.repo=http://$1/iso rd.live.check ks=http://$1/pub/ks.cfg quiet” /var/lib/tftpboot/pxelinux.cfg/default || flag=1
status $flag “4.开机选项配置”
mkdir /var/www/html/iso && echo -e “\033[32m 5.服务目录创建成功! \033[0m” || echo -e “\033[31m 5.服务目录创建失败! \033[0m”
echo -e “\033[34m 以下拷贝时间较长,请耐心等待… \033[0m”
cp -r /media/cdrom/* /var/www/html/iso/ && echo -e “\033[32m 6.光盘镜像已拷贝到http工作目录下! \033[0m” || echo -e “\033[31m 6.光盘镜像拷贝失败! \033[0m”
firewall-cmd –permanent –add-port=69/udp && echo -e “\033[32m (tftp放行成功!) \033[0m” || echo -e “\033[31m (tftp放行失败!) \033[0m”
firewall-cmd –reload
mkdir /var/www/html/pub && echo -e “\033[32m 7.应答目录创建成功! \033[0m” || echo -e “\033[31m 7.应答目录创建失败! \033[0m”
cp ~/anaconda-ks.cfg /var/www/html/pub/ks.cfg && echo -e “\033[32m 8.应答文件已拷贝! \033[0m” || echo -e “\033[31m 8.应答文件拷贝失败! \033[0m”
chmod +r /var/www/html/pub/ks.cfg && echo -e “\033[32m 9.应答文件已授权! \033[0m” || echo -e “\033[31m 9.应答文件未授权! \033[0m”
firewall-cmd –permanent –add-service=http && echo -e “\033[32m 10.防火墙已放行! \033[0m” || echo -e “\033[31m 10.防火墙未放行 \033[0m”
firewall-cmd –reload
flag=0
line=`sed -n ‘/cdrom/=’ /var/www/html/pub/ks.cfg`
sed -i “$line{s!cdrom!url –url=http://$1/iso!g}” /var/www/html/pub/ks.cfg && `flag=1`
sed -i “s/^.*timezone .*$/timezone Asia\/Shanghai –isUtc/” /var/www/html/pub/ks.cfg && `flag=1`
line=`sed -n ‘/–none/=’ /var/www/html/pub/ks.cfg`
sed -i “$line{s!–none!–all!g}” /var/www/html/pub/ks.cfg && `flag=1`
status $flag “11.镜像安装参数配置”
Divider
#####服务启动模块#####
systemctl restart dhcpd && echo -e “\033[32m 1.DHCP服务开启成功! \033[0m” || echo -e “\033[31m 1.DHCP服务开启失败! \033[0m”
systemctl enable dhcpd
systemctl restart tftp && echo -e “\033[32m 2.TFTP服务开启成功! \033[0m” || echo -e “\033[31m 2.TFTP服务开启失败! \033[0m”
systemctl enable tftp
systemctl restart xinetd && echo -e “\033[32m 3.Xinetd服务开启成功! \033[0m” || echo -e “\033[31m 3.Xinetd服务开启失败! \033[0m”
systemctl enable xinetd
systemctl restart httpd && echo -e “\033[32m 4.HTTP服务开启成功! \033[0m” || echo -e “\033[31m 4.HTTP服务开启失败! \033[0m”
systemctl enable httpd
str=`ifconfig | sed -n ‘1p’`
str1=`echo ${str%%:*}`
nmcli connection modify $str1 ipv4.method manual ipv4.addresses $1/24 ipv4.gateway “” ipv4.dns “” connection.autoconnect yes && echo -e “\033[32m 5.网卡已重新配置! \033[0m” || echo -e “\033[31m 5.网卡配置失败,请自行修改ip地址为$1 \033[0m”
nmcli connection up $str1
echo -e “\033[34m 脚本执行完毕!!!\n \033[0m”
Divider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
配置文件
dhcpd1.conf
防DHCP报错的,挺废的,当然是本人太菜了,不过这能解决问题!

ddns-update-style none;
ignore client-updates;
range 192.168.4.50 192.168.4.250;
option routers 192.168.4.1;
option domain-name “www.baidu.com”;
option domain-name-servers 192.168.4.1;
default-lease-time 21600;
max-lease-time 43200;
}
1
2
3
4
5
6
7
8
9
dhcpd2.conf
正式的DHCP配置文件,为啥不写在脚本里?不想!

allow booting;
allow bootp;
ddns-update-style interim;
ignore client-updates;
range dynamic-bootp 192.168.4.50 192.168.4.200;
default-lease-time 21600;
max-lease-time 43200;
filename “pxelinux.0”;
}
1
2
3
4
5
6
7
8
9
脚本使用方法:sh autoIS.sh [服务器IP]
警告:
1.在服务器上做实验的,记得连接虚拟光盘!
2.脚本执行会更改网卡配置,执行完不能上网,是很有可能的,用nmtui来恢复网卡配置就ok!

当然!这个脚本太基础了,你也可以在这个脚本的基础上加些东西,比如环境监测之类的!

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux环境安装安装CentOS1660 人正在系统学习中
————————————————
版权声明:本文为CSDN博主「八宝茶&黑兰州」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43233084/article/details/114643017

ImageMagick 图片处理常用实例简介

 发表于 2019-04-11 |  分类于 Tools |  |  阅读次数: 字数统计: 3.8k |  阅读时长 ≈ 0:04

ImageMagick 是一整套用于图像处理的跨平台的命令行工具,大部分 Linux 发行版都可以直接通过包管理器安装(如 Ubuntu 系统:sudo apt-get install imagemagick)。其他平台也可以从官网下载对应的编译好的程序。
通过命令行,ImageMagick 可以很高效的对图片进行编辑、转换和创作,也支持批量处理多张图片,或者内嵌到 Bash 脚本中。
这里简单介绍下 ImageMagick 常见的几种用法。

格式转换

ImageMagick 提供了 convert 命令用于接收图片文件并对其进行特定的操作后输出。其中最基本的用法即改变图片的格式。

如将 PNG 格式的图片转为 JPEG 格式:
$ convert image.png image.jpg

对于 JPEG 图片,在转换时还可以指定压缩等级,如:
$ convert image.png -quality 95 image.jpg

其中压缩等级(-quality)的值为 1-100,默认使用输入图片的压缩等级。如该值为空,则压缩等级默认为 92 。

改变图片大小

convert 命令还可以用来改变图片的大小。如下面的命令可以将原图片转成大小为 200×100 像素的图片:
$ convert image.png -resize 200x100 out.png

需要注意的是,在上面的命令中,ImageMagick 会优先保持原图片的比例(否则图片会发生一定程度的变形)。这样的结果是,改变后的图片可以正好放进一个 200×100 大小的区域,但图片本身并不一定是精确的 200×100 像素。

如果就是需要将原图片转换为特定大小,而不用考虑形变的影响。可以使用如下命令:
$ convert image.png -resize 200x100! out.png

当然更多的时候,指定输出图片的大小时并非一定需要“宽x高”这样的形式,其实只需要指定宽或者高中的一项即可。如指定输出图片的宽度:
$ convert image.png -resize 200 out.png

或者指定输出图片的高度:
$ convert image.png -resize x100 out.png

旋转与翻转

将原图片旋转 90° 后输出:
$ convert image.jpg -rotate 90 image-rotated.jpg

指定的角度为正时即顺时针旋转图片,为负时逆时针旋转。

左右翻转:
$ convert image.png -flop out.png
上下翻转:
$ convert image.png -flip out.png

PS:包括前面的几种情况在内,如果输出图片的文件名和原图片相同,则改变后的图片会直接覆盖掉原图片。

裁剪与缩放

convert 命令支持等比例缩放图片,如将图片缩小为原来的一半:
$ convert image.png -scale 50% out.png

同时 convert 也可以对图片进行裁剪,包括自动裁剪(剔除图片周围空白的部分或边框等)和自定义范围的裁剪。

自动裁剪$ convert image.png -trim out.png
trim

自定义裁剪$ convert image.jpg -crop 600x600+240+240 out.jpg
crop

其中 -crop 的参数为 宽x高+横坐标偏移量+纵坐标偏移量 的形式,即宽和高用来定义裁剪的矩形区域的范围,横纵偏移量用来指定裁剪区域的相对位置(都为 0 时表示从最左上角开始)。

需要注意的是,当用 -crop 选项裁剪 PNG 和 GIF 格式的图片时(这两种格式的图片包含“虚拟画布”),并不是以画面的实际像素为基准,而是需要参考“画布”的大小和位置,所以有时候并不会达到预期的效果。
详细介绍可参考官方文档 Cutting and Bordering 。

shave

裁剪图片有时候可以采取相反的思路,即剔除图片中不需要的部分:
$ convert image.png -shave 100x50 out.png
将输入图片的左右两边剔除 100 像素,上下两边剔除 50 像素,获取剩余的部分并输出。

色彩、亮度与饱和度

convert 命令可以通过 -modulate 选项调整图片的色彩、亮度和饱和度。如:
$ convert image.png -modulate 150,100,100 out.png

上述命令会将原图片的亮度增大为原来的 150% 。其中 150,100,100 三个数值分别表示亮度、饱和度和色相
100 为基准值,即大于 100 表示增强某种属性,小于 100 表示减弱某种属性。

透明度、色彩与位深度

  • 将透明(alpha)通道替换为纯黑色:$ convert image.png -flatten out.png
  • 将原彩色图片转为灰度模式:$ convert image.png -type Grayscale out.png
  • 降低图片的位深度(bits per pixel):$ convert image.png -depth 8 out.png
  • 减少图片色彩:$ convert image.png -dither -colors 256 out.png

PSdither 会增加像素点,如需要在减少色彩的同时不应用 dither 效果,将命令中的 -dither 替换为 +dither 。

锐化与虚化

锐化
$ convert image.png -sharpen 2 out.png

模糊
$ convert image.png -blur 1 out.png

添加文字和边框

添加水印
$ convert image.jpg -fill red -draw "text 20 20 '© 2019 example.com'" out.jpg

可以自行定义添加文字的位置(默认为左上角)和字体类型:
$ convert image.jpg -fill red -gravity SouthEast -font arial -draw "text 20 20 '© 2019 example.com'" out.jpg

添加边框
$ convert image.png -bordercolor blue -border 50 out.png
其中 -bordercolor 用于指定边框颜色,-border 用于指定边框宽度,可以为百分比。

组合叠加

组合多张图片(垂直方向)
$ convert x1.png x2.png x3.png -append out.png

组合多张图片(水平方向)
$ convert x1.png x2.png x3.png +append out.png

叠加图片
$ composite -gravity center img1.png img2.png out.png
将 img1.png 叠加到 img2.png 上并作为 out.png 输出(方位为正中间)

应用效果

ImageMagick 可以对图片应用多种样式的特效。如 “charcoal” 效果:
$ convert image.png -charcoal 2 out.png
Charcoal
其中 -charcoal 后面的数字 2 用于指定该效果的强度。

“implode” 效果:
$ convert image.png -implode 1 out.png
Implode

结合多种操作

前面提到的多种处理方式实际上可以任意组合使用,使得只用一条命令即可以同时完成多种操作。如:
$ convert image.png -resize 400x400 -rotate 180 -charcoal 4 -quality 95 out.jpg
Combination

批量处理

借助 Bash 脚本(Linux 系统)的强大功能,ImageMagick 可以很方便的批量处理多张图片。
如下面的命令可以查找当前目录下所有的 PNG 图片,将它们每一张都旋转 90°,再将原文件名添加 “rotated-” 前缀后保存:
$ for file in *.png; do convert $file -rotate 90 rotated-$file; done

Windows 系统上是没有原生的 Bash Shell 的,但是可以下载安装某些软件以支持 Bash 环境,比如 Git for Windows
其实使用 Windows 系统自带的 PowerShell 也可以完成同样的批量操作:
PS > dir *.png | foreach { convert $_ -rotate 90 rotated-$($_.basename).png }
Batch Processing

有兴趣的话,可以多玩几下。

GIF 动图制作

可以借助 convert 命令将多张图片组合为一张重复播放的 GIF 动图:
$ convert -delay 20 -loop 0 *.png out.gif

其中 -delay 选项用于指定图片切换的时间间隔,单位为毫秒

参考文章

ImageMagick Tutorial
ImageMagick basics

拓展阅读

Examples of ImageMagick Usage(很详细)

Linux下环境变量配置方法小结(.bash_profile和.bashrc的区别)

这篇文章主要介绍了Linux下环境变量配置方法小结(.bash_profile和.bashrc的区别),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

linux系统下,如果下载并安装了应用程序,在启动时很有可能在键入它的名称时出现”command not found”的提示内容。如果每次都到安装目标文件夹内,找到可执行文件

来进行操作就太繁琐了,这种情况下就涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分。

环境变量配置的两个方法:

1)修改/etc/profile文件

推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,缺点是可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;

[root@test ~]# vim /etc/profile
….
export PATH=$PATH:/usr/local/mysql/bin

使用source命令使修改立刻生效:
[root@test ~]# source  /etc/profile

2)修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果需要给某个用户权限
使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。
[root@test ~]# vim /root/.bashrc
export PATH=$PATH:/usr/local/mysql/bin

[root@test ~]# source  /root/.bashrc

需要注意的是:

在/etc/profile里设置系统环境变量时,路径末尾不能以”/”结尾,否则将导致整个PATH变量出错。

[app@test ~]$ vim ~/.bashrc
……
KETTLE_HOME=/data/nstc/kettle3.2
export KETTLE_HOME

注意:配置好环境变量后,要记得export输出这个变量,否则如下source后无效!
[app@test ~]$ source .bashrc //使之生效
[app@test ~]$ echo $KETTLE_HOME
/data/nstc/kettle3.2
[app@test ~]$ env
………
KETTLE_HOME=/data/nstc/kettle3.2

.bash_profile和.bashrc的区别:

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

=========================设置终端登录超时时间================

远程登录linux服务器,如何设置终端失效时间(即过了多久不操作,终端即将失效)。方法如下:
[root@mq-console-nameserver ~]# vim /etc/profile
……
export TMOUT=600
[root@mq-console-nameserver ~]# source /etc/profile

如上设置后,登录这台服务器的终端在10分钟内不做操作,则该终端就将失效!

总结

LINUX iconv命令详解

功能] 

对于给定文件把它的内容从一种编码转换成另一种编码。 

[描述] 

-f encoding :把字符从encoding编码开始转换。 

-t encoding :把字符转换到encoding编码。 

-l :列出已知的编码字符集合 

-o file :指定输出文件 

-c :忽略输出的非法字符 

-s :禁止警告信息,但不是错误信息 

–verbose :显示进度信息 

-f和-t所能指定的合法字符在-l选项的命令里面都列出来了。 

 

[举例] 

*列出当前支持的字符编码: 

#iconv -l

*将文件file1转码,转后文件输出到fil2中: 

#iconv  -f EUC-JP-MS -t UTF-8 file1 -o file2   //没-o那么会输出到标准输出.

*实际需求,从hive中取出的数据是utf8的,要load到mysql中,gbk编码。所以在load之前要先对文件进行转码。

复制代码
mysql_cmd = "iconv -c -f utf-8 -t gbk ./data/al_ver_" + yesterday_time + ".xls -o ./data/GBK_al_ver_" + yesterday_time + ".xls "
print(mysql_cmd)
os.system(mysql_cmd)
 
mysql_cmd = "mysql -h60.28.200.78 -uroot -pyeelion -A LogStat_RT  -e \"load data local  infile \'./data/GBK_al_ver_" + yesterday_time + ".xls ' into table HiveData_508\""
print(mysql_cmd)
os.system(mysql_cmd)

在php中iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库;但有时候iconv对于部分数据转码会无缘无故的少一些。比如在转换字符”—”到gb2312时会出错。

下面一起慢慢看一下这个函数的用法。

最简单的应用,把gb2312置换成utf-8:

1
$text=iconv("GB2312","UTF-8",$text);

在用$text=iconv("UTF-8","GB2312",$text)过程中,如果遇到一些特别字符时,如:”—”,英文名中的”.”等等字符,转换就断掉了。这些字符后的文字都没法继续转换了。

针对这的问题,可以用如下代码实现:

1
$text=iconv("UTF-8","GBK",$text);

你没有看错,就这么简单,不使用gb2312,而写成GBK,就可以了。

还有一种方法,第二个参数,加上//IGNORE,忽略错误,如下:

1
iconv("UTF-8","GB2312//IGNORE",$data);

没有具体比较这两种方法,感觉第一种(GBK代替gb2312)方法更好。

php手册中iconv() 说明:

iconv

(PHP 4 >= 4.0.5, PHP 5)
iconv – Convert string to requested character encoding
Description
string iconv ( string in_charset, string out_charset, string str )
Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure.
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can’t be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.

在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。此时可以使用以下方法解决:

1
$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath));

即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。

ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。

iconv不是php的默认函数,也是默认安装的模块。需要安装才能用的。

如果是windows2000+php,你可以修改php.ini文件,将extension=php_iconv.dll前的”;”去掉,同时你要copy你的原php安装文件下的iconv.dll到你的winnt/system32下(如果你的dll指向的是这个目录)。在linux环境下,用静态安装的方式,在configure时加多一项 –with-iconv就可以了,phpinfo看得到iconv的项。(Linux7.3+Apache4.06+php4.3.2)。

mb_convert_encoding与iconv函数介绍

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

做一个GBK To UTF-8:

1
2
3
4
<?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");
?>

再来个GB2312 To Big5:

1
2
3
4
<?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>

不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数。

1
2
$content = iconv("GBK", "UTF-8″, $content);
$content = mb_convert_encoding($content, "UTF-8″, "

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

linux bash if语句

str1 = str2      当两个串有相同内容、长度时为真
str1 != str2      当串str1和str2不等时为真
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1           当串str1为非空时为真

[ “2006.01.23” \> “2005.03.01” ] && echo dayu || echo budayu

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

-a         与
-o        或
!        非

 

上面的三种写在括号内,对应的 && || 写在中括号之间。例如,if  [   “$a”  eq   1  -o  “$b” eq 2 ]  &&  [   “$c”  eq  3 ]

4字符串匹配

if [  `echo $str | grep -e regexp`  ];then .

 

转自:http://hi.baidu.com/ryouaki/item/0689dcb8a467b5a7eaba9319

二 具体使用

比较两个字符串是否相等的办法是:

    if [ “$test”x = “test”x ]; then

这里的关键有几点:

1 使用单个等号

2 注意到等号两边各有一个空格:这是unix shell的要求

3 注意到”$test”x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

 

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

    整数比较 需要注意的是 要么使用[]gt组合 要么使用大于号和双括号组合

-eq 等于,如:if [ “$a” -eq “$b” ]

-ne 不等于,如:if [ “$a” -ne “$b” ]

-gt 大于,如:if [ “$a” -gt “$b” ]

-ge 大于等于,如:if [ “$a” -ge “$b” ]

-lt 小于,如:if [ “$a” -lt “$b” ]

-le 小于等于,如:if [ “$a” -le “$b” ]

大于(需要双括号),如:((“$a” > “$b”))

>= 大于等于(需要双括号),如:((“$a” >= “$b”))

小数据比较可使用AWK

字符串比较

= 等于,如:if [ “$a” = “$b” ]

== 等于,如:if [ “$a” == “$b” ],与=等价

注意:==的功能在[[]]和[]中的行为是不同的,如下:

1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true

2 [[ $a == “z*” ]] # 如果$a等于z*(字符匹配),那么结果为true

3

4 [ $a == z* ] # File globbing 和word splitting将会发生

5 [ “$a” == “z*” ] # 如果$a等于z*(字符匹配),那么结果为true

一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.

但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!= 不等于,如:if [ “$a” != “$b” ]

这个操作符将在[[]]结构中使用模式匹配.

大于,在ASCII字母顺序下.如:

if [[ “$a” > “$b” ]]

if [ “$a” \> “$b” ]

注意:在[]结构中”>”需要被转义.

具体参考Example 26-11来查看这个操作符应用的例子.

-z 字符串为”null”.就是长度为0.

-n 字符串不为”null”

注意:

使用-n在[]结构中测试必须要用””把变量引起来.使用一个未被””的字符串来使用! -z

或者就是未用””引用的字符串本身,放到[]结构中。虽然一般情况下可

以工作,但这是不安全的.习惯于使用””来测试字符串是一种好习惯.

if判断式
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
else
   执行第三段內容程式
fi

例如:

 

root@Bizbox:~# a=0

root@Bizbox:~# b=0

root@Bizbox:~# c=5

root@Bizbox:~# if [ $a = 0 -a $b = 0 ]&&[ $c != 0 ]; then

> echo success

> fi

success

if 使用的表达式

http://www.cnblogs.com/276815076/archive/2011/10/30/2229286.html

if 语句格式
if  条件
then
Command
else
Command
fi                              别忘了这个结尾 If语句忘了结尾fi
test.sh: line 14: syntax error: unexpected end of fi
if 的三种条件表达式
if
command
then
if
函数
then  命令执行成功,等于返回0 (比如grep ,找到匹配)
执行失败,返回非0 (grep,没找到匹配) if [ expression_r_r_r  ]
then   表达式结果为真,则返回0,if把0值引向then if test expression_r_r_r
then  表达式结果为假,则返回非0,if把非0值引向then
[ ] &&  ——快捷if
[ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”    && 可以理解为then
如果左边的表达式为真则执行右边的语句
shell的if与c语言if的功能上的区别
shell if     c语言if 0为真,走then  正好相反,非0走then  不支持整数变量直接if
必须:if [ i –ne 0 ]

但支持字符串变量直接if
if [ str ] 如果字符串非0  支持变量直接if
if (i )

echo –n “input:”
read user

if
多条指令,这些命令之间相当于“and”(与)
grep $user /etc/passwd >/tmp/null
who -u | grep $user
then             上边的指令
都执行成功,返回值$?为0,0为真,运行then
echo “$user has logged”
else     指令执行失败,$?为1,运行else
echo “$user has not logged”
fi   

# sh test.sh
input : macg
macg     pts/0        May 15 15:55   .          2075 (192.168.1.100)
macg has logged

# sh test.sh
input : ddd
ddd has not logged

以函数作为if条件  (函数就相当于command,函数的优点是其return值可以自定义)
if
以函数作为if条件,
getyn
then   函数reture值0为真,走then
echo ” your answer is yes”
else  函数return值非0为假,走else
echo “your anser is no”
fi
if command  等价于 command+if $?
$ vi testsh.sh
#!/bin/sh

if
cat 111-tmp.txt | grep ting1
then
echo found
else
echo “no found”
fi  $ vi testsh.sh
#!/bin/sh

cat 111-tmp.txt | grep ting1

if [ $? -eq 0 ]
then
echo $?
echo found
else
echo $?
echo “no found”
fi $ sh testsh.sh
no found   $ sh testsh.sh
1
no found $ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
found $ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
0
found

条件表达式

  • 文件表达式

 ]    如果文件存在且可写
if [ -x file  ]    如果文件存在且可执行   

整数变量表达式    字符串变量表达式

 [ $a = $b ]                 如果string1等于string2
[ $string1 !=  $string2 ]   如果string1不等于string2        if  [ -n $string  ]             如果string 非空(非0),返回0(true)
if  [ -z $string  ]             如果string 为空
if  [ $sting ]                  如果string 非空,返回0 (和-n类似)

if [ a = b ] ;then
echo equal
else
echo no equal
fi

[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
no equal  (等于表达式没比$a$b,而是比ab,自然a!=b)

if [ $a = $b ] ;then
echo equal
else
echo no equal
fi

[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
equal

                                                                                    [macg@machome ~]$ vi test.sh
echo -n “input your choice:”
read var
if  [ $var -eq “yes” ]
then
echo $var
fi
[macg@machome ~]$ sh -x test.sh
input your choice:
y
test.sh: line 3: test: y: integer expression_r_r_r expected
期望整数形式,即-eq不支持字符串

=放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于

    [macg@machome ~]$ vi test.sh
echo “input a:”
read a
echo “input is $a”
if [ $a = 123 ] ; then
echo equal123
fi

[macg@machome ~]$ sh test.sh
input a:
123
input is 123
equal123

   = 作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格)
[macg@machome ~]$ vi test.sh

echo “input your choice:”
read var
if [ $var=”yes” ]
then
echo $var
echo “input is correct”
else
echo $var
echo “input error”
fi [macg@machome ~]$ vi test.sh

echo “input your choice:”
read var
if [ $var = “yes” ]   在等号两边加空格
then
echo $var
echo “input is correct”
else
echo $var
echo “input error”
fi [macg@machome ~]$ sh test.sh
input your choice:
y
y
input is correct
[macg@machome ~]$ sh test.sh
input your choice:
n
n
input is correct
输错了也走then,都走then,为什么?

因为if把$var=”yes”连读成一个变量,而此变量为空,返回1,则走else  [macg@machome ~]$ sh test.sh
input your choice:
y
y
input error
[macg@machome ~]$ sh test.sh
input your choice:
no
no
input error
一切正常 

If  [  $ANS  ]     等价于  if [ -n $ANS ]
如果字符串变量非空(then) , 空(else)
echo “input your choice:”
read ANS

if [ $ANS ]
then
echo no empty
else
echo empth
fi  [macg@machome ~]$ sh test.sh
input your choice:                       回车

empth                                    说明“回车”就是空串
[macg@machome ~]$ sh test.sh
input your choice:
34
no empty
整数条件表达式,大于,小于hell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt
[macg@machome ~]$ vi test.sh

echo “input a:”
read a
if  [ $a -ge 100 ] ; then
echo 3bit
else
echo 2bit
fi [macg@machome ~]$ sh test.sh
input a:
123
3bit
[macg@machome ~]$ sh test.sh
input a:
20
2bit
if  test $a  ge 100 ; then

[macg@machome ~]$ sh test.sh
test.sh: line 4: test: ge: binary operator expected

if  test $a -ge 100 ; then

[macg@machome ~]$ sh test.sh
input a:
123
3bit

    逻辑非 !                   条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]                        如果不存在目录$num

逻辑与 –a条件表达式的并列
if [ 表达式1  –a  表达式2 ]

–o 表达式2 ]

逻辑表达式

  •     表达式与前面的=  != -d –f –x -ne -eq -lt等合用

逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列

注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了

 

[macg@mac-home ~]$ vi test.sh
:
echo “input the num:”
read num
echo “input is $num”

if [ -z “$JHHOME” -a -d $HOME/$num ]   如果$JHHOME为空,且$HOME/$num存在
then
JHHOME=$HOME/$num                      
则赋值
fi

echo “JHHOME is $JHHOME”  

———————–
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is

目录-d $HOME/$num   不存在,所以$JHHOME没被then赋值

[macg@mac-home ~]$ mkdir ppp
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is /home/macg/ppp

echo “input your choice:”
read ANS

if [ $ANS=”Yes” -o $ANS=”yes” -o $ANS=”y” -o $ANS=”Y” ]
then
ANS=”y”
else
ANS=”n”
fi

echo $ANS

[macg@machome ~]$ sh test.sh
input your choice:
n
y
[macg@machome ~]$ sh test.sh
input your choice:
no
y
为什么输入不是yes,结果仍是y(走then)
因为=被连读了,成了变量$ANS=”Yes”,而量又空,所以走else

[macg@machome ~]$ vi test.sh

echo “input your choice:”
read ANS    echo “input your choice:”
read ANS

if [ $ANS = “Yes” -o $ANS = “yes” -o $ANS = “y” -o $ANS = “Y” ]
then
ANS=”y”
else
ANS=”n”
fi

echo $ANS [macg@machome ~]$ sh test.sh
input your choice:
no
n
[macg@machome ~]$ sh test.sh
input your choice:
yes
y
[macg@machome ~]$ sh test.sh
input your choice:
y
y
test 
条件表达式 作为if条件===================================
if test $num -eq 0      等价于   if [ $num –eq 0 ]
test  表达式,没有 [  ]
if test $num -eq 0
man test
[macg@machome ~]$ man test
[(1)                             User Commands                            [(1)

SYNOPSIS
test EXPRESSION
[ EXPRESSION ]

[-n] STRING
the length of STRING is nonzero          -n和直接$str都是非0条件

-z STRING
the length of STRING is zero

STRING1 = STRING2
the strings are equal

STRING1 != STRING2
the strings are not equal

INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2

INTEGER1 -ge INTEGER2
INTEGER1 is greater than or equal to INTEGER2

INTEGER1 -gt INTEGER2
INTEGER1 is greater than INTEGER2

INTEGER1 -le INTEGER2
INTEGER1 is less than or equal to INTEGER2

INTEGER1 -lt INTEGER2
INTEGER1 is less than INTEGER2

INTEGER1 -ne INTEGER2
INTEGER1 is not equal to INTEGER2

FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2

FILE1 -ot FILE2
FILE1 is older than FILE2

-b FILE
FILE exists and is block special

-c FILE
FILE exists and is character special

-d FILE
FILE exists and is a directory

-e FILE
FILE exists                                 文件存在

-f FILE
FILE exists and is a regular file     文件存在且是普通文件

-h FILE
FILE exists and is a symbolic link (same as -L)

-L FILE
FILE exists and is a symbolic link (same as -h)

-G FILE
FILE exists and is owned by the effective group ID

-O FILE
FILE exists and is owned by the effective user ID

-p FILE
FILE exists and is a named pipe

-s FILE
FILE exists and has a size greater than zero

-S FILE
FILE exists and is a socket

-w FILE
FILE exists and is writable

-x FILE
FILE exists and is executable

&& 如果是“前面”,则“后面”
[ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid    检查 文件是否存在,如果存在就删掉

   ||   如果不是前面后面 [ -f /usr/sbin/dhcpd ] || exit 0    检验文件是否存在,如果存在就退

     [ -z “$1” ] && help                 如果第一个参数不存在(-z  字符串长度为0 )
[ “$1” = “-h” ] && help                        如果第一个参数是-h,就显示help

例子
#!/bin/sh
[ -f “/etc/sysconfig/network-scripts/ifcfg-eth1” ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth1cp ifcfg-eth1.bridge /etc/sysconfig/network-scripts/ifcfg-eth1 [ -f “/etc/sysconfig/network-scripts/ifcfg-eth0:1” ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:1

linux(ls、wc、ln、source、bash、du、touch、绝对路径、相对路径)新手速成指导

目录

1、ls

1.1、ls -a

1.2、ll -a或者ls -a -l

1.3、查看文件夹及文件的各种权限

1.4、chmod +/- x/r/w +文件

1.5、ln -s 文件1(源文件) 文件2(链接文件)

1.6、ls -l -h

2、wc

2.1、wc -w

2.2、wc -l

3、|

4、cat /etc/passwd

5、alias

5.1、 unalias

5.2、如果定义的别名和原linux系统里的命令冲突,会怎样

5.2.1、怎么解决冲突问题呢?

6、vim

6.1、永久修改别名

6.2、执行脚本

6.2.1、source和bash执行脚本的区别?

6.2.2、输出全局变量

6.2.3、bash和source的图片说明

6.2.4、exit

6.3、变量的定义规则

6.3.1、关键字

7、安装python3

7.1、查看python里边的关键字

7.2、退出python的方法

8、du

9、相对路径和绝对路径​

9.1、绝对路径

9.2、相对路径

10、touch

10.1、使用touch创建多个文件

11、date

12、rm

12.1、通配符

12.2、rm -rf 的绝对注意事项

13、read

13.1、read -p

13.2、使用read 给多个变量赋值

14、编写一个脚本实现新建100个指定前缀的文件和100个文件夹

14.1、使变量

15、练习
————————————————
版权声明:本文为CSDN博主「FanMY_71」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_48638643/article/details/121734189

 

 

LINUX tree命令:文件目录结构以树形显示

tree命令可以使文件目录以树形结构显示,非常适合于给别人介绍我们的文件目录的组成框架,而且该命令使用适当的参数可以将命令结果输出到指定路径下的指定文件中保存。
注:此处以centos 7系统为例,在centos 7系统中默认是没有tree这个命令的,需要安装,用下面的命令就可以安装tree这个命令工具

 

sudo yum install tree

安装完成后使用 tree --help 命令可以查看tree命令的使用方法

一、常用指令

  1. tree -a 显示所有文件和目录
  2. tree -d 显示目录名称而非内容
  3. tree -f 在每个文件或目录之前,显示完整的相对路径名称
  4. tree -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/”,”=”,”@”,”|”号
  5. tree -r 以相反次序排列
  6. tree -t 用文件和目录的更改时间排序
  7. tree -L n 只显示 n 层目录 (n 为数字)
  8. tree –dirsfirst 目录显示在前,文件显示在后

二、还可以加的参数

  1. -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合
  2. -C 在文件和目录清单加上色彩,便于区分各种类型
  3. -D 列出文件或目录的更改时间
  4. -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码
  5. -i 不以阶梯状列出文件或目录名称
  6. -I 不显示符合范本样式的文件或目录名称
  7. -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录
  8. -n 不在文件和目录清单加上色彩
  9. -N 直接列出文件和目录名称,包括控制字符
  10. -p 列出权限标示
  11. -P 只显示符合范本样式的文件或目录名称
  12. -q 用”?”号取代控制字符,列出文件和目录名称
  13. -s 列出文件或目录大小
  14. -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码
  15. -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外

三、使用示例

1. 最简单的使用办法是直接输入tree命令,就会自动给我们以树形的形式列出当前目录的文件和文件夹,不加任何参数,它会自动列表当前目录下面所有深度级别的文件和目录
2. tree -L n ,n为数字,表示只查看当前第n级目录和文件
3. tree -L n -C 将目录和文件以不同的颜色区分
4. tree --dirsfirst -L n -C 目录在前文件在后以不同的颜色显示
5. tree --dirsfirst -L n -C -p 目录在前文件在后以不同的颜色显示,带属性

四、导出命令

 

tree --dirsfirst -L 2 -C >./test.md # 导出到当前目录下test.md文件中保存 

linux通配符和正则表达式

1、 通配符

通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。

 

1、1 Shell常见通配符:

通配符

含义

实例

*

匹配 0 或多个字符

a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。

?

匹配任意一个字符

a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。

[list]

匹配 list 中的任意单一字符

a[xyz]b  a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。

[!list]或[^list]

匹配 除list 中的任意单一字符

a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。

[c1-c2]

匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]

a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。

[!c1-c2]或[^c1-c2]

匹配不在c1-c2的任意字符

a[!0-9]b 如acb adb

{string1,string2,…}

匹配 sring1 或 string2 (或更多)其一字符串

a{abc,xyz,123}b 列出aabcb,axyzb,a123b

教你3分钟搞定Linux正则表达式教你3分钟搞定Linux正则表达式

1、2 shell Meta字符(元字符)

shell 除了有通配符之外,还有一系列自己的其他特殊字符。

字符

说明

IFS

由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )

CR

由 <enter> 产生

=

设定变量

$

取变量值或取运算值

>

重定向 stdout

<

重定向 stdin

|

管道符号

&

重导向 file descriptor ,或将命令置于背景执行

( )

将其内的命令置于 nested subshell 执行,或用于运算或命令替换

{ }

将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围

;

在前一个命令结束时,而忽略其返回值,继续执行下一个命令

&&

在前一个命令结束时,若返回值为 true,继续执行下一个命令

||

在前一个命令结束时,若返回值为 false,继续执行下一个命令

!

运算意义上的非(not)的意思

#

注释,常用在脚本中

\

转移字符,去除其后紧跟的元字符或通配符的特殊意义

教你3分钟搞定Linux正则表达式教你3分钟搞定Linux正则表达式教你3分钟搞定Linux正则表达式教你3分钟搞定Linux正则表达式

1、3 转义字符

有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。

 

字符

说明

‘’(单引号)

硬转义,其内部所有的shell 元字符、通配符都会被关掉。

“”(双引号)

软转义,其内部只允许出现特定的shell 元字符:$用于参数替换 `(反单引号,esc键下面)用于命令替换

\(反斜杠)

又叫转义,去除其后紧跟的元字符或通配符的特殊意义

举例:

2、正则表达式

正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,sed等。

另外,这篇文章只针对Linux下的文本过滤工具的正则表达式进行讨论,其他的一些编程语言,如C++(c regex,c++ regex,boost regex),java,python等都有自己的正则表达式库。

简单点来说,正则表达式是对一组正在处理的文本的描述。

例1:查找文件test中出现单词hi,并且若干字符后出现单词Jerry的行

$ grep -E”\<hi\>.+\<Jerry\>” test

ni hao hi nihao Jerrydsfds

 

例2:查找文件test中出现以hi开头的单词,并且若干字符后出现以Jerry结尾的单词的行

grep -E “\<hi.+Jerry\>”test

ni hao hi nihao Jerrydsfds

wo buhao hiwuyanpingjfkjk Jerry

wo henhao hiwuyanJerry

 

在正则表达式的使用过程中,一些字符是以特定方式处理的。最常使用的特殊字符如下:

字符 含义
^ 指向一行的开头
$ 指向一行的结尾
. 任意单个字符
[] 字符范围。如[a-z]

如果想将上述字符用作普通字符,就需要在它们前面加上\字符。例如,如果想使用$字符,你需要将它写为\$

在方括号中还可以使用一些有用的特殊匹配模式,如下:

匹配模式 含义
[:alnum:] 字母与数字字符,如grep[[:alnum:]] words.txt
[:alpha:] 字母
[:ascii:] ASCII字符
[:blank:] 空格或制表符
[:cntrl:] ASCII控制字符
[:digit:] 数字
[:graph:] 非控制、非空格字符
[:lower:] 小写字母
[:print:] 可打印字符
[:punct:] 标点符号字符
[:space:] 空白字符,包括垂直制表符
[:upper:] 大写字母
[:xdigit:] 十六进制数字

另外,如果指定了用于扩展的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式的规则,对于grep命令,我们还需要在这些字符前面加上\,下表是扩展部分一览:

选项 含义
? 最多一次
* 必须匹配0次或多次
+ 必须匹配1次或多次
{n} 必须匹配n次
{n,} 必须匹配n次或以上
{n,m} 匹配次数在n到m之间,包括边界

 

3、通配符和正则表达式比较

(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。

(2)*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式不行,他只匹配任意长度的前面的字符。

 

4、grep

引自:http://hi.baidu.com/hzslqt/blog/item/dbd0ea4e5145f819b3de05d6.html

1. grep简介

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

    grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

    grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

2. grep正则表达式元字符集(基本集)

^       :锚定行的开始 如:’^grep’匹配所有以grep开头的行。

$        :锚定行的结束 如:’grep$’匹配所有以grep结尾的行。

.       :匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。

*       :匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

[]       :匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。

[^]      :匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

.. :标记匹配字符,如’love’,love被标记为1。

\<      :锚定单词的开始,如:’\<grep’匹配包含以grep开头的单词的行。

\>       :锚定单词的结束,如’grep\>’匹配包含以grep结尾的单词的行。

x\{m\}   :重复字符x,m次,如:’o\{5\}’匹配包含5个o的行。

x\{m,\} :重复字符x,至少m次,如:’o\{5,\}’匹配至少有5个o的行。

x\{m,n\} :重复字符x,至少m次,不多于n次,如:’o\{5,10\}’匹配5-10个o的行。

\w       :匹配文字和数字字符,也就是[A-Za-z0-9],如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。

\W       :\w的反置形式,匹配一个或多个非单词字符,如点号句号等。

\b       :单词锁定符,如: ‘\bgrepb\’只匹配grep。

3. 用于egrep和 grep -E的元字符扩展集

+       :匹配一个或多个先前的字符。如:'[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。

?       :匹配零个或多个先前的字符。如:’gr?p’匹配gr后跟一个或没有字符,然后是p的行。

a|b|c    :匹配a或b或c。如:grep|sed匹配grep或sed

()       :分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

x{m},x{m,},x{m,n} :作用同x\{m\},x\{m,\},x\{m,n\}

5. Grep命令选项

   -a或–text   不要忽略二进制的数据。

   -A   <显示列数>或–after-context=<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之后的内容。

   -b或–byte-offset    在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。

   -B<显示列数>或–before-context=<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之前的内容。

   -c或–count   计算符合范本样式的列数。

   -C<显示列数>或–context=<显示列数>或-<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

   -d<进行动作>或–directories=<进行动作>    当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

   -e<范本样式>或–regexp=<范本样式>    指定字符串做为查找文件内容的范本样式。

   -E或–extended-regexp    将范本样式为延伸的普通表示法来使用。

   -f<范本文件>或–file=<范本文件>    指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。

   -F或–fixed-regexp    将范本样式视为固定字符串的列表。

   -G或–basic-regexp    将范本样式视为普通的表示法来使用。

   -h或–no-filename    在显示符合范本样式的那一列之前,不标示该列所属的文件名称。

   -H或–with-filename    在显示符合范本样式的那一列之前,表示该列所属的文件名称。

   -i或–ignore-case    忽略字符大小写的差别。

   -l或–file-with-matches    列出文件内容符合指定的范本样式的文件名称。

   -L或–files-without-match    列出文件内容不符合指定的范本样式的文件名称。

   -n或–line-number    在显示符合范本样式的那一列之前,标示出该列的列数编号。

   -q或–quiet或–silent    不显示任何信息。

   -r或–recursive   此参数的效果和指定“-d recurse”参数相同。

   -s或–no-messages    不显示错误信息。

   -v或–revert-match    反转查找。

   -V或–version   显示版本信息。

   -w或–word-regexp    只显示全字符合的列。

   -x或–line-regexp    只显示全列符合的列。

   -y    此参数的效果和指定“-i”参数相同。

   –help    在线帮助。

6. 实例

    要用好grep这个工具,其实就是要写好正则表达式,下面列几个例子,讲解正则表达式的写法。

$ ls -l | grep ‘^a’

    通过管道过滤ls -l输出的内容,只显示以a开头的行。

$ grep ‘test’ d*

    显示所有以d开头的文件中包含test的行。

$ grep ‘test’ aa bb cc

    显示在aa,bb,cc文件中匹配test的行。

$ grep ‘[a-z]\{5\}’ aa

    显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

$ grep ‘west.*\1’ aa

    如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1’就可以了。

    再讲解一个具体应用的例子。

    查询所有位于当前目录下的.cs文件中的Main,通过grep,可以轻松快速地完成这项任务,命令如下:

grep ‘Main’ *.cs

输出结果为:

ChineseDemo.cs: publicstatic void Main()

RegDemo1.cs: static voidMain(string[] args)

RegDemo2.cs:   public static void Main()

RegDemo3.cs: publicstatic void Main()

    可见,通过grep真的可以找到相关目录中符合条件的所有文件,并能打印出查询到的字符串所位于的那行内容。如果只想确定哪些文件含有Main,而不需打印相应行的内容,那么可以使用以下命令:?

grep –l‘Main’ *.cs

输出结果为:

ChineseDemo.cs

RegDemo1.cs

RegDemo2.cs

RegDemo3.cs

只有相应的文件名称被显示。

    在找到了含有Main字符串的几个文件后,如果想粗略地查看某一具体文件的里源代码的相关信息,比如查看RegDemo1.cs文件中含有Main这一行的前后三行,相关的命令如下:

grep –C 3 ‘Main’ RegDemo1.cs

输出结果为:

class GroupingApp

{

   static void Main(string[] args)

    {

       Reg7();

}

输出结果完全符合需求,static void Main(string[] args)这一行前后三行范围内的所有代码被全部打印出来(第一行是空行)。

    以上的查询字符串没有对查找结果是否为一个完整的单词进行限制,也就是说TheMain和Main_Func都会被认定为查询目标。如果想限定该查询字符串为一个完整单词,那么可以使用\w参数,相关命令如下:

grep –w‘Main’ *.cs

结果为:

ChineseDemo.cs: publicstatic void Main()

RegDemo1.cs: static voidMain(string[] args)

RegDemo2.cs: publicstatic void Main()

RegDemo3.cs: publicstatic void Main()

另外举例如下:

1)显示/etc/passwd中的一位数或两位数(锚定词首、记尾、分组、转义、次数匹配)

2)找出当前系统上用户名和默认shell相同的用户(行首、行尾锚定)(开始单词和结束单词一样)

3)grep配合其它命令的用法,找出本机的IP地址,只显示IP段(管道、cut)

[root@nmshuishui ~]# ifconfig eth0 | grep “inet addr:” | cut -d:-f2 | cut -d’ ‘ -f1

192.168.1.102

touch 权限_Linux权限管理 — 手动创建用户

 

/etc/passwd
[root@wotdd cm]# vim /etc/passwd — 进去编辑 ,在最下面一行添加如下
[root@wotdd cm]# tail -1 /etc/passwd
cm1:x:2002:2002:哈哈哈:/home/cm1:/bin/bash — 将这行内容 , 添加到 passwd 最下面一行
/etc/shadow
[root@wotdd cm]# openssl passwd -1 -salt ‘i have a dream’
Password: qwer
$1$i have a$BLmGsuf34QWUwPA3U4tE50 — 生成的密码注意保存

[root@wotdd cm]# vim /etc/shadow — 进去编辑 , 插入到最后一行
[root@wotdd cm]# tail -1 /etc/shadow
cm1:$1$i have a$BLmGsuf34QWUwPA3U4tE50/:18303:::::: — 插入的数据
制作密码 — 后面失败了…..
openssl passwd 手动生成密码
引言:在Linux系统中我们要向手动生成一个密码可以采用opensll passwd来生成一个密码作为用户账号的密码。

Linux系统中的密码存放在/etc/shadow文件中,并且是以加密的方式存放的,根据加密方式的不同,
所产生的加密后的密码的位数也不同。

openssl passwd的作用是用来计算密码hash的,目的是为了防止密码以明文的形式出现。

语法格式: openssl passwd [option] passwd

openssl passwd常用的选项如下
-1:表示采用的是MD5加密算法。
-salt:指定salt值,不使用随机产生的salt。在使用加密算法进行加密时,即使密码一样,salt不一样,
所计算出来的hash值也不一样,除非密码一样,salt值也一样,计算出来的hash值才一样。
salt为8字节的字符串。

示例
[root@wotdd cm]# openssl passwd -1 -salt ‘i have a dream’ — ‘i have a dream’ 是密码的盐
Password: qwer — 这里才是密码 , 实际不会显示的
$1$i have a$BLmGsuf34QWUwPA3U4tE50 — 得到的加密字符串

将生成的密码串 , 手动添加到 /etc/shadow 种就可用作用户的登录密码了
/etc/group
[root@wotdd cm]# vim /etc/group
[root@wotdd cm]# tail -1 /etc/group
cm1:x:2002:
/etc/gshadow
[root@wotdd cm]# vim /etc/gshadow
[root@wotdd cm]# tail -1 /etc/gshadow
cm1:!::
创建用户家目录 , 并用用户老家的模板 /etc/skel/ 装修一下 , 注意权限
[root@wotdd cm]# mkdir /home/cm1
[root@wotdd cm]# cp -r /etc/skel/.[!.]* /home/cm1/
[root@wotdd cm]# chmod 700 /home/cm1/
[root@wotdd cm]# chown -R cm1.cm1 /home/cm1/
/var/spool/mail/cm1 用户邮箱文件
[root@wotdd cm]# touch /var/spool/mail/cm1
[root@wotdd cm]# chmod 660 !$
chmod 660 /var/spool/mail/cm1
[root@wotdd cm]# chown cm1.mail /var/spool/mail/cm1
测试账号的登录
cm1@127.0.0.1’s password:
Permission denied, please try again.
cm1@127.0.0.1’s password:
Permission denied, please try again. — emmmmm , 密码加密方式不对

[root@wotdd cm]# passwd cm1 — root 用户 强制修改 cm1 的密码
Changing password for user cm1.
New password: qwer
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: qwer
passwd: all authentication tokens updated successfully.

[root@wotdd cm]# tail -1 /etc/shadow
cm1:$6$CFCCSgeR$jqMI3j.nDE/VLpeWERumu51fbZ6HqDpWbLmD0.gHg1qaZb2nfAgi7jcp.yaVivY3SARq7PdSnkn0m3HY7/Vv71:18593::::::

[root@wotdd cm]# ssh cm1@127.0.0.1
cm1@127.0.0.1’s password: qwer
Last failed login: Fri Nov 27 11:50:55 CST 2020 from localhost on ssh:notty
There were 2 failed login attempts since the last successful login.
[cm1@wotdd ~]$ whoami — 登录成功 , 加密方式有空再研究吧
cm1

————————————————
版权声明:本文为CSDN博主「weixin_39611308」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39611308/article/details/111347796

Linux中挂载详解以及mount命令用法

Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。

注意:“挂载点”的目录需要以下几个要求:

(1)目录事先存在,可以用mkdir命令新建目录;

(2)挂载点目录不可被其他进程使用到;

(3)挂载点下原有文件将被隐藏。

 

挂载与卸载

挂载方法:mount DECE MOUNT_POINT

mount:通过查看/etc/mtab(文章最后会对/etc/mtab有个解释)文件显示当前系统已挂载的所有设备

命令使用格式:mount [-fnrsvw] [-t vfstype] [-o options] device dir

device:指明要挂载的设备;

(1) 设备文件:例如/dev/sda5

(2) 卷标:-L ‘LABEL’, 例如 -L ‘MYDATA’

(3) UUID, -U ‘UUID’:例如 -U ‘0c50523c-43f1-45e7-85c0-a126711d406e’

(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs

dir:挂载点

    事先存在;建议使用空目录;

    进程正在使用中的设备无法被卸载

常用命令选项

    -t vsftype:指定要挂载的设备上的文件系统类型;

    -r: readonly,只读挂载;

    -w: read and write, 读写挂载;

    -n: 不更新/etc/mtab

    -a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)

    -L ‘LABEL’: 以卷标指定挂载设备;

    -U ‘UUID’: 以UUID指定要挂载的设备;

    -B, –bind: 绑定目录到另一个目录上;

注意:查看内核追踪到的已挂载的所有设备:cat /proc/mounts

………………………………………………………………………………………………………………………

    -o options:(挂载文件系统的选项)

      async:异步模式;

      sync:同步模式;

      atime/noatime:包含目录和文件;

      diratime/nodiratime:目录的访问时间戳

      auto/noauto:是否支持自动挂载

      exec/noexec:是否支持将文件系统上应用程序运行为进程

      dev/nodev:是否支持在此文件系统上使用设备文件;

      suid/nosuid:是否支持在此文件系统上使用特殊权限

      remount:重新挂载

      ro:只读

      rw:读写

      user/nouser:是否允许普通用户挂载此设备

      acl:启用此文件系统上的acl功能

注意:上述选项可多个同时使用,彼此使用逗号分隔;

默认挂载选项:defaults:rw, suid, dev, exec, auto, nouser, and async

上述信息可以通过查看超级块信息看到,这里不再对其进行演示。

………………………………………………………………………………………………………………………

命令演示

1、指定文件系统将块设备挂载至指定空文件夹内:演示内容:1)没有指定文件系统,命令是否能正确执行;2)指定错误文件系统,命令是否能正确执行;3)挂载点有内容的文件夹,查看被挂载后其内容是否消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@localhost /] # fdisk -l
...
    设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1             2048     2099199     1048576   83  Linux
/dev/sdb2          2099200     4196351     1048576    5  Extended
/dev/sdb5          2101248     2306047      102400   83  Linux
/dev/sdb6          2308096     2512895      102400   83  Linux
/dev/sdb7          2514944     2719743      102400   83  Linux
/dev/sdb8          2721792     2926591      102400   83  Linux
...
[root@localhost /] # mount /dev/sdb8 /device
[root@localhost /] # df
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/CentOS-root  18307072 4724136 13582936   26% /
devtmpfs                  485368       0   485368    0%  /dev
tmpfs                     500664      84   500580    1%  /dev/shm
tmpfs                     500664    7160   493504    2%  /run
tmpfs                     500664       0   500664    0%  /sys/fs/cgroup
/dev/sda1                  508588  142620   365968   29%  /boot
tmpfs                     100136      20   100116    1%  /run/user/42
tmpfs                     100136       0   100136    0%  /run/user/0
/dev/sdb8                   98988    5280    93708    6%  /device
[root@localhost /] # blkid /dev/sdb8
/dev/sdb8 : UUID= "a3c4bf06-3695-45e8-8a07-a063498f0578"  TYPE= "xfs"
[root@localhost /] # umount /device
[root@localhost /] # mount -t ext2 /dev/sdb8 /device
mount : 文件系统类型错误、选项错误、 /dev/sdb8  上有坏超级块、
        缺少代码页或助手程序,或其他错误
[root@localhost /] # cd /device/
[root@localhost device] # ll
总用量 0
[root@localhost device] # touch 11 22
[root@localhost device] # ll
总用量 0
-rw-r--r--. 1 root root 0 8月  23 10:14 11
-rw-r--r--. 1 root root 0 8月  23 10:14 22
[root@localhost device] # ll
总用量 0
[root@localhost device] # ll -a
总用量 4
drwxr-xr-x.  2 root root    6 8月  23 09:27 .
dr-xr-xr-x. 21 root root 4096 8月  23 09:29 ..
[root@localhost device] # cd ..
[root@localhost /] # umount /device/
[root@localhost /] # cd /device/
[root@localhost device] # ll
总用量 0
-rw-r--r--. 1 root root 0 8月  23 10:14 11
-rw-r--r--. 1 root root 0 8月  23 10:14 22

通过上述演示,说明了如下事实:1)没有指定文件系统,块设备也可以正常挂载;2)指定与块设备不一致的文件系统类型则命令报错;3)挂载点有内容的文件夹,在挂载后内容消失,卸载后内容重现,也就是说挂载后会将原文件内容掩盖,但并不对其进行其他操作。

………………………………………………………………………………………………………………………

2、演示内容:1)指定卷标并以只读方式挂载;2)对目录进行挂载操作,查看其与硬链接与软链接有何不同。

[root@localhost device]# blkid /dev/sdb6

/dev/sdb6: LABEL=”sdb6″ UUID=”8284450c-8cb9-45d7-a8b8-ed9ed9ef9e52″ TYPE=”xfs”
[root@localhost device]# mount -L ‘sdb6’ -r /device/
[root@localhost device]# touch /device/33
touch: 无法创建”/device/33″: 只读文件系统
[root@localhost device]# umount /device/
[root@localhost /]# mount -B /etc/ /device/
[root@localhost /]# ll -i /
总用量 64
11341 lrwxrwxrwx.  1 root root    7 7月  19 23:54 bin -> usr/bin
128 dr-xr-xr-x.  4 root root 4096 8月  2 10:09 boot
3 drwxr-xr-x.  19 root root 3300 8月  23 09:10 dev
33554561 drwxr-xr-x. 129 root root 8192 8月  23 09:38 device
33554561 drwxr-xr-x. 129 root root 8192 8月  23 09:38 etc
158 drwxr-xr-x.  42 root root 4096 8月  22 09:00 home

通过上述演示,说明了如下事实:1)指定卷标挂载可行,以只读方式挂载后,无法对挂载点中的内容进行修改、创建等操作;2)目录的挂载实质上是硬链接,挂载后可以对里面的文件内容进行修改与删除。

注:文件夹的挂载在df中并不显示

………………………………………………………………………………………………………………………

 umount命令

解挂文件系统。umount [-ahnrvV][-t 《文件系统类型》][文件系统]

umount可卸除目前挂在Linux目录中的文件系统。

线上在用的nfs访问时出了问题,导致/data1目录ls都无法进行输出,需要进行卸载掉 。而直接卸载时由于目录正被其他进程占用 ,无法直接umount,这里就结合fuser进行umount卸载。

  1、直接卸载

[root@localhost /]# umount /data1/img

umount: /data1/img: device is busy

umount: /data1/img: device is busy

  2、提示被占用,使用强制卸载

[root@localhost /]# umount -f /data1/img

umount2: Device or resource busy

umount: /data1/img: device is busy

umount2: Device or resource busy

umount: /data1/img: device is busy

注:使用-f 参数进行强制卸载时一般建议等一会儿再进行下面的操作,一些情况下处理需要1-2分钟的时间。

  3、使用umount -f,问题依旧。使用fuser命令,先确认有那些进程在占用该目录

[root@localhost /]# fuser -cu /data1/img

/data1/img: 1757c(mysql)

上面查看发现是pid为1757的mysql用户起的进程在占用该目录。

  4、确认mysql所起的进程可以kill 后,可以直接使用fuser 的k参数进行kill (也可以手动停掉1757进程再卸载)

[root@localhost /]# fuser -ck /data1/img

/data1/img: 1757c

注:这里k 就是kill的意思,注意没进行确认前要谨慎使用该参数。

另外,umount异常时,也经常会用到 lsof 指定确认文件被什么进程占用

上面就是Linux使用umount命令强制卸载文件系统的方法,即使提示被占用也照样能够通过命令来卸载。

文章知识点与官方知识档案匹配,可进一步学习相关知识

 


交换分区swap

这里介绍下交换分区,通过实验演示交换分区的创建及挂载

挂载交换分区:

启用:swapon

   swapon [OPTION]… [DEVICE]

    -a:激活所有的交换分区;

    -p PRIORITY:指定优先级;

禁用:swapoff [OPTION]… [DEVICE]

实验演示

1、交换分区的创建:1)新创建一分区,2)修改新分区的类型,改为swap号码为82,3)格式化为swap

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p  primary (1 primary, 1 extended, 2 free)
l  logical (numbered from 5)
Select (default p): l
添加逻辑分区 9
起始 扇区 (2928640-4196351,默认为 2928640):
将使用默认值 2928640
Last 扇区, +扇区 or +size{K,M,G} (2928640-4196351,默认为 4196351):+100M
分区 9 已设置为 Linux 类型,大小设为 100 MiB
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd391e822
设备 Boot      Start        End      Blocks  Id  System
/dev/sdb1            2048    2099199    1048576  83  Linux
/dev/sdb2        2099200    4196351    1048576    5  Extended
/dev/sdb5        2101248    2306047      102400  83  Linux
/dev/sdb6        2308096    2512895      102400  83  Linux
/dev/sdb7        2514944    2719743      102400  83  Linux
/dev/sdb8        2721792    2926591      102400  83  Linux
/dev/sdb9        2928640    3133439      102400  83  Linux
命令(输入 m 获取帮助):t
分区号 (1,2,5-9,默认 9):9
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd391e822
设备 Boot      Start        End      Blocks  Id  System
/dev/sdb1            2048    2099199    1048576  83  Linux
/dev/sdb2        2099200    4196351    1048576    5  Extended
/dev/sdb5        2101248    2306047      102400  83  Linux
/dev/sdb6        2308096    2512895      102400  83  Linux
/dev/sdb7        2514944    2719743      102400  83  Linux
/dev/sdb8        2721792    2926591      102400  83  Linux
/dev/sdb9        2928640    3133439      102400  82  Linux swap / Solaris
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# mkswap /dev/sdb9
正在设置交换空间版本 1,大小 = 102396 KiB
无标签,UUID=74bf2766-a01b-48ea-9082-2fad6b8e06a9

2、挂载交换分区:启用与禁用

[root@localhost ~]# free
total        used        free      shared  buff/cache  available
Mem:        1001332      101756      535892      13424      363684      720328
Swap:      2097148          0    2097148
[root@localhost ~]# swapon /dev/sdb9
[root@localhost ~]# free
total        used        free      shared  buff/cache  available
Mem:        1001332      101716      535924      13424      363692      720368
Swap:      2199544          0    2199544
[root@localhost ~]# swapoff /dev/sdb9
[root@localhost ~]# free
total        used        free      shared  buff/cache  available
Mem:        1001332      102492      535152      13424      363688      719592
Swap:      2097148          0    2097148

实验涉及到的命令小结:

内存空间使用状态:free [OPTION]

    -m: 以MB为单位

    -g: 以GB为单位

文件系统空间占用等信息的查看工具:df

-h: human-readable

-i:inodes instead of blocks

-P: 以Posix兼容的格式输出;

查看某目录总体空间占用状态:du

du [OPTION]… DIR

-h: human-readable

-s: summary

命令总结:mount, umount, free, df, du, swapon, swapoff, fuser


开机自动挂载

如果我们想实现开机自动挂载某设备,只要修改/etc/fstab文件即可。

文件挂载的配置文件/etc/fstab

wKiom1e7vF_iNNTXAAAo2-XXpTo662.gif

查看此文件可知

每行定义一个要挂载的文件系统;

其每行的格式如下

要挂载的设备或伪文件系统  挂载点  文件系统类型  挂载选项 转储频率 自检次序

UUID=6efb8a23-bae1-427c-ab10-3caca95250b1 /boot  xfs    defaults    0 0

要挂载的设备或伪文件系统:设备文件、LABEL(LABEL=””)、UUID(UUID=””)、伪文件系统名称(proc, sysfs)

挂载点:指定的文件夹

   挂载选项:defaults

转储频率

      0:不做备份

      1:每天转储

      2:每隔一天转储

自检次序

      0:不自检

      1:首先自检;一般只有rootfs才用1;


/etc/fstab和/etc/mtab的区别

/etc/fstab文件的作用:

记录了计算机上硬盘分区的相关信息,启动 Linux 的时候,检查分区的 fsck 命令,和挂载分区的 mount 命令,都需要 fstab 中的信息,来正确的检查和挂载硬盘。

/etc/mtab文件的作用

先看它的英文是:

This changes continuously as the file /proc/mount changes. In other words, when filesystems are mounted and unmounted, the change is immediately reflected in this file.

记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是系统准备装载的。 每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。当然我们自己还可以通过读取/proc/mount也可以来获取当前挂载信息

*让普通用户也可以使用mount命令

一、使用root权限,修改mount命名的文件属型。

(base) root@debian:/mnt# /sbin/mount.cifs -V
mount.cifs version: 6.11

方法类似,在root权限下执行:

chmod -v 4755 /usr/sbin/{,u}mount.cifs
二、sudo工具由文件/etc/sudoers进行配置
其实就是编辑这个文件,这个文件的编辑必须必须用visudo这个命令来编辑,不能用其他的记事本

具体操作如下
root下
# visudo
然后找到
root ALL=(ALL) ALL
这一行,在这一行下面添加一行
user1 localhost=/bin/mount
然后保存退出