Linux常用命令和shell命令
1. 文件目录
创建目录
mkdir 目录名1 目录名2 ...
创建多级目录
mkdir -p 目录名
查看当前所在目录
pwd
创建文件
touch 文件名
删除文件/目录
rm [文件|目录]
删除目录
rmdir [目录]
剪切/重命名
mv [文件|目录] [目标路径]
复制文件、目录
cp [文件] [目标路径]
cp -r [目录] [目标路径]
创建软链接文件
ln -s [文件|目录] [软链接名]
文件搜索
find [搜索范围] [选项]
# 选项:
# -name 指定文件名 *:匹配多个字符 ?:单个字符
# -user 指定用户名所有文件
# -size 文件大小
# -type 文件类型 d: 目录 c: 字符装置 b: 区块装置 p: 具名贮列 f: 一般文件 l: 符号连结 s: socket
# and: -a or: -o 非:!
# 例:查找/etc下50M~100M的文件
find /etc -size +50M -a -size -100M
2. 文件权限
u: 所有者 g; 所有组 o: 其他人 a: 所有人( u、g、o )
r = 4 | w = 2 | x = 1 | |
---|---|---|---|
目录 | ls | rm, mkdir, cp, mv | cd |
文件 | cat、more、less | vim | 可执行权限 |
2.1 更改权限
# 第一种
chmod [{u|g|o|a}{+|-|=}{r|w|x}] [文件名|目录名]
# 第二种
chmod [mode=421] [文件名|目录名]
#更改目录下所有文件权限 (-R 递归)
chmod -R [权限] [目录]
2.2 更改所有者
chown 用户名 文件名
2.3 更改所属组
chgrp 组名 文件名
2.4 权限掩码
umask [-S]
# -S 文字方式
3. 用户
3.1 添加用户
useradd 用户名
3.2 添加密码
passwd 用户名
3.3 查看用户
cat /etc/passwd
3.4 删除用户
userdel -r 用户名
3.5 修改账号
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]
3.6 将用户添加到组中
usermod -a -G 组名 用户名
4. 用户组
4.1 添加一个组
groupadd [组名]
4.2 查看组
cat /etc/group
4.3 修改组名
groupmod -n [新组名] [原组名]
4.4 删除组
groupdel [组名]
4.5 查看当前在线账户
who
4.6 查看当前用户及执行命令的消耗时间
w
5. 帮助命令
5.1 获取指令帮助
man [指令名称]
# 回车换行,空格翻页,按q退出
# 查看配置文件详细信息
man [配置文件]
[指令] --help
whatis [指令]
6. 解压和压缩
6.1 压缩
gzip [xxx.gz] [压缩内容] # 只能压缩文件
zip [xxx.zip] [压缩内容] # 压缩文件和目录
bzip2 [选项:-k 保留源文件] [文件] # 只能压缩文件
6.2 解压
gunzip [xxx.gz]
unzip [xxx.zip]
bunzip2 [xxx.bz2]
6.3 打包
tar [选项] [xxx.tar.gz] [打包的内容]
# 例
tar -zcvf etc.tar.gz etc/
tar -jcvf etc.tar.bz2 etc
6.4 解包
# 解压到当前目录
tar -zxvf etc.tar.gz
tar -jxvf etc.tar.bz2
#解压到指定目录
tar -zxvf etc.tar.gz -C [目录]
7. 网络指令
7.1 查看当前网络服务
netstat [选项: -t:tcp -u:udp -l:监听的端口 -r:路由]
8. 外设
# 创建挂载点
mkdir cdrom
mount [-t iso9660] /dev/cdrom /media/cdrom
# 卸载
umount [设备文件/挂载点]
# 不允许在当前光盘目录中卸载
9. 网络指令
9.1 查询当前在线用户
w
who
9.2 发送信息
write [当前在线用户]
# 发送:ctrl+d
# 回到命令行:ctrl+c
9.3 发送广播信息
# wall 全称:write all
wall [发送内容]
9.4 发送邮箱信息
# 发送邮件
mail [用户名]
subject:主题
# ctrl+d 发送
# 接收邮件
mail
# 查看邮件
邮件id
# 显示邮件列表
h
# 删除一条邮件内容
d [邮件id]
9.5 网络配置
# (centos7)
nmtui
# centos6
第一步:执行setup指令,选择网络配置
第二步:选择配置设置
第三步:选择eth0
第四步:网络配置
使用dhcp时 用空格键
9.6 查看用户登录状态
lastlog
10. 关机/重启
1. 服务器不要关机,只能重启
2. 重启之前先关闭服务器上的服务
# 关机
poweroff
shutdown [选项] [时间]
选项: -h 关机 halt
-r 重启
-c 取消
shutdown -h now
halt
# 查看系统级别
cat /etc/inittab
runlevel
init [选项]
0:halt
1:single user mode
2:Multiuser
3:Full multiuser mode
6:reboot
# 重启
reboot
# 注销
logout
11. vim编辑器
11.1 插入
i # 当前光标前
a # 当前光标后
I # 光标所在行最前
A # 光标所在行最后
O # 当前光标行的上一行
o # 当前光标行的下一行
11.2 编辑
x # 删除一个字符
dd # 删除当前行
u # 撤销上一步指令
yy # 复制光标当前一行
p # 粘贴
$ # 回到行尾
0 # 回到行首
11.3 命令
:set nu # 设置行号
:w # 保存
:q # 退出
:qw # 保持并退出
:q! # 强制退出
12. 软件安装
rpm: red hat系
对于大型web架构:主包使用源码包安装,次包使用rpm安装;gcc使用yum安装
包全名:未安装软件使用包全名
包名:已安装软件使用包名
12.1 二进制安装
rpm包安装,系统默认包安装
rpm包安装的依赖关系:
-
线性依赖
a->b->c->d 有些软件的依赖有几十个依赖包
被依赖包安装顺序,从被依赖包依次安装,安装完成后不清楚软件包中间还有那些被依赖的包,这个时候吧安装包重新安装一次。
-
环形依赖
a->b->c->a
一起安装
-
模块依赖
优点: 不需要安装,直接编译,效率高;通过指令直接执行就可以安装
缺点: 不能看到源码;安装过程需要依赖包;安装过程还依赖模块
12.2 源码包安装
-
优点: 可以看到源码,代码开发,便于升级维护,二次开发;裁剪代码;软件服务搭建起来非常干净,安装指定目录
-
缺点: 需要手动编译;编译时间长;编译过程出现问题难以解决
安装步骤:
-
下载 上传
-
解压
tar -zxvf 包全名
3.1. gcc编译器
# 查看
rpm -q gcc
# 安装
yum -y install gcc
# 测试
gcc hello.h
3.2. make编译工具
rpm -q make
yum -y install make
-
编译
-
检测当前编译环境和配置相关安装配置参数
./configure
指定安装路径 一般安装到
/usr/local/
目录./configure --prefix=/usr/local/apach
e -
编译apche
make
-
-
安装apache
make install
-
启动
/usr/local/apache/bin/apachectl start
-
测试
cd /usr/local/apach/htdocs
vim index.html
开启80端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
访问默认页面
-
实现定时检测脚本
编写日志文件
#!/bin/bash
安装crontab 定时插件
设置定时
crontab -e
# {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 0 5 * * * sh /root/bin/backup.sh # 这将会在每天早上5点运行 /root/bin/backup.sh
12.3 光盘安装apache
-
挂载光盘
-
进入光盘中的package目录中安装rpm包
-
rpm -ivh 包全名
-i 安装
-v 显示进度
-h 进度
# 安装依赖 apr-1.4.8-5.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm apr-util-ldap-1.5.2-6.el7.x86_64.rpm postgresql-libs-9.2.24-1.el7_5.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm httpd-tools-2.4.6-90.el7.centos.x86_64.rpm httpd-2.4.6-90.el7.centos.x86_64.rpm
-
-
启动服务
service httpd start / stop / restart
-
访问服务
localhost/index.html
写一个页面 /var/www/index.html
www.rpmfind.netf
12.4 rpm包
# 查询 已安装的包全名
rpm -q [包名]
# 查询 所有已经安装的rpm包
rpm -qa
# 查询 该已安装rpm包涉及到的目录及文件
rpm -ql [包名]
# 查询 该未安装rpm包会涉及到的目录
rpm -qlp [包全名]
# 查询 已安装rpm包信息
rpm -qi [包名]
# 查询 未安装rpm包信息
rpm -qip [包全名]
# 通过路径 查询rpm包
rpm -qf [目录]
# 查询 已安装服务 的依赖
rpm -qR [包名]
# 查询 未安装服务 的依赖
rpm -qRp [包全名]
# 卸载rpm
rpm -e [包名]
# rpm包手机
rpm -Uvh [包名]
#rpm包校验 检查是否被修改
rpm -V [包名]
S.5....T. c /etc/httpd/conf/httpd.conf
s:文件大小发生改变
5:md5校验
T:时间
c:配置文件
d:文档文件
g:ghost 幽灵
/etc/httpd/conf/httpd.conf:被修改文件路径
12.5 提前rpm包内的文件
rpm2cpio 指: rmp to cpio
#从rpm包提取文件
rpm2cpio rpm包路径 | cpio -idv ./文件绝对路径
-i:copy-in模式,还原
-d:按照路径创建文档
-v:显示过程
###例子#####
# 方法一:从rpm包提取文件到当前目录,再拷贝到bin目录
# centos7
rpm2cpio /media/cdrom/Packages/coreutils-8.22-24.el7.x86_64.rpm | cpio -idv ./usr/bin/ls
# centos6
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
cp ./bin/ls /bin/
# 方法二:提取全部,然后移动需要的文件目录到指定目录
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idmv
12.6 yum
yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器
/etc/yum.repos.d/
大型应用服务不提倡yum安装
1. 通过网络yum源安装–网络软件池
# 配置文件
/etc/yum.repos.d/CentOS-Base.repo
优点:软件版本更新比较快
缺点:需要联网,大多数yum源在国外,访问慢
注意:存在操作失误可能导致系统级更新
yum [-y] install [包名]
2. 建立本地yum源安装–光盘
优点:速度快
缺点:软件版本滞后
# 修改网络yum配置 使其失效
mv CentOS-Base, repo CentOS-Base.repo.bak
mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak
mv CentOS-Vault.repo CentOS-Vault.repo.bak
# 修改Centos-Media.repo文件
vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#地址为你自己的光盘挂载地址
#file:///media/cdrom/
#file:///media/cdrecorder/
#注释这两个的不存在地址
gpgcheck=1
enabled=1
#把enabled=0改为enabled=1, 让这个yum源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 验证
yum list
12.7 进程
# 查看进程
ps -el
ps aux
# 查看某个进程
pstree -p | grep httpd
# 分析当前进程服务
top
# 判断服务器的稳定性 >200稳定性好
up 时间 # linux服务器运行的时间长度
# 杀掉进程
kill 进程号
kill -9 进程号 # 强制
kill -1 进程号 # 关闭并重启
12.8 安装apache、mysql、php
yum -y install httpd
yum -y install mysql mysql-server
yum -y install php php-mysql
## apache
service httpd start # 启动apache
cd /var/www/html # 默认访问地址
## mysql
service mysqld start # 启动mysql
mysqladmin -u root -p password "123456" #修改root密码
mysql -u root -p # root 登录
# 创建数据库
create database web_com;
# 创建表
creare table user(id int primary key auto_increment,
username varchar(60),
password varchar(60));
# 插入
insert into user(`username`,`password`) values(`zhangsan`,`123456`)
# 查询
select [字段1,字段2...] from [表名 where 条件]
# 修改
update 表名 set [字段1=内容,...]
# 删除
delete from 表名 [where 条件 ]
# dbms 数据库管理系统
# db 数据库
# table 表
# field 字段
## php
vim /var/www/html/index.php
12.8.1 mysql修改密码
方法1: 用SET PASSWORD命令
mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
方法2:用mysqladmin
mysqladmin -u root password "newpass"
如果root已经设置过密码,采用如下方法
mysqladmin -u root password oldpass "newpass"
方法3: 用UPDATE直接编辑user表
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;
在丢失root密码的时候,可以这样
mysqld_safe --skip-grant-tables&
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';
mysql> FLUSH PRIVILEGES;
13 防火墙配置
systemctl stop firewalld.service
# centos6
iptables -F # 清除防火墙规则
iptables -I INPUT -p tcp --dport 80 -j ACCEPT #允许80通过
13.1 iptables
# 启动
service iptables start
# 保存规则
service iptables save
# iptables常用命令:
iptables -A 将一个规则添加到链末尾
iptables -D 将指定的链中删除规则
iptables -F 将指定的链中删除所有规则
iptables -I 将在指定链的指定编号位置插入一个规则
iptables -L 列出指定链中所有规则
iptables -t nat -L 列出所有NAT链中所有规则
iptables -N 建立用户定义链
iptables -X 删除用户定义链
iptables -P 修改链的默认设置,如将iptables -P INPUT DROP (将INPUT链设置为DROP)
常见设置参数介绍:
--dport 指定目标TCP/IP端口 如 –dport 80
--sport 指定源TCP/IP端口 如 –sport 80
-p tcp 指定协议为tcp
-p icmp 指定协议为ICMP
-p udp 指定协议为UDP
-j DROP 拒绝
-j ACCEPT 允许
-j REJECT 拒绝并向发出消息的计算机发一个消息
-j LOG 在/var/log/messages中登记分组匹配的记录
-m mac –mac 绑定MAC地址
-m limit –limit 1/s 1/m 设置时间策列
-s 10.10.0.0或10.10.0.0/16 指定源地址或地址段
-d 10.10.0.0或10.10.0.0/16 指定目标地址或地址段
-s ! 10.10.0.0 指定源地址以外的
# 查看监听的端口
lsof -i:端口
netstat -lnpt
14. shell脚本
14.1. 执行方式
# 执行方式一:
chmod u+x ./test.sh # 需要可执行权限
./test.sh
#!/bin/bash
echo "hello world"
# 执行方式二: # 不需要修改权限
/bin/sh test.sh
bash test.sh
14.2. 基础
14.2.1. 单引号 双引号
单引号:不解析,直接输出,效率快
双引号:解析变量,效率稍慢
14.2.2. 格式化输出
echo -e "id\tname\tpassword"
-n # 不换行
14.2.3. 字体颜色
echo
14.2.4. 重定向
重定向命令
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
标准的输入操作
指令 | 说明 | |
---|---|---|
0 | stdin | 标准输入 |
1 | stdout | 标准输出 |
2 | stderr | 标准错误输出 |
正确的命令执行写入文件
命令 > 文件 覆盖
命令 >> 文件 追加 $>>
命令 > 文件 2>&1 把正确的指令执行结果或错误的执行结果写入到list文件
分号: 命令1:命令2:命令3 命令之间没有逻辑关系
ls : date
cd : ls : date
逻辑与 &&
命令1 && 命令2 1成功,执行2
命令1 && 命令2 || 命令3 1成功,执行2;否则执行3
或
命令2 || 命令3 都执行
管道符 |
1、查询passwd文件中的root用户
cat /etc/passwd | grep root
grep -n “root” --color=auto /etc/passwd
-n 行号
–color 颜色
1.正确的指令放在correct,错误的放在error
ls >> courrect 2 >> error
2.dd if=/dev/zero of=/tmp/test bs=lk count=100000
/dev/zero 生成空数据流
/dev/null 可以把文件扔到这个文件中
if:源目录文件
of: 目标目录文件
bs: 每次复制1个kb
count: 复制的次数
显示开始的时间,显示复制完结束的时间
date: 命令:date
date && dd if=/dev/zero of=/tmp/test bs=lk count=100000
&& date
3.把用户信息写入一个txt文件,
user表
id name age
1 张三 18
2 李四 20
3 王五 30
从user表中查询比list年龄小的用户
echo -e 'id\tname\tage'
echo -e 'id\tname\tage\n1\t张三\t18\n2\t李四\tage\n3\t王五\t30'
14.2.5 通配符
字符 | 含义 |
---|---|
? | 匹配单个字符 |
* | 匹配零个或多个字符 |
[] | 匹配方括号中的任意一个,不能用于创建目录和文件 |
[a-z] | 在序列中匹配一个字符 |
^ | 取反 |
$:调用变量
set:设置变量的值
unset:取消变量
变量赋值:后面默认的值类型为字符串
``:执行命令,把执行的命令结果赋值给变量
name = `date`
echo $name
( ) : 同 ‘ ‘ , 使 用 ():同``,使用 ():同‘‘,使用()比较容易看,但不兼容部分unix
name = $(date)
#:代表注释
${ }:精确地界定变量范围
$(( )):与整数运算;还可以将其他进制转成十进制数显示出来
14.2.6 运算
算数运算
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` 结果为 30。 |
- | 减法 | `expr $a - $b` 结果为 -10。 |
* | 乘法 | `expr $a * $b` 结果为 200。 |
/ | 除法 | `expr $b / $a` 结果为 2。 |
% | 取余 | `expr $b % $a` 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
num1=1
num2=2
# 一、
declare -i sum=$num1+$num2
# 二、
sum=$(expr $num1+$num2)
# 三、set
sum=$(($num1+$num2))
# 四、
$[$num1+$num2]
注意:乘法加空格需要转义\*
关系运算
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
14.2.7 参数传递
bash test.sh 1 2
# $0=test.sh
# $1=1
# $2=2
注意, 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
14.2.8 条件if
if[ ]
then
...
else
...
fi
if[ ]
then
...
elif[ ]
then
....
else
...
fi
14.2.9 for循环
# 方法一、
for i in {1..4}
do
print 'a'
done
echo 'a'
# 方法二、
for i in $(seq 1 10)
do
echo 'a';
done
# 方法三、 C语言格式
for((i=1;i<=10;i++));
do
echo $(expr $i \* 3 + 1);
done
# for $() 执行命令
x=0
for i in $( ls )
do
x=$(($x+1))
done
echo $x
# 星号
for num in {1..4}
do
for j in $(seq $num 3) # seq 生成数字序列
do
printf '*'
done
echo '*'
done
in
后面代表一个列表,可以使用数字,字符,字符串,以空格分隔
seq
seq [起点] [步长] [终点]
14.2.10 函数参数
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
14.2.11 数组
# 数组定义不需要指定数组长度
name=(1 2 3)
# 通过下表给数组赋值
name[0]="张三"
# 获取数组元素
${name[0]}
# 获取数组全部元素 @和*
${name[@]}
${name[*]}
# 获取数组长度
${#name[@]}
${#name[*]}
# 获取数组某个元素的长度
${#name[0]}
# 数组切片
${name[@]:offset:number}
## offset: 要跳过的元素个数
## number: 要取出的元素个数
# 取偏移量之后的所有元素
${name[@]:offset}
# 向数组中追加元素:
ARRAY[${#ARRAY[*]}]
14.2.12 逻辑判断
括号两边需要加空格
-
判断是否为目录或文件
- 目录: -d [ -d /root ]
- 文件: -f [ -f /. ]
-
判断当前文件的权限是否存在
-
写权限:-w [ -w /tmp/ ]
-
读:-r
-
执行:-x
-
-
字符串比较
- 相等: == 注意:等号两边加空格
- 不等: !=
- 为空: -z
- 非空: -n
-
逻辑判断
- -a and 两个条件同时满足
- -o or 满足一个条件
- ! 非
14.2.13. 文本操作
- 提取行
- cat user | grep age 提取包含age的行
- cat user | grep -v age -v 取反,提取除age行所有
- 提取列
- cut -f3 user 提取第3列
- -d 分隔符,制表符可省略
- awk ‘{print $3}’
- cut -f3 user 提取第3列