文件搜索
find 【查找范围】 【查找类型】
find / -name init -user/group root -type d/f/l -exec ls -l/对结果执行操作 {} \;
-size +204800 -a -409600 同时满足两个条件 -size +204800 -o -409600 满足任意条件
locate 文件名
在文件资料库查找 updatedb 更新资料库
whice 命令
搜索命令所在目录及别名信息
whereis 命令
搜索命令所在目录及帮助文档路径
grep -iv [指定字符串] [文件]
-i 不区分大小写 -v 排除指定字串
例子:grep mysql /usr/local/src/mysql-5.6.39
grep mysql -v ^# /etc/inittab 去掉#号为首字母的行
帮助命令
man 1 命令帮助信息
man 5 配置文件帮助信息
whatis/help [命令] 简单查看命令帮助
apropos [配置文件] 查看配置文件简短信息
[命令] --help 命令选项
help 查看shell内置命令 命令没有路径的为内置命令
用户名管理
useradd 【用户名】 创建一个用户
passwd 【用户名】 设置更改用户密码
who 查看当前登录的用户
w 查看用户详细信息
uptime linux连续运行时间
压缩解压命令
.gz
gzip 只能压缩文件,不保存源文件
gzip [文件名] 压缩文件
gunzip/gzip -d [文件名] 解压缩
tar 打包
-c[打包] -v[显示信息] -f[指定文件名] -x[解包] -j[生成.bz2] -z[生成.gz]
tar -zcvf [压缩后文件名.tar.gz] [打包的目录] 打包
tar -zxvf [需要解压的文件] 解包
.zip
zip -r[压缩目录] 【压缩后的文件名.zip】 【文件或目录】 打包
unzip 【需要压缩的文件】
bzip2 压缩后保留源文件
-k 解压缩后保留源文件
bzip2 -k [文件] 压缩文件
bunzip2 -k [需要解压的文件]
网络命令
write 【用户名】给指定用户发信息,以Ctrl+D 保存退出 必须是在线用户
wall 发广播信息给所有用户
ping -c[指定发送次数] IP地址
ping ip地址 除非Ctrl+C终止否则一直ping
ifconfig 查看当前网络IP
ifconfig [网卡名] [IP地址] 设置临时IP地址
mail 【用户名】 查看发送电子邮件
mail 直接回车接收邮件
last 列出所有用户登录的时间信息与系统重启信息
lastlog 列出所有用户显示最后登录时间
lastlog -u 【用户ID】 查看指定用户最后登录时间
traceroute 【www.baidu.com】显示数据包到主机间的路径,跟踪路由。
netstat 【选项】 显示网络相关信息
-t:tcp 查看tcp协议
-u:udp 查看tcp协议
-l:监听
-r:路由
-n:显示IP地址和端口号
netstat -tlun 查看本机监听的端口
netstat -an 查看本机所有的网络连接
netstat -rn 查看本机路由表
setup 配置网络
service networp restart 重启网络服务
mount 【-t 文件系统】 需要挂载的设备文件 挂载点(目录)
例子:mount -t iso9660 dev/sr0 mnt/cdrom 需要先创建挂载目录为空目录,-t可以省略
umount 卸载挂载文件
格式:umount 挂载的设备文件名 //就可以卸载了
关机重启命令
shutdown -h 20:30/now 定时关机/立即
-r 20:30/now 定时重启/立即
-c 取消前一个关机命令
关机命令
halt
poweroff
init 0
重启命令
reboot
init 6
init后面的数字所代表的系统运行级别
init 0:关机
init 1:单用户
init 2:不完全多用户,不含NFS服务
init 3:完全多用户
init 4:未分配
init 5:图形界面
init 6:重启
修改系统默认运行级别 /etc/inittab 配置文件
id:3:initdefault
runlevel 查询系统运行级别
logout 退出到登录界面
文本编辑器vim
格式: vim 【文件名】
i a o :为插入命令按其中一个就行
esc:光标调到最后一行
q:退出
w:保存
wq:保存退出
!:强制 例子:q! 强制退出
wq! 强制保存退出
set nu 设置行号
set noun 取消行号
$:移至行尾 x:删除字符 u:恢复上一步的操作
0:移至行首 dd:删除一行
map 快捷键 例子:map ^P !zhangtc<ESC>
.vimrc 快捷键永久生效需要自己设置
/home/wuername/.vinrc 普通用户
/root/.vimrc root用户
软件管理
分类:源码包、二进制包(RPM包、系统默认包)
源码包的优点
1、开源,如果有足够的能力,可以修改源代码
2、可以自由选择所需的功能
3、软件是编译安装,所以更适合自己的系统,更加稳定也效率高
4、卸载方便
源码包的缺点
1、安装过程步骤较多,尤其是安装较大的软件集合时,容易出现呢瓶写错误
2、编译过程时间较长,安装比二进制安装时间长
3、因为是编译安装,安装过程中一旦报错新手很难解决。
二进制包的优点
1、包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
2、安装速度比源代码包安装快的多
二进制包的缺点
1、经过编译不再可以看到源代码
2、功能选择不如源码包灵活
3、依赖性
PRM包管理-rpm命令管理
RPM包的命名原则
httpd-2.2.15-15.e16.centos.1.i686.rpm
httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
e16.centos 适合的linux平台
i686 适合的硬件平台
rpm rpm包扩展名
RPM包依赖性
树形依赖 a>b>c
环形依赖 a>b>c>a
模块依赖 模块依赖查询网站 www.rpmfind.net
RPM包的安装和卸载
包全名:操作的包是没有安装的软件包时,使用包全名,而且要注意路径
包名:操作已经安装的软件包时,使用包名。是搜索/var/lib/rpm中的数据库
rpm -ivh 包全名 //安装
-i 安装
-v 显示详细信息
-h 显示进度
--nodeps 不检测依赖性
rpm -Uvh 包全名 //升级
rpm -e 包名 //卸载
RPM包的查询方法
rpm -q 包名 //查询包是否安装
rpm -qa // 查询所有已安装的包
rpm -qi 包名 // 查询软件包详细信息
rpm -qip 包全名 // 查询未安装包信息
rpm -ql 包名 //查询包文件安装位置
rpm -qlp 包全名 // 查询未安装的包信息看看打算安装在哪
rpm -qf 系统文件名 //查询系统文件属于哪个rpm包
rpm -qR 包名 // 查询软件包的依赖性
rpm -qRp 包全名 // 查询未安装软件包的依赖性
RPM包的校验
rpm -V 已安装的包名 //rpm包校验
RPM包中文件提取
rpm2cpio 包全名 | cpio -idv .文件绝对路径
rp2cpio // 将rpm包转换为cpio格式的命令
cpio // 是一个标准工具,用于创建软件档案文件和从档案文件中提取文件
cpio 【选项】 < 【文件|设备】
-i copy-in模式,还原
-d 还原时自动新建目录
-v 显示还原过程
RPM包管理-yum在线管理
setup 网络配置图形界面窗口
1、IP地址配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
把ONBOOT=“no”改为 ONBOOT=“yes”
service network restart 重启网络服务
2、网络yum源
vim /etc/yum.repo.d/CentOS-Base.repo
[nase] 容器名称,一定要放在[]中
name 容器说明,可以自己随便写
mirrorlist 镜像站点,这个可以注释掉
baseurl 我们的yum源服务器地址。默认是centos官方的yum源服务器,是可以用的,可以更换成自己喜欢的yum源地址
enabled 此容器是否生效,如果写成enable=1都是生效,写成enable=0就不生效
gpgcheck 如果是1是指RPM的数字证书生效,如果是0则不生效
gpgkey 数字证书的公钥文件保存位置,不用修改。
yum命令
yum list //获取所有可用的软件包列表
yum search 关键字 // 搜索服务器上所有和关键字相关的包
yum -y install 包名 //安装软件包 -y 自动回答yes // install 安装
yum -y uodate 包名 //安升级软件包 -y 自动回答yes // update 升级
yum -y remove 包名 //卸载软件包 -y 自动回答yes //remove 卸载
yum grouplist //列出所有可用的软件组列表,
yum groupinstall 软件组名 //安装指定软件组,组名可以由grouplist查询出来
yum groupremove 软件组名 //卸载指定软件组
软件组名有空格安装、卸载需要用引号引起来。例子:"软件组名"
光盘yum源搭建
1、挂载光盘
mount /dev/cdrom /mnt/cdrom //挂载光盘
2、让网络yum源文件失效
cd /etc/yum.repos.d //切换到yum.repo.d目录
mv CentOS-Basw.repo CentOS-Basw.repo.bak //用mv 改掉其他yum源文件名称让其失效
3、修改光盘yum源生效
vim /etc/yum.repos.d/CenOS-Media.repo
[c6-media] //容器名称,一定要放在[]中
name=CentOS-$reasever - Media // 容器说明,可以自己随便写
baseurl=file:///mnt/cdrom //我们的yum源服务器地址,挂载点
注释掉不存在的地址目录
gpgcheck=1 //如果是1是指RPM的数字证书生效,如果是0则不生效
enable=1 //如果写成enable=1都是生效,写成enable=0就不生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY=CentOS-6 //数字证书的公钥文件保存位置,不用修改。
源码包和RPM包的区别
1、区别
安装之前的区别:概念上的去呗
安装之后的区别:安装位置不同
2、RPM包安装位置
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件手册保存位置
/usr/share/man/ 帮助文件保存位置
3、源码包安装位置
安装在指定位置当中,一般是/usr/软件名
4、安装位置不同带来的影响
a.RPM包安装的服务可以使用系统服务管理命令(service)来管理。
例如:RPM包安装的Apache的启动方法是:
/etc/rc.d/init.d/httpd start //启动httpd服务
service httpd restart //重启httpd服务
cd /var/www/html //目录下写HTML文件。输入IP地址即可打开。
b.而源码包安装服务的服务则不能被服务管理命令管理,因为没有安装到默认路径中。
所以只能用绝对路径进行服务的管理。
例如:/usr/local/apache2/bin/apachectl starst //启动apachectl服务
源码包安装过程
1.安装准备
安装gcc编辑器 rpm -q gcc //查看是否安装gcc
下载源码包 www.mirror.bit.edu.cn/apache/httpd
2.安装注意事项
源代码保存位置:/usr/local/src/
软件安装位置: /usr/local/
如何确定安装过程报错
a)、安装过程停止并出现error、warning或no的提示。
3.源码包安装过程
a)、下载源码包并上传到服务器
b)、解压缩下载的源码包
du -sh 源码包解压的目录 //查看文件的大小
c)、进入解压缩目录
d)、./configure --prefix=/usr/local/apache2
./configure //软件配置与检查
--prefix=/usr/local/apache2 //定义安装位置
定义需要的功能选项
检测系统环境是否符合安装要求
把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑。
e)、make 编译
出错后 make clear 清空编译产生的临时文件
f)、make install 编译安装
e)、/usr/local/apache2/bin/apachectl starst //启动apache
源码包卸载
rm -rf /usr/local/apache2 //删除安装目录就是卸载
一、脚本安装包
1、脚本安装包并不是独立的软件包类型,常见安装的是源码包。
2、是人为把安装过程写成了自定安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装。
3、非常类似于Windows下软件的安装方式。
二、Webmin的作用
Webmin是一个基于Web的Linux系统管理界面。您就可以通过图形的方式设置用户账号、Apache、DNS/文件共享等服务。
三、Webmin安装过程
1、下载软件 http://sourcforge.net/projects/webadmin/files/webmin/
2、解压缩,并进入解压缩目录
3、执行安装脚本 ./setup.sh 回车为下一步
用户和用户组管理
有空格需要用“”引起来
一、用户配置文件
用户管理简介
1、所以越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范
2、在linux中主要是通过用户配置文件来查看和修改用户信息
用户信息文件:/etc/passwd
第1字段:用户名称
第2字段:密码标志
第3字段:UID(用户ID)
0:超级用户
1-499:系统用户(伪用户)
500-65535:普通用户
第4字段:GID(用户初始组ID)
初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。
附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。
第5字段:用户说明
第6字段:家目录
普通用户:/home/用户名/
超级用户:/root/
第7字段:登陆之后的shell
shell就是Linux的命令解释器
在/etc/passwd当中,出了标准shell是/bin/bash之外,还可以写如/sbin/nologin。
影子文件(密码文件): /etc/shadow 默认权限000
第1字段:用户名
第2字段:加密密码
加密算法升级为SHA512散列加密算法
如果密码位是“!!”或“*”代表没有密码,不能登录
第3字段:密码最后一次修改日期
使用1970年1月1日作为标准时间,每过一天时间戳加1
第4字段:两次密码的修改时间(和第3字段相比)
第5字段:密码有效期(和第3字段相比)
第6字段:密码修改到期前的警告天数(和第5字段相比)
第7字段:密码过期后的宽限天数(和第5字段相比)
0:代表密码过期后立即失效
-1:代表密码永远不会失效
第8字段:账号失效时间
要用时间戳表示
时间戳换算为日期
date -d "1970-01-01 16066 days"
日期换算为时间戳
echo $(($(date --date="2014/01/06" +%s)/86400+1))
第9字段:保留
组信息文件/etc/group
第1字段:组名
第2字段:组密码标志
第3字段:GID
第4字段:组中附加用户
组密码文件/etc/gshadow
第1字段:组名
第2字段:组密码
第3字段:组管理员用户名
第4字段:组中附加用户
用户管理的相关文件
用户的家目录
普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700
超级用户:/root/,所有者和所属组都是root用户,权限是550
用户的邮箱
/var/spool/mail/用户名/
用户模板目录
/etc/skel/ 里面的文件,新建用户目录下默认生成。
用户管理命令
用户添加命令useradd
useradd [选项] 用户名
-u UID:手工指定用户的UID号
-d 家目录:手工指定用户的家目录
-c 用户说明:手工指定用户的说明
-g 组名:手工自定用户的初始组
-G 组名: 指定用户的附加组
-s shell:手工指定用户的登录shell。默认是/bin/bash
用户默认值文件
/etc/default/useradd
GROUP=100 #用户默认组
HOME=/home #用户家目录
INACTIVE=-1 #密码过期宽限天数(shadow文件7字段)
EXPIRE= #密码失效时间
SHELL=/bin/bash #默认shell
SKEL=/etc/skel #默认模板
CREATE_MAIL_SPOOL=yes #是否建立邮箱
/etc/login.defs
PASS_MAX_DAYS 99999 #密码有效期(5)
PASS_MIN_DAYS 0 #密码修改间隔(4)
PASS_MIN_LEN 5 #密码最小5位
PASS_WARN_AGE7 # 密码到期警告
UID_MIN 500 #最小和最大UID范围
GID_MAX 60000
ENCRYPT_METHOD SHA512 #加密模式
修改用户密码passwd
passwd [选项] 用户名
-S 查询用户密码的密码状态。仅root用户可用
-l 暂时锁定用户。仅root用户可用
-u 解锁用户。仅root用户可用
--stdin 可以通过管道符输出的数据作为用户的密码
echo "123" | passwd --stdin zhangtc (shell 脚本)
修改用户信息usermod
usermod [选项] 用户名
-u UID: 修改用户的UID号
-c 用户说明:修改用户的说明
-G 组名: 修改用户的附加组
-L: 临时锁定用户(lock)
-U: 解锁用户锁定(Unlock)
修改用户密码状态chage
chage [选项] 用户名
-l: 列出用户的详细密码状态
-d 日期: 修改密码最后一次更改日期(shadow3字段)
-m 天数:两次密码修改间隔(4字段)
-M 天数: 密码有效期(5字段)
-W 天数: 密码过期前警告天数(6字段)
-I 天数: 密码过期后宽限天数(7字段)
-E 日期: 账号失效时间(8字段)
chage -d 0 用户名 //用户第一次登陆需要修改密码
删除用户userdel
userdel [-r] 用户名
-r 删除用户的同时删除用户的家目录
id 用户名 //查看用户的id
用户切换命令su
su [选项] 用户名
- :选项只使用“-”代表连带用户的环境变量一起切换
-c命令:仅执行一次命令,而不切换用户身份
su - root -c "useradd user3" //不切换用户但调用root身份添加用户
env:查看用户环境变量
用户组管理命令
groupadd [选项] 组名 //添加组
-g GID: 指定组ID
groupmod [选项] 组名 //修改组
-g GID:修改组ID
-n 新组名: 修改组名
groupmod -n test tg //把组名tg修改为test
groupdel 组名 //删除组
gpasswd [选项] 组名 //把用户添加进组或从组中删除
-a 用户名:把用户加入组
-d 用户名: 把用户从租中删除
权限管理
ACL权限简介与开启 // 默认开启
dumpe2fs -h /dev/sda3 //查看分区ACL权限是否开启
dumpe2fs //查询指定分区详细文件系统信息的命令
-h:仅显示超级块中信息,而不是显示磁盘块组的详细信息
mount -o remount,acl / #重新挂载根分区,并挂载加入acl权限,临时生效
永久挂载
vim /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl //加入acl
mount -o remount / #重新挂载文件系统或重启系统,使修改生效
查看与设定ACL权限
getfacl 文件名 //查看ACL权限
setfacl [选项] 文件名 // 设定ACL权限
-m:设定acl权限
setfacl -m u:用户名:rwx 目录 // 给用户设定权限
u:用户名:权限 g:组名:权限 m:rw//最大权限
-x:删除指定的acl权限
-b:删除所有的acl权限
-d:设定默认acl权限
-k:删除默认acl权限
-R:递归设定acl权限
chown root:tgroup /project //chown 所有者:所属组 目录
最大有效权限与删除ACL权限
mask是最大有效权限
mask是用来指定最大有效权限的,如果我给用户赋予了ACL权限是需要和mask的权限“相与”才能得到用户的真正权限。
setfacl -m m:rw 文件 // 修改最大有效权限
删除ACL权限
sefacl -x u:用户名:rwx 文件名 //删除用户权限
sefacl -x g:组名:权限 文件名 //删除组权限
sefacl -b 文件名 //删除所有ACL权限
默认ACL权限和递归ACL权限
递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
setfacl -m u:用户名:权限 -R 文件名 //设置递归权限
文件特殊权限
SetUID的功能
1、只有可以执行的二进制程序才能设定SUID权限
2、命令执行者要对该程序拥有x(执行)权限
3、命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
4、SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码
ll /use/bin/passwd
cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
ll /bin/cats
chmod 4755 文件名 // 设置SetUID
chmod u+s 文件名 // 设置SetUID
危险的SetUID
1、关键的目录应严格控制写权限。比如“/”“/usr”等
2、用户的密码设置要严格遵守密码三原则
3、对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
SetGID针对文件的作用
1、只有可执行的二进制程序才能设置SGID权限
2、命令执行者要对该程序拥有x(执行)权限
3、命令执行在执行程序的时候,组身份升级为改程序文件的属组
4、SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
SetGID针目录的作用
1、普通用户必须对此目录拥有r和x权限才能进入此目录
2、普通用户在此目录中的有效组会变成此目录的属组
3、若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
chmod 2755 文件名 // 设置SetGID
chmod g+s 文件名 // 设置SetGID
Sticky BIT(SBIT粘着位作用)
1、粘着位目前只对目录有效
2、普通用户对该目录拥有w和x权限,即普通用户可以再此目录拥有写入权限
3、如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件,一旦赋予了
粘着位处理root用户可以删除所有文件,普通用户就算拥有w权限也只能删除自己建立的文件,不能删除其他用户建立的文件。
chmod 1755 目录名 // 设置SBID
chmod o+t 目录名 // 设置SBID
chmod 755 目录名 // 取消SBID
chmod o-t 目录名 // 取消SBID
文件系统属性 chattr权限
chattr [+-=] [选项] 文件或目录
+:增加权限 i
-:删除权限 a
=:等于某权限
[选项]
i:如果对文件设置i属性,那么不可以对文件进行删除、改名,也不能添加和修改数据
如果对目录设置i属性,那么只能修改目录下文件的数据但不可以建立和删除文件
a: 如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除数据也不能修改数据
如果对目录设置a属性,那么只可以在目录中建立和修改文件,但不可以删除
查看文件属性
lsattr 选项 文件名
-a:显示所有文件和目录
-d:若目标是目录,仅列出目录本身的属性,而不是子文件的
系统命令sudo权限
sudo权限
1、root把本来只能超级用户执行的命令赋予普通用户执行
2、sudo的操作对象是系统命令
sudo使用
visudo // 修改的是/etc/sudoers文件
root ALL = (ALL) ALL
用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%where ALL = (ALL) ALL
%组名 被管理主机的地址=(可使用的身份) 授权命令 (绝对路径)
sudo -l //查看sudo可使用的命令
sudo /sbin/shutdown -r now //执行sudo必须先打sudo再打命令的绝对路径
文件系统管理
回顾分区和文件系统
分区类型
1、主分区:总共最多只能分四个
2、扩展分区:只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个。但是扩展分区不能存储数据和格式化必须再划分成逻辑分区
3、逻辑分区:逻辑分区是在扩展分区中划分的。如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘Linux最多支持11个逻辑分区
文件系统的常用命令
df [选项] [挂载点] // 查看文件系统
-a:显示所有文件系统信息,包括特殊文件系统,如/proc、/sysfs
-h:使用习惯单位显示容量,如KB、MB、GB等
-T:显示文件系统类型
-m:以MB为单位显示容量
-k:以KB为单位显示容量,默认以KB为单位显示容量
du [选项] [目录或文件名] //查看文件大小
-a:显示每个子文件的磁盘占用量,默认只统计子目录的磁盘占用量
-h:使用习惯单位显示磁盘占用量,如KB、MB、GB等
-s:统计总占用量,而不列出子目录和子文件的占用量
fsck [选项] 分区设备文件名 //修复文件系统命令
-a:不显示用户提示,自动修复文件系统
-y:自动修复。和-a作用一致,不过有些文件系统只支持-y
dumpe2fs 分区设备文件名 //显示磁盘命令状态
挂载命令
查询与自动挂载
mount -l //查看系统已挂载的设备 -l会显示卷名
mount -a //依据配置文件/etc/fstab的内容,自动挂载
mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点
-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3 ext4 iso9660deng文件系统
-L 卷标名:挂载指定卷标的分区,而不是安装设备文件名挂载
-o 特殊选项:可以指定挂载的额外选项
remount 重新挂载分区
exec/noexec 执行/不执行,设定是否可以再文件系统中执行文件,默认是可以的
mount -o remount,noexec /home //执行文件不能再home下执行
挂载光盘
mkdir /mnt/cdrom //建立挂载点
mount -t iso9660 /dev/cdrom /mnt/cdrom //挂载光盘
mount /dev/sr0 /mnt/cdrom
卸载命令
umount 设备文件名或挂载点
umount /mnt/cdrom
挂载U盘
mkdir /mnt/usb //建立挂载点
fdisk -l //查看U盘设备文件名
mount -t vfat /dev/sdb1 /mnt/usb //挂载U盘
umount /mnt/usb //卸载
注意:Linux默认是不支持NTFS文件系统
支持NTFS文件系统
http://www.tuxera.com/community/ntfs-3g-download/ 下载NTFS-3G插件
安装上就行
安装完成后挂载
mount -t ntfs-3g 分区设备文件名 挂载点
fdisk 分区过程
fdisk -l #查询系统当中有多少可以被识别的硬盘
fdisk /dev/sdb #fdisk命令分区
partprobe 重新读取分区表信息
mkfs -t ext4 /dev/sdb1 #格式化分区 扩展分区不支持格式化
mkdir /mnt/fdisk1 #创建挂载点
mount /dev/sdb1 /mnt/fdisk1 挂载
分区的自动挂载和fstab文件修复
/etc/fstab 文件
第1字段:分区设备文件名或UUID (硬盘通用唯一识别码)
第2字段:挂载点
第3字段:文件系统名称
第4字段:挂载参数
第5字段:指定分区是否被dump备份,0代表不备份,1代表每天备份,2代表不定期备份
第6字段:指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,那么当然1的优先级比2高
mount -o remount,rw / #重新挂载
分配swap分区
free #查看内存与swap分区使用状况
cached(缓存):是指把读取出来的数据保存在内存当中,当再次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程
buffer(缓冲):是指在写入数据时,先把分散的写入操作到内存当中,当达到一定程度在集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程
fdisk /dev/sdb #创建一个新的分区将ID号改为swap的id号
mksswap /dev/sdb6 #格式化swap分区
swapon /dev/sdb6 #加入swap分区
swapoff /dev/sdb6 #取消swap分区
shell概述
shell是一个命令解释器,他为用户提供了一个向linux内核发送请求以便运行程序的界面系统程序,用户可以用shell来启动、挂起、停止甚至编写一些程序
shell还是一个功能相当强大的编程语言,易编写,易调试灵活性较强
shell是解释执行脚本语言,在shell中可以直接调用linux命令
shell的分类
Bourne Shell的主文件名为sh,从1979年开始使用。
C Shell主要在BSD版的Umix系统使用,其语法和c语言相类似而得名
shell的两种主要语法
bourne:sh、ksh、bash、psh、zsh
C : csh、tcsh
bash作为linux的shell、/etc/shells
shell脚本的执行方式
ehco [选项] [输出内容]
-e:支持反斜线控制的字符转换
\\:输出\本身
\a:输出警告音
\b:退格键,也就是向左删除键
\c:取消输出行末的换行符。和“-n”选项一致
\e:ESCAPE建
\f:换页符
\n:换行符
\r:回车键
\t:制表符
\v:垂直制表符
\0nnn:按照八进制ASCll码表输出字符,其中0为数字0,nnn是三位八进制数
\xhh:按照十六进制ASCll码表输出字符,其中hh是两位十六进制数
echo -e "ab\bc" #删除左侧字符
echo -e "a\tb\tc\nd\te\tf" #制表符与换行符
echo -e "\e[1;31m abcd \e[0m" #输出颜色
\e[1; #开始颜色输出
\e[0m #结束颜色输出
31m #代表颜色
abcd #输出字符
30m=黑色 31m=红色 32m=绿色 33m=黄色 34m=蓝色
35m=洋红 36m=青色 37m=白色
脚本
vim hello.sh
#!/bin/Bash //必须写
#The first program //注释
echo -e "zhanglaoshi ninshiyige henhao de laoshi" //内容
dos2unix 文件名 //将winwords转换为linux
bash的基本功能
历史命令与命令补全
history [选项] [历史命令保存文件]
-c:清空历史命令
-w:把缓存中的历史命令写入历史命令保存文件 /.bash_history
历史命令默认保存1000条,可以再/etc/profile中修改
历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
Tab建可以补全命令
命令别名与常用快捷键
alias 别名='源命令' #设定别名
alias #查询别名
vim /root/.bashrc //别名永久生效配置文件
unalias 别名 //删除别名
1.第一顺位执行用绝对路径或相对路径执行的命令
2.第二顺位执行别名
3.第三顺位执行bash的内部命令
4.第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
输入输出重定向
键盘 /dev/stdin 0(描述符) 标准输入
显示器 /dev/sdtout 1(描述符) 标准输出
显示器 /dev/sdterr 2(描述符) 标准错误输出
输出重定向
命令>文件 已覆盖的方式把命令的正确输出到指定文件或设备当中
命令>>文件 已追加的方式把命令的正确输出到指定文件或设备当中
错误命2>文件 已覆盖的方式把命令的错误输出到指定文件或设备当中
错误命2>>文件 已追加的方式把命令的错误输出到指定文件或设备当中
正确输出和错误输出同时保存
命令 > 文件 2>&1 //以覆盖的方式把正确输出和错误输出都保存到一个文件当中
命令 >> 文件 2>&1 //以追加的方式把正确输出和错误输出都保存到一个文件当中
命令 &> 文件 //以覆盖的方式把正确输出和错误输出都保存到一个文件当中
命令 &>> 文件 //以追加的方式把正确输出和错误输出都保存到一个文件当中
命令>>文件1 2>>文件2 //把正确的输出追加到文件1,把错误的输出追歼到文件2
dev/null //垃圾箱
输入重定向
wc [选项] [文件名]
-c:统计字节数
-w:统计单词数
-l:统计行数
命令 < 文件 //把文件作为命令的输入
多命令顺序执行与管道符
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与
当命令1正确执行,则命令2才会执行
当命令1执行不正确,则命令2才不会执行
|| 命令1||命令2 逻辑或
当命令1执行不正确,则命令2才会执行
当命令1正确执行,则命令2不会执行
dd if=输入文件 of=输出文件 bs=字节数 count=个数
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例子:date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000;
管道符
命令1 | 命令2 # 命令1的正确输出作为命令2的操作对象
grep [选项] "搜索内容"
-i:忽略大小写
-n: 输出行号
-v:反向查找
--color=auto 搜索出的关键字用颜色显示
通配符与其他的特殊符号
? 匹配任意一个字符
* 匹配0个或任意多个字符,也就是可以匹配任何内容
[] 匹配括号中的任意一个字符例如:[abc]代表匹配一个字符或者是a 或者是b或者是c
[-] 匹配括号中任意一个字符,-代表一个范围,[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符,[^0-9]代表匹配一个不是数字的字符
特殊符号
'' 单引号,在单引号中所有的特殊符号,都是普通符号
"" 双引号,在双引号中所有的特殊符号,都有特殊含义
$ 调用变量的值
# 代表注释
\ 转义符
Bash的变量
用户自定义变量
变量是计算机内存的单元,其中存放的值可以改变,当shell脚本需要保存一些信息时
如一个文件名或是一个数字,就把它存放在一个变量中,每个变量有一个名字,所以很容易
引用它,使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息
变量设置规则
1、变量名称可以有字母、数字和下划线组成,但是不能以数字开头,如果变量是“2name”则是错误的
2、在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
3、变量用等号连接值,等号左右两侧不能有空格
4、变量的值如果有空格,需要使用单引号或双引号包括
5、在变量的值中,可以使用“\”转义符
6、如果需要增加变量的值,那么可以进行变量值得叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含
7、如果把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
8、环境变量名建议大写,便于区分
变量的分类
1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据包
3、位置参数变量:这种变量主要是用来橡胶本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
4、预定义变量:是Bash中已经定义好的变量。变量名不能自定义,变量作用也是固定的
用户自定义变量
变量定义
[root@localhost tmp]# name="shen chao"
变量叠加
[root@localhost tmp]# aa=123
[root@localhost tmp]# aa="$aa"456
[root@localhost tmp]# aa=${aa}789
调用变量
[root@localhost tmp]# echo $aa
变量查看
set //查看变量值
变量删除
unset 变量名
环境变量
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效
如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效
export 变量名=变量值 #申明变量
env #查询变量
unset #删除变量
pstree #查询shell
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PATH:系统查找命令的路径
PATH="$PATH":/root/sh PATH变量叠加路径
PS1='[\u@\h \W]\$ ' 默认就好
位置参数变量
$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,${10}
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+num2))
echo "sum is : $sum"
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#:这个变量代表命令行中所有参数的个数
#!/bin/bash
echo "A total of $# parameters"
#使用$代表所有的个数
echo "The parameters is : $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
for循环
#!/bin/bash
for i in "$*"
do
echo "$i"
done
#$*中所有参数看成是一个整体,所以这个for循环只会循环一次
for y in "$@"
do
echo "$y"
done
#$@中的每个参数都看成式独立的所以“$@”中有几个参数就会循环几次
预定义变量
$? 最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令
正确执行;如果这个变量的值为非0(具体是哪个数有命令自己来决定),则
证明上一个命令执行不正确了。
$$ 当前进程的进程号(PID)
echo $$ 输出当前进程的PID
$! 后台运行的最后一个进程的进程号
echo $! 输出后台运行最后一个进程的进程号
find /root-name hello.sh & 使用find命令在root目录下查找hello.sh文件
& 是把命令放入后台执行
脚本
#!/bin/bash
echo "$$"
#echo $$ 输出当前进程的PID
find /root -name hello &
echo "$!"
#echo $! 输出后台运行最后一个进程的进程号
接收键盘输入
read [选项] [变量名]
-p “提示信息”: 在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息输入
脚本
#!/bin/bash
read -t 30 -p "Please input your name: " name
#“提示请出入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name"
read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,所以我们用“-s”选项隐藏
echo "\n"
echo "Age is: $age"
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n 1 ”选项只接收一个输入字符就会执行,不用回车
echo -e "\n"
echo "Sex is: $gender"
数值运算与运算符
declare申明变量类型
declare [+/-] [选项] 变量名
-:给变量设定类型属性
+:取消变量的类型属性
-i:将变量声明为整数型(integer)
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
aa=11
bb=22
数值运算方法1
declare -i cc="$aa+$bb"
数值运算方法2
dd=$(expr $aa + $bb) 加号两边必须有空格
数值运算方法3
ff=$(($aa+$bb))
ff=$[$aa+$bb]
环境变量配置文件简介
source 配置文件 或 .配置文件 //是配置文件生效
环境变量配置文件中主要是对系统的操作环境生效的系统默认环境变量
比如:PATH HISTSIZE PS1 HOSTNAME等默认环境变量
配置文件
1 /etc/profile
2 /etc/profile.d/*.sh
2 家目录/.bash_profile
3 家目录/.bashrc 定义系统别名
4 /etc/bashrc
环境变量配置文件作用
/etc/profile
USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZ变量
umask
调用/etc/profile.d/*.sh文件
家目录/.bash_profile //调用了家目录下的/.bashrc文件,在PATH变量后面加入了“:$HOME/bin”这个目录
/etc/bashrc
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
其他配置文件和登录信息
/.bash_logout 注销文件
shell登录信息
/etc/issue 本地终端欢迎信息
\d 显示当前系统日期
\s 显示操作系统名称
\l 显示登录的终端号,这个比较常用
\m 显示硬件体系结构,如i386、i686等
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登录用户
/etc/issue.net 远程登录显示欢迎信息
1、 转义符在/etc/issue.net文件中不能使用
2、 是否显示此欢迎信息,有ssh的配置文件/etc/ssh/sshd_config决定
加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
/etc/mote
登录显示欢迎信息
基础正则表达式
1、正则表达式用来在文件中匹配符合条件的字符串。正则是包含匹配。
grep awk sed 等命令可以支持正则表达式
2、通配符用来匹配符合条件的文件名,通配符是完全匹配。ls find cp这
些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
基础正则表达式
* 前一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首, 例如:^hello会匹配以hello开头的行
$ 匹配行尾,例如:hello$会匹配以hello结尾的行
[] 与linux通配符一致
\ 转义符,用于取消特殊符号的含义
\{n\} 表示其前面的字符恰好出现n次。
\{n,\} 表示其前面的字符出现不小于n次
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次
字符截取命令
cut字段提取命令
cut [选项] 文件名
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列
cut -d ":" -f 1,3 /etc/passwd 提取第一列和第三列
printf '输出类型输出格式' 输出内容
输出类型
%ns: 输出字符串。n是数字指代输出几个字符
%ni: 输出整数。n是数字指代输出几个数字
%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数。
如%8.2f代表共输出8位数字。其中两位是小数。6位是整数。
输出格式
\a:输出警告音
\b:输出退格键,也就是Backspace键
\f:清除屏幕
\n:换行
\r:回车,也就是Enter键
\t:水平输出退格键。也就是Tab键
\v:垂直输出退格键,也就是Tab键
printf '%s' $(cat 文件名) 不调整输出格式
printf '%s\t %s\t %s\t %s\t %s\t%s\t %s\t\n' $(cat 文件名) 调整格式输出
awk命令的输出支持print和printf命令
print会在每个输出之后自动加入一个换行符(linux默认没有print命令)
printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
awk '条件1{动作1} 条件2{动作2}...' 文件名
条件(pattem)
一般使用关系表达式作为条件
x>10 判断变量x是否大于10
x>=10 大于等于
x<=10 小于等于
动作(Action)
格式化输出
流程控制语句
awk '{printf $2 "\t" $6 "\n"}' 文件名
df -h | awk '{printf $1 "\t" $5 "\t" $6"\n"}'
BEGIN 开始所有数据读取之前,执行动作,然后再处理后面的动作
awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}' /etc/passwd
END 所有数据执行完之后 在执行动作
awk 'BEGIN {FS=":"} END{printf "aaaaaaaa" "\n"} {printf $1 "\t" $3 "\n"}' /etc/passwd
FS内置变量
为了定义分隔符,默认是空格和制表符
关系运算
cat 文件名 | gerp -v name | awk '$6 >=87 {printf $2 "\n"}'
sed
sed是一种包括在所有UNIX平台(包括linux)的轻量级流编辑器。
sed主要是用来将数据进行选取、替换、删除、新增的命令。
sed [选项] ‘[动作]’ 文件名
选项
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出的屏幕
-e:允许对输入数据应用多条sed命令编辑
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作
a\: 追加,在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
c\:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
i\:插入,在当期行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
d: 删除,删除指定的行
p: 打印,输出指定的行
s: 字串替换,用一个字符串替换另外一个字符串,格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)
sed -n‘2p’文件名 //打印文件的第二行
sed -e 's/linming//g ; s/gao//g' 文件名 //允许多个条件同时执行
字符处理命令
sort [选项] 文件名
-f:忽略大小写
-n:以数值型进行排序,默认使用字符串型排序
-r:反向排序
-t:指定分隔符,默认分隔符是制表符
-k n[,m]:按照指定的字段范围排序,从第n字段开始,m字段结束,(默认到行尾)
sort -t ":" -k 3,3 -n /etc/passwd
wc [选项] 文件名
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
条件判断
按照文件类型进行判断
-d 文件:判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件:判断该文件是否存在,(存在为真)
-f 文件:判断该文件是否存在,并且是否为普通文件(是普通文件为真)
两种判断格式
一、
test -e /root/sh/zhang.txt 判断文件是否存在
echo $? 返回0上一条命令正确 ,返回其他数字上一条命令错误
二、
[ -e /root/sh/zhang.txt ]
echo $?
按照文件权限进行判断
-r:判断文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w:判断文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x:判断文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
[ -w /root/sh/zhang.txt ] && echo yes || echo no
两个文件之间进行比较
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧为真)
文件1 -ef 文件2 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件,这个判断用于判断硬链接很好的方法
[ zhang.txt -nt tie.txt ] && echo yes || echo no
流程控制语句
单分支if条件语句
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点
1、if语句使用fi结尾,和一般语言使用大括号结尾不同
2、[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
3、then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要“;”了
例子:脚本查看根分区使用率是否大于等于80,是的话发送告警
#!/bin/bash
#统计根分区的使用率
rate=$(df -h | grep /dev/mapper/centos-root | awk '{ print $5 }' | cut -d "%" -f 1)
if [ $rate -ge 80 ]
then
echo " waring! /dev/mapper/centos-root is full!! "
fi
双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
例子:备份mysql数据库
#!/bin/bash
#备份mysql数据库
#ntpdate asia.pool.ntp.org &>/dev/null
#同步系统时间
date=$(date +%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /etc )
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d /tmp/dbbak ]
then
echo "Date : $date! " > /tmp/dbbak/db.txt
echo "Date size : $size " >> /tmp/dbbak/db.txt
cd /tmp/dbbak
tar -zcf etc_$date.tar.gz /etc db.txt &>/dev/null
rm -rf /tmp/dbbak/db.txt
else
mkdir /tmp/dbbak
echo "Date : $date! " > /tmp/dbbak/db.txt
echo "Date size : $size " >> /tmp/dbbak/db.txt
cd /tmp/dbbak
tar -zcf etc_$date.tar.gz /etc db.txt &>/dev/null
rm -rf /tmp/dbbak/db.txt
fi
例子:判断Apache是否启动
#!/bin/bash
#判断Apache是否启动
prot=$(nmap -sT 10.110.101.254 | grep tcp | grep http | grep -v http-proxy | awk '{print $2}')
#使用nmap命令扫描服务器,并截取Apache服务的状态,赋予变量prot
if [ "$prot" == "open" ]
then
echo " $(date) httpd is ok!" >> /tmp/httpd_acc.log
else
/usr/sbin/httpd restartt &>/dev/null
echo "$(date) httpd reboot!! " >> /tmp/httpd_err.log
fi
多分支if语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行的程序
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行的程序
...省略更多条件...
else
当所有条件不成立时,最后执行此程序
fi
例子:判断用户输入的是什么文件
#!/bin/bash
#判断用户输入的是什么文件
read -p "Please input a filename : " file
#接收键盘的输入,并赋予file
if [ -z "$file" ]
#判断file是否为空
then
echo " Error,please input a filename"
exit 1
elif [ ! -e "$file" ]
#判断file的值是否存在
then
echo " Your input is not a file!"
exit 2
elif [ -f "$file" ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ]
#判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
case语句
多分支case条件语句
case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,
而if语句可以判断多种条件关系
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例子: 判断用户输入
#!/bin/bash
#判断用户输入
read -p "Please choose yes/no " -t 30 cho
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
esac
for循环语法一
for 变量 in 值1 值2 值3
do
程序
done
例子1
#!/bin/bash
for i in 1 2 3 4 5 6
do
echo $i
done
例子2
#!bin/bash
#批量解压缩脚本
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log
例子3
#!/bin/bash
#打印时间
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
语法二
for (( 初始值;循环控制条件;变量变化))
do
程序
done
例子1
#!/bin/bash
#从1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(($s+$i))
done
echo "The sun of 1+2+3+...+100 is : $s"
例子2
#!/bin/bash
#批量添加指定数量的用户
read -p "Please input user name : " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for((i=1;i<=$num;i=i+1 ))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass | /usr/bin/passwd -- stdin $name$i &>/dev/null
done
fi
fi
while循环与until循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续
直到条件判断式不成立,循环才会停止,这就和for的固定循环不太一样了
while [ 条件判断式 ]
do
程序
done
例子1
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
#如果变量i的值小于等于100.则执行循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is : $s "
until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,
并执行循环程序,一旦循环条件成立,则终止循环
until [ 条件判断式 ]
do
程序
done
例子
#!/bin/bash
#从1加到100
i=1
s=0
until [ $i -gt 100 ]
#循环直到变量i大于100,就停止循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sun is : $s"
linux服务管理
服务的简介和分类
分类
RPM包默认安装的服务
独立的服务
基于xinetd服务
源码包安装的服务
启动与自启动
1、服务启动:就是在当前系统中让服务运行,并提供功能
2、服务自启动:自启动是指让服务在系统开机或重启动之后,随着系统的启动而自动启动服务
查询已安装的服务
RPM包安装的服务
chkconfig --list
#查看服务自启动状态,可以看到所有RPM包安装的服务
源码包安装的服务
查看服务安装位置,一般是/usr/local下
RPM安装服务和源码包安装服务的区别
RPM安装服务和源码包安装服务的区别就是安装位置的不同
源码包安装在指定位置,一般是/usr/local
RPM包安装在默认位置中
RPM包安装服务管理
独立服务的管理
/etc/init.d/:启动脚本位置
/etc/sysconfig/:初始化环境配置文件位置
/etc/:配置文件位置
/etc/xinetd.conf :xinetd配置文件
/etc/xinetd.d/:基于xinetd服务的启动脚本
/var/lib/:服务产生的数据放在这里
/var/log/:日志
独立服务的启动方法
/etc/init.d/独立服务名 start|stop|startus|restart|
service 独立服务名 start|stop|restart|status
独立服务的自启动
chkconfig [--level 运行级别] [独立服务名] [on|off]
修改/etc/rc.d/rc.local文件
使用ntsysv命令管理启动
基于xinetd的服务的管理
安装xinetd与telnet
yum -y install xinetd
yum -y install telnel-server
源码包的安装服务的启动
使用绝对路径,调用启动脚本来启动,不同的源码包的启动脚本不通。可以
查看源码包的安装说明,查看启动脚本的方法。
/usr/local/apche2/bin/apachectl start|stop
源码包服务的自启动
vim /etc/rc.d/rc.local
加入 /usr/local/apche2/bin/apachectl start
让源码包服务被服务管理命令识别
让源码包的apache服务能被service命令管理
ln -s /usr/local/apche2/bin/apachectl /etc/init.d/apache