目录
1. 基本命令
日期
date
日历
cal [month] [year]
cal 2015
cal 10 2015
数据同步写入磁盘
sync
关机
shutdown
重启
reboot
2. 文件相关命令
列出文件
ls -al
修改用户组
chgrp [-R] 用户组名称 文件或目录
修改拥有者
chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:用户组名称 文件或目录
修改权限
一般权限
chmod [-R] 777 文件或目录 # rwxrwxrwx 系数(r:4, w: 2, x: 1)
chmod u=rwx,go=rx 文件或目录 #rwxr-xr-x
chmod a+w 文件或目录 #给owner groud other都加上w权限
chmod u-x 文件或目录 #给owner 减去x权限
特殊权限
SUID、SGID、SBIT(系数分别为,4,2,1)
SUID:仅对二进制程序有效,执行者在执行该文件期间具有该程序拥有者权限
SGID:仅对二进制程序有效,执行者在执行该文件期间具有该程序用户组权限
SBIT:仅对目录有效, 用户在该目录下建立文件,仅有root和该用户才有权利删除该文件
chmod 4755 test # 加入SUID权限 rwsr-xr-x
chmod 6755 test # 加入SUID/SGID权限 rwsr-sr-x
chmod 1755 test # 加入SBIT权限 rwxr-xr-t
切换目录
cd [相对或绝对路径]
显示当前路径
pwd
创建新目录
mkdir test
mkdir -m 711 test
mkdir -p test1/test2/test3
复制文件和目录
cp 源文件 目标文件
-p: 连同文件属性一起复制
-r: 目录的递归复制
-i: 覆盖时询问
-a: 全部属性复制
删除文件和目录
rm 文件或目录
-r: 递归删除
-f: 忽略不存在文件,不报错
移动文件和目录
mv source1 source2 source3 ... 目录
-i: 询问覆盖
-f: 直接覆盖,不询问
获取文件名和目录名
basename 路径
dirname 路径
查看文件
cat
less #可翻页
head -n 10 文件 #查看头部10行
tail -n 10 文件 #查看尾部10行
od -t [acdfox] 文件 #查看非纯文本文件
新建文件或修改文件时间
touch 文件
-d: 后接时间
-c: 仅修改时间,不建立新文件
文件默认权限
umask
umask 002 # rwxrwxr-x 后接数值是对应减掉的权限
查看文件格式
file 文件名
# ascii文件、data文件、二进制文件
查找文件
which command # 查找命令的位置,根据环境变量PTAH查找
whereis 文件和目录名
locate keyword # 根据数据库记录查询, updatedb 更新数据库
-r: 表明后接正则
-l: 输出行数
-i: 忽略大小写
find [PATH] [OPTION] [ACTION]
-mtime n: 在前第n那天被修改的文件
-mtime +n: 在n天前被修改的文件
-mtime -n: 在n天内被修改的文件
-uid 用户id
-gid 用户组id
-user 用户名
-group 用户组名
-name 文件名
-size [+-]文件大小:查找比指定文件size大或者小的文件
-perm mode:权限等于mode的文件
-perm -mode: 权限等于或包含mode的文件
-perm /mode: 包含任一mode权限的文件
# 根目录下找出文件名包含passwd的文件
find / -name passwd
# 根目录下找出在前第三天被修改的文件
find / -mtime 3
# 根目录下找出含有SUID、SGID、SBIT权限的文件
find / -perm /7000
3. 磁盘和文件系统
列出文件系统及其容量
df -h
-h:人性化显示
-i: 显示inode数量
列出目录容量
du -sh 文件和目录
-s: 列出总量
-h:人性化显示
建立链接
ln -s 源文件 目标文件 # 不加-s为硬链接,否则为符号链接
列出系统上磁盘列表
lsblk
4. 压缩和解压缩
压缩
tar -jcv -f filename.tar.bz2 文件或目录
-z: gzip[*.tar.gz]
-J: xz[*.tar.xz]
-j: bzip2[*.tar.bz2]
解压
tar -jxv -f filename.tar.bz2 文件或目录
5. shell
光标操作
Ctrl + a 移动光标到行首
Ctrl + e 移动光标到行尾
Ctrl + k 删除从光标到行尾
Ctrl + u 删除从光标到行首
Ctrl + l 清屏
Ctrl + w 从光标向前删除一个单词
vim 常用命令
0 移动到这一行的最前面字符处
$ 移动到这一行的最后面字符处
G 移动到这个文件的最后一行
gg 移动到这个文件的第一行
n[Enter] 光标向下移动n行
:/word 向下寻找一个名称为word的字符串。例如/mark
:?word 向上寻找一个名称为word的字符串。例如/mark
n 重复前一个查找的操作。如输入/mark后,再按下n,表示继续向下查找“mark”这个字符串
N 反向进行前一个查找操作
yy 复制光标所在的哪一行
nyy 复制光标所在的向下n行
p,P p为将已复制的数据在光标下一行粘贴,P为粘贴在光标上一行。例如,目前光标在第20行,且已经复制了10行数据。则按下p后,那10行数据会粘贴在原本的20行之后,即由21行开始粘贴。但是如果按下P,那么原本的的第20行会被变成30行
dd 删除光标所在的那一整行
ndd 删除光标所在的向下n行
%d 删除整个文件
u 复原上一个操作
. 这是一个小数点。 重复前一个操作的意思
:set nu 显示行号,设置之后,会在每一行的前缀显示该行的行号
查询命令
type 命令
列出环境变量
env
列出所有变量
set
键盘输入读取变量
read 变量名
命令别名设置
alias rm='rm -i'
查看输入的历史命令
history
管道
cat > test # 新建test文件
> 标准输出(覆盖)
>> 标准输出(追加)
< 标准输入(覆盖)
< 标准输入(追加)
查找信息
grep '查找字符或正则' [file or stdin]
排序
sort [file or stdin]
去重
uniq [stdin]
参数代换
xargs 命令
find /usr/sbin -perm /7000 | xargs ls -l
文本处理
sed [n1[,n2]] function [stdin]
function: a新增, c替换, d删除, i插入, p打印, s正则替换
nl /etc/passwd | sed '2a drink tea' # 在第二行后加上drink tea
awk '条件类型1(操作1)条件类型2(操作2)...' [filename | stdin]
NF:每行字段总数
NR:当前为第几行
FS:分隔符
last -5 | awk '{print $1 "\t" $3}' # 打印出last命令第1列和第三列
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' #以:为分隔符,打印符合条件第3列小于10的行中的第1和3列
文件对比
diff fromFile toFile
在当前bash进程中执行shell文件
source xxx.sh
检测文件相关属性
test [options] [文件名]
shell脚本的变量
$0 命令文件名
$1, $2, $3, $4.... 接在后面的参数
$# 参数的个数
$@ 所有参数
shell文件调试
sh [option] 文件名
x: 输出当前执行的命令脚本
v: 输出所有脚本内容
shell语法
数组
array_name=(value1 value2 ... valuen)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
算术运算符
val=`expr 1 + 1`
val=`expr 1 - 1`
val=`expr 1 \* 2`
val=`expr 1 / 2`
[$a 运算符 $b]
关系运算符包括:-eq, -ne, lt, -gt, -le, -ge
布尔运算: !(非运算),-o(或),-a(且)
逻辑运算: &&、||
字符运算: 字符串是否相等(=)、不等(!=)、-n(字符串长度不为0返回true)
条件语句
if [ $a == $b ] then
echo "a 等于 b"
fi
if [ $a == $b ] then
echo "a 等于 b"
elif [ $a -gt $b ] then
echo "a 大于 b"
elif [ $a -lt $b ] then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
case "$site" in
"runoob") echo "菜鸟教程"
;;
"google") echo "Google 搜索"
;;
"taobao") echo "淘宝网"
;;
esac
循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while(( $int<=5 ))
do
echo $int
let "int++"
done
for((i=1;i<=5;i++))
do
echo "这是第 $i 次调用";
done
跳出循环:break
跳到下一循环: continue
函数
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
6. 账号、用户组相关
查看当前用户支持的用户组
groups
切换当前用户用户组(必须是已加入的用户组)
newgrp 用户组名
新增用户
useradd [-u UID] [-g 初始化用户组] [-d 家目录绝对路径] [-s shell] 账号名称
设置或修改密码
paaswd [账号名称]
修改用户账号属性
usermod [options] [账号名称]
删除用户
userdel [-r] [账号名称]
查看用户信息
id 账号名称
finger 账号名称
用户组的增删改
groupadd [-g gid] 用户组名称
groupmod [-g gid] [-n 新组名] 用户组名称
groupdel 用户组名称
切换用户
su [-lm] [-c 命令] 用户名
su - #切换到root
su - zjw #切换到zjw
使用某账号的身份执行命令
sudo [-u 账号] 命令
# 通过/etc/sudoers 来查看用户是否有sudo权限
查看当前登录的用户
who
查看用户登录历史记录
lastlog
last
发送邮件
mail -s 邮件标题 用户
mail -s "hello" zjw < ~/test
7. 计划任务
一次性任务
at [-mldv] 时间
at -c 任务号码
at now + 5 minutes
at -c 1
at 23:00 2020-09-08
列出当前的一次性任务
atq
删除当前的一次性任务
atrm 任务号
在cpu任务负载小于0.8时执行计划任务
batch
循环计划任务
crontab [-u 用户名] [-e | -l | -r]
-e: 编辑
-l: 查看
-r: 删除所有任务
0 12 * * * mail -s "at 12:00" zjw < ./test
# 每天12点都发送邮件到zjw邮箱
0 3,6 * * * 命令
# 每天3点和6点执行命令
20 8-12 * * * 命令
# 8点至12点,每小时的20分都执行命令
*1/5 * * * * 命令
# 每隔5分钟执行命令
# 系统配置文件
/etc/crontab、/etc/cron.d/*
8. 进程
将命令放到后台执行
命令 &
将目前任务放到后台中暂停
[crtl] + z
查看后台任务状态
jobs [-lrs]
取出后台任务
fg %任务号
fg %1 # 取出1号任务
将后台任务状态由暂停转变为运行
bg %任务号
杀掉进程
kill -signal %任务号
killall -signal 命令名称
-1: 重新读取配置文件,reload
-2: ctrl + c
-9: 强制结束
-15: 正常结束
脱机后台运行任务
nohup 命令 &
查看进程
ps -l # 查看当前bash相关的进程
ps aux # 查看系统所有进程
ps -ez # 查看进程的selinux相关信息
状态:
R: 运行
S: 休眠
+: 处于前台
s: 一些子进程的leader进程
动态监测进程状态
top [-d 间隔秒数] [-p 指定PID]
查看进程树
pstree -A [-up]
调整nice值,影响进程执行优先级
# 执行命令时,指定nice值
nice -n 数字 命令
# 调整已有进程的nice值
renice 数字 PID
数字范围: -19 - 20
查看系统信息
uname -a
查看网络连接服务信息
netstat [option]
-a: 列出所有信息
-t: 列出tcp链接
-u: 列出udp链接
-p: 列出pid
-l: 列出正在监听的服务
-n: 显示端口号
发出网络请求
# Get请求
curl https://www.example.com
# POST请求
curl -d'login=emma&password=123'-X POST https://google.com/login
# 带header
curl -H 'Accept-Language: en-US' https://google.com
# 将响应保存为为文件
curl -o example.html https://www.example.com
# 显示响应的头部信息
curl -i https://www.example.com
查看系统资源信息
vmstat
查找进程pid
pidof 程序名
查找进程所使用的文件
lsof [-aUu] [+d 目录]
-a:条件同时成立
-u:接用户名
-U:列出socket文件
+d:后接查找目录
查看/设置SELinux模式
getenforce
# enforcing: 开启并正常运行
# permissive: 开启但不限制,只触发警告
# diabeld: 完全关闭
setenforce [0|1]
# 0: 对应permissive
# 1: 对应enforcing
查看当前SELinux策略
sestatus
查看当前SELinux规则的布尔值
getsebool
9. 服务
管理单一服务
systemctl [命令] [服务unit]
命令:
start 启动服务
stop 关闭服务
restart 重启服务
reload 重新加载配置文件
enable 下次开机时,启动unit
disable 下次开机时,不启动unit
status 列出服务状态
is-active 查看目前有没有运行
is-enable 查看目前有没有启用
mask 注销服务,服务不可被自启动或被唤醒
unmask 取消注销服务
show 查看服务详细信息
服务类型包括:service、socket(内部程序交换)、target(服务集合)、mount(挂载相关)、timer(循环执行的服务)等
服务状态:
active(running、exited、waiting):运行、一次运行、等待执行
inactive:未运行
enabled:开机时会被启动
disabled:开机时不会被启动
static:不可自己启动,可被其他服务唤醒
mask:无论如何都无法启动
# 关闭atd服务
systemctl stop atd.service
查看所有服务
systemctl [命令] [--type=类型] [--all]
命令:
list-units: 列出当前启动的unit,加上--all才会列出没启动的
list-unit-files: 依据/usr/lib/systemd/system/内的文件,进行列出说明
类型: 服务类型 service、socket、target等
查看/设置操作模式 target
systemctl [命令] [操作模式]
命令:
get-default: 取得目前的target
set-default:设置后面接的target为默认模式
isolate: 切换到后接的模式
操作模式:
graphical.target: 图形界面
multi-user.target: 纯命令行
rescue.target:临时系统
emergency.target: 紧急处理
shutdown.target: 关机模式
getty.target: 设置tty数量
快捷操作:
systemctl poweroff 关机
systemctl reboot 重启
systemctl suspend 挂起
systemctl hibernate 休眠
分析服务依赖
systemctl list-dependencies [服务unit] [--reverse]
服务配置文件
位置:/usr/lib/systemd/system/、/etc/systemd/system/
示例配置文件
[Unit] 执行服务依赖性相关
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service] 与执行的命令参数有关
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install] 挂载unit到哪个target
WantedBy=multi-user.target
新增或修改服务配置文件后,使systemd重新读取配置
systemctl daemon-reload
10. 日志
各类服务日志文件常见位置:/var/log/
rsyslog.service 的配置文件: /etc/rsyslog.conf
# info级别以上的mail信息都记录到/var/log/maillog_info中
mail.info /var/log/maillog_info
#重要服务类别
0 kern 内核产生信息
1 user 用户层级产生的信息,例如logger命令
2 mail 邮件
3 daemon 系统服务
4 auth 认证、授权相关
5 syslog rsyslogd程序本身产生的信息
6 lpr 打印机相关
7 news 新闻组
9 cron 计时任务
11 ftp相关任务
16-23 保留给本地终端用户使用
# 信息等级
debug
info
notice
warning
err
crit
alert
emerg
查看日志
journalctl [-nrpf] [--since 起始时间] [--until 终止时间] [选项]
-n 后接显示行数
-r 颠倒顺序,从最新到最旧的信息
-p 后接信息等级,info、err等
-f 持续刷新显示
选项:
_PID=pid 只输出该pid相关信息
_UID=uid 只输出该uid相关信息
_SYSTEM_UNIT=unit.service 只输出该服务相关信息
SYSLOG_FACILITY=[0-23] 只输出对应服务类别的信息
示例
journalctl --since "2020-06-01 00:00:00" --until "2020-06-02 00:00:00"
journalctl --since today
journalctl -p err
journalctl _SYSTEM_UNIT=crond.service -n 10
输出信息到日志保存
logger [-p 服务名称.等级] “信息”
示例
logger -p syslog.info "1234"
11. 内核启动流程、软件编译和安装
Centos Linux内核启动流程:
- BIOS:Basic Input Output System,加载CMOS内主机硬件配置信息,读取MBR(Master Boot Record,主引导记录)中 boot loader
- boot loader: 操作系统启动引导程序
- kernal + inittramfs:操作系统内核、虚拟文件系统用于启动系统模块
- systemd: 启动 default.target 中的各种系统和用户服务
makefile
目标(target): 目标文件1、目标文件2
<tab> gcc -o 建立的可执行文件名称 目标文件1 目标文件2
OBJ = main.o haha.o sin_value.o # 变量
main: ${OBJ}
gcc -o main ${OBJ}
clean: # 清除
rm -f main.o haha.o sin_value.o
详细语法:https://seisman.github.io/how-to-write-makefile/introduction.html
安装软件
yum [选项] [命令] [参数]
选项:
-y: 执行自动提供yes
--installroot=/some/path: 将该软件安装到/some/path
命令:
search: 搜索某个软件
list: 列出目前所有软件与版本
info: 列出某软件的详细信息
provides: 从文件去查找软件
install: 安装
update: 更新
remove: 删除
yum配置文件
/etc/yum.repos.d/CentOS-Base.repo
12. 相关概念及命令扩展阅读
文件系统、inode:https://blog.csdn.net/yuexiaxiaoxi27172319/article/details/45241923、 http://www.ruanyifeng.com/blog/2011/12/inode.html
SELinux: https://zhuanlan.zhihu.com/p/30483108
curl命令:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
磁盘阵列RAID:https://zh.wikipedia.org/wiki/RAID
make命令语法: https://seisman.github.io/how-to-write-makefile/introduction.html
linux 父/子进程: http://wuchong.me/blog/2014/07/24/linux-process-manage/、http://showteeth.tech/posts/36597.html
LVM 逻辑卷管理: https://www.cnblogs.com/sparkdev/p/10130934.html