设备名称,常见目录
IDE硬盘 ----------/dev/hd[a-d]
SCSI/SATA/USB硬盘-------/dev/sd[a-p]
光驱---------------/dev/cdrom或/dev/hdc
软盘----------/dev/fd[0-1]
打印机(25针)--------/dev/lp[0-2]
打印机(USB)-----------/dev/usb/lp[0-15]
鼠标-------/dev/mouse
- / 根目录
- /boot 启动目录,启动相关文件
- /dev 设备文件
- /etc 配置文件
- /home 普通用户的家目录,可以操作
- /lib 系统库保存目录
- /mnt 移动设备挂载目录
- /media 光盘挂载目录
- /misc 磁带机挂载目录
- /root 超级用户的家目录,可以操作
- /tmp 临时目录,可以操作
- /proc 不能直接操作,保存的是内存的挂载点
- /sys 不能直接操作,保存的是内存的挂载点
- /var 变量
- /bin 普通命令
- /sbin 命令保存目录,级用户才可以执行的命令
- /usr/bin 系统软件资源目录 面向普通用户的系统命令
- /usr/sbin 系统软件资源目录 面向超级用户的系统命令
基本命令
chmod 777 or chmod u+r g+w o+x
ln -s /etc/nginx ~/nginx
tail -f
ls -lh
ls -li
locate a.txt
find . -name lrj.txt
find . -iname lrj.TXT
find . -user root
find . -atime +5 access 五天前
find . -ctime -5 change 五天内
find . -mtime 5 modify 当天
find . -size 100k 大小为100k的文件
find /tmp -size +10k -a -size -20k -exec ls -lh {} \;
-name 查找的文件名 -size文件大小 -iname忽略大小写
-a 并且and -o 跟 或者or
/etc目录下,大于10KB并且小于20KB的文件
exec 对上个命令的结果进行操作
cat a.txt | grep -iv one
chown lrj a.txt
- shutdown -r 22:00 22点重启
- shutdown -h 22:00 22点关机
- init 0 关机
- init 6 重启
w
who
last
lastlog
copy a.txt b.txt -p
copy folder folder1 -r
压缩解压
出现时间先后顺序是:zip => gzip => bz2越晚出来的压缩格式,压缩比例越高
zip 1.zip 1.txt
unzip 1.zip
zip -r book.zip book(是一个文件夹)
unzip book.zip
zip优点:可以压缩文件夹,压缩比例不如其他俩
gzip 1.txt
gzip -d 1.txt.gz(gunzip 也行)
- 压缩后1.txt不见了,解压后1.txt.gz也会被删除
- 但是我们不想被删的话
gzip -c 1.txt > 1.txt.gz
缺点:在压缩文件夹的时候gzip -r,会压缩文件夹里的所有文件。
bzip2 1.txt
bzip2 -d 1.txt.bz2
完全不能压缩目录
tar -cvf 1.tar folder
tart -xvf 1.tar
tar -zcvf 1.tar.gz folder 先打包再gzip
tart -zxvf 1.tar.gz 先解压,再解打包gzip
tar -jcvf 1.tar.bz2 folder 先打包再bzip2
tart -jxvf 1.tar.bz2 先解压,再解打包bzip2
分区内存
df -h
df -T
df -x tmpfs
du -h (-H就是以G为单位)
du -hd 1 . | sort -hr
fisk -l
fdisk /dev/sdb
然后就是不断输入n创建新的分区,指定分区号,起始结束柱面,最后w,写入分区表
如果有创建拓展分区,那么必须创建逻辑分区才能行,逻辑分区的分区号是从5开始的,
也是输入n,在你创建了逻辑分区之后,会有选项让你创建逻辑分区
mkfs.ext3 /dev/sdb1
mkfs -t ext4 /dev/sdb2
mount /dev/sdb1 /mnt/u1
umount /mnt/u1
(/etc/fstab文件就是记录的分区挂载信息文件)
free
第一步:fdisk /dev/sdb 输入t修改,选择要修改的分区号,输入修改后的id类型(swap为82,普通linux分区为83)
第二步:格式化这个分区 mkswap /dev/sdb2
第三步:swapon /dev/sdb2把这个分区挂到交换分区
eg:挂载光驱。建个目录,直接mount /dev/sr0 /mnt/cdrom
MBR分区格式老的,最多只支持4个,所以才会有扩展分区,在拓展分区下可以再创建多个分区。
GPT新的分区格式,无上限。
parted
select /dev/sdc
mklabel gpt
mkpart
用户组
/etc/group
/etc/gshadow
/etc/passwd
/etc/shadow
whoami
id root
groups root
groupadd stu
groupdel 222(组编号)
groupmod -n student stu
useradd -g teacher jack
useradd -d /home/jack jack
usermod -g jack root
userdel jack
passwd jack
su 用户名
vim
a,i,o,s,x,de,db
after在光标后插入
在光标处插入
other 在新一行插入
替换光标所在的字母插入
删除光标所在的字母
删除单词,光标处到单词尾
删除单词,光标处到单词头
:2
/jie
?jie
n/N
lkjh
w下个单词词首,b上个单词词首,e下个单词词尾(大写一样更远一点)
zz zb zt 当前行到屏幕的中间、bottom、top
^光标到当前行行首,$光标到当前行行尾,gg光标到全文行首,G到全文尾
ctrl+f
ctrl+b
ctrl+d
ctrl+u
dd
yy
p
x
u
ZZ
选中任意文本
ctrl v d y p
:%s/old/new/g
:%s/old/new/gc 需要confirm,一个一个自己确认的替换
:2,5s/old/new/g
/demo n下一个 N上一个
权限
chmod xyz 修改对象:x:目录或文件夹所属用户-> y:同组用户 -> z:不同组用户
chmod [ugoa]+/-[rwx]
对于文件夹来讲,r表示能ls,w表示能修改、删除、新增该文件夹及其子目录下的结构(但是如果是操作子文件或文件夹,得有x权限),
x表示能cd进去
注意;没有文件夹的w权限,仍然可以修改该文件夹里的文件的内容。
只是不能改变该文件夹下的目录结构(即子文件夹,子文件,名字、结构、数量都不能变)
- chown zf1 folder
- chown root:root folder
- chgrp zf1 folder
- 创建一个文件默认的权限是是666,但是实际上要减去umask的值
- 创建一个文件夹默认的权限是777,但是实际上要减去umask的值
减的规则我们按照语义化的理解:比如umask是022(000 010 010) -> 意思为:在666的基础上,减去所属组跟其他人的写权限
临时修改umask是 umask 044
永久修改是:/etc/profile
ACL
dumpe2fs -h /dev/sda1
检查输出Default mount options是否带有acl
mount -o remount,acl /dev/sda1
vi /etc/fstab
UUID / ext4 defaults,acl 1 1
mount -o remount /dev/sda1
acl的使用场景:
学生组里有个老师,老师的home目录,自己是7,学生组也是7,可是当另一个用户比如助教来了,只想他有可以读可以写,怎么办呢?如过放进student组,那么多了x权限。放进others里就更坑了,成了除了老师以外所有的用户。
所以我们就使用acl为特定的用户设计权限
setfacl -m u:guest:rw folder
setfacl -m g:guest:rw folder
setfacl -x g:guest folder
getfacl folder
setfacl -m m:rw folder(得在设置acl权限之后设置,不然就会被默认的mask覆盖)
acl也有mask规则,我们设置的acl权限,会&上mask的值,最终的结果,就是最终的权限、
mask的作用其实就是虽然我允许acl权限但是,我不想把所有的控制都交给它,比如我不希望有x权限,我们就设置mask:rw-
setfacl -b folder
setfacl -m d:u:someone:rw folder
setfacl -k folder
eg:
useradd guest
mkdir /home/guest/folder
useradd teacher
groupadd students
mkdir folder
chown teacher:students /home/guest/folder
chmod 770 /home/guest/folder
开始设置
setfacl -m u:guest:rw folder
查看一下
getfacl folder
sudo
有些命令是系统命令,比较危险,比如关机
我们就需要配置文件,使某些用户可以使用某些命令
visudo设置其他用户的命令权限
root ALL = (ALL) ALL
用户名 被管理主机地址=(可使用的身份) 授权命令(绝对路径)
允许lrj这个用户,在127这个ip上,使用root身份,执行useradd命令
lrj 127.0.0.1=(root) /usr/sbin/useradd
(我没成功。。。)
shell
printenv (可以打印单独的环境变量 )或env查看当前shell进程中的环境变量
lirenjie=123,定义shell变量
export lirenjie shell变量导出为环境变量
export -n lirenjie 取消导出为环境变量,还原为shell变量
unset lirenjie 删除定义的变量
- 将一组变量定义传递给命令来运行程序
- env VAR1="value" command_to_run command_options(var1=123 pm2 start xxx.js)env应该可以省略
在bash里可以继续敲bash,子bash会继承父bash的环境变量
history 记录你登录到退出,所有的历史命令
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
默认保存1000条 /etc/profile HISSIZE=10000
标准输出重定向
echo hello > a.txt 覆盖写入
echo hello >> a.txt 追加写入
>只能重定向标准输出,不能重定向标准错误输出,得加2>&1
cat xxx.txt > err.log 2>&1
cat xxx.txt 2> err.log
echo right && cat xx > normal.log 2>err.log
输入重定向
wc -l < a.txt(把a.txt的内容读出来,当参数传给wc命令)
单引号:纯字符串处理
双引号:$ ` \ 有特殊含义,其他和单引号一样
$()、反引号:里边放系统命令
$、
set 查看系统中所有的变量,包括自定义的,也包括系统的
unset 删除变量
set -u
访问不存在的变量就报错了
自定义环境变量
export 变量名=变量值
查看进程树
pstree
进入子bash
bash
常用环境变量---
执行脚本时候的参数:$1 2345...
参数的个数:$#
所有的参数 $* $@
区别:$@可以遍历输出单个参数,$*不能遍历输出单个参数
for i in "$@" (for i in "$*")
do
echo $i
done
$? 上一个执行的命令成功了还是失败了。0成功 非0失败
? 当前进程的id号
$! 上一个后台运行的id号
在后台运行一个脚本 sh xxx.sh &,会返回一个进程号
echo $!打印的就是上一个后台运行的进程的id号
交互式
read -p '请输入第一个数' num1
read -p '请输入第2个数' num2
echo $((num1+num2))
-t 10 超过10秒就退出
-s 输入密码的时候,想看不见
-n 2 指定输入的字符数
echo -e '\n' 换行
表达式求知三种写法:
$(())
$[]
$(expr $num + $num2)
声明age是int,计算的时候,就自动转换
declare -i age
将变量声明为环境变量
declare -x NAME=zhufeng
将变量声明为只读变量
declare -r x
将变量声明为数组-a
数组
names[0]=zhangsan
names[1]=lisi
echo ${names[*]}
环境变量
登录之后会执行:
/etc/profile -----------定义一些系统变量如:umask、USER、HOSTNAE,执行profile.d里的所有sh
~/.bash_profile -----------修改PATH路径,一般我们用户自己配置自己想加的环境变量, 调用 ~/.bashrc
~/.bashrc--------配置alias 改别名,调用 /etc/bashrc
/etc/bashrc --------PS1 登录提示符在这里修改、umask、PATH变量、调用 /etc/profile.d/星.sh文件
source .bash_profile
等价于
. .bash_profile
切换用户的时候只走/etc/bashrc
正则相关
ls /etc/1.t*
grep "^li" 1.txt --color=auto
用:分割符后,提取第一第二列
cat /etc/passwd | cut -f 1,2 -d :
printf能格式化输出(因为df -h分隔符不是固定的,有空格有tab,printf可以将其处理掉,换成用\t分割)
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n") $(df -h | grep /dev/sda1) | cut -f 5 | cut -d %
awk '条件1{动作1} 条件2{动作2}...' 文件名
$0 整行 $1 第一列...
df -h | grep /dev/sda3 | awk '{print $5}'
number.txt里有三行文本,分别是1占一行,2占一行,3占一行,awk跟printf一样,都是一行一行的读
awk '{BEGIN{num=0}{num=num+$1}END{print num}}' number.txt
指定分隔符
awk 'BEGIN{FS=":"}{print $1,$2}' /etc/passwd
带条件的demo
awk '$1>90{print $1"\t优秀"}$2<90{print $2"\t及格"}' score.txt
条件判断
判断可读可写可执行
[ -r number.txt ] && echo 'yse' || echo 'no'
[ -w number.txt ] && echo 'yse' || echo 'no'
[ -x number.txt ] && echo 'yse' || echo 'no'
[ -e number.txt ] && echo 'yse' || echo 'no'
[ -d number.txt ] && echo 'yse' || echo 'no'
[ -f number.txt ] && echo 'yse' || echo 'no'
判断文件older than/newer than/是否是硬链接
[ write.txt -nt read.txt ]&&echo "write is older than read"|| echo "no"
[ read.txt -ot write.txt ]&&echo "read is older than write"|| echo "no"
ln execute.txt execute2.txt
[ execute.txt -ef execute2.txt ]&&echo "execute and execute2.txt are the same"|| echo "no"
判断字否串是否为空
name=lirnejie
[ -z "$name" ]&&echo "yes"|| echo "no"
判断字符串是否为非空
name2=lirnejie
[ "$name" == "$name2" ]&&echo "yes"|| echo "no"
坑shell这个[]里左右必须留空格
--------------------------------------------------------------------------------------------------------
逻辑与
[ 2 -gt 1 -a 3 -gt 2 ]&&echo "yes"|| echo "no"
逻辑或
[ 2 -gt 1 -o 3 -gt 4 ]&&echo "yes"|| echo "no"
逻辑非
[ ! 3 -gt 4 ]&&echo "yes"|| echo "no"
--------------------------------------------------------------------------------------------------------
if [条件判断1]
then
代码体1
elif [条件判断2]
代码体2
else
代码体3
fi
--------------------------------------------------------------------------------------------------------
read -p "yes or no?" -t 30 choose
case $choose in
"yes")
echo 'yes'
;;
"no")
echo "no"
;;
*)
echo other
;;
esac
--------------------------------------------------------------------------------------------------------
for 变量 in 值1 值2 值3
do
代码块
done
while [条件判断式]
do
代码块
done
--------------------------------------------------------------------------------------------------------
function可以省略,调用不加()
sum4(){
r=$(($1+$2))
return $r
}
sum4 2 3
echo $?
软件包的安装
1.rpm包
rpm -ivh xxx.rpm
模块依赖得自己装http://www.rpmfind.net/麻烦
2.yum安装
yum list
yum install
yum remove
yum update
/etc下有yum的配置文件,可以查看yum的配置信息,镜像地址
版本不一定有,软件也不一定有
3.源码安装
安装gcc编译器
yum install gcc
wget https://npm.taobao.org/mirrors/node/v10.15.3/node-v10.15.3.tar.gz 下载源码
解压解打包
软件配置与检查(此处指定了node的安装目录)
./configure --prefix=/usr/local/node/10.15.3(这一步可能会遇到失败,因为有依赖包没安装)
结束后会生成makefile文件
make
make install
Service
系统运行级别
0 关机
1 单用户,类似于Window的安全模式,主要用于系统修复
2 不完全多用户,类似于字符界面,但不包含NFS(Linux和Window进行文件共享)服务
3 完整的命令行模式,就是标准的字符界面
4 系统保留未使用
5 图形界面
6 重启
查看计算机的进程
ps -aux
查看监听的网络端口
netstat -tulnp 列出tcp数据/列出udp数据
(原生的)linux的服务都会在/etc/init.d/
# service xxx是centos 6及以下 自己拓展的命令,别的发行版本不一定有
查询防火墙状态 service iptables status
停止防火墙 service iptables stop
启动防火墙 service iptables start
重启防火墙 service iptables restart
永久关闭防火墙 chkconfig iptables off
永久关闭后启用 chkconfig iptables on
查看防火墙状态 service iptables status
自启动服务(chkconfig是所有发行版都支持的)
chkconfig
开机启动nginx
chkconfig
开机关闭启动nginx
chkconfig nginx off
查看所有服务,无论是开机启动还是不启动
systemctl list-unit-files
添加开机启动
systemctl enable nginx
关闭开机启动
systemctl disable nginx
查看服务状态
systemctl status iptables.service;
关闭某个服务
systemctl stop firewalld.service ;
模拟开机启动
/etc/rc.d/rc.local是系统启动之后把所有的服务都启动完在用户看到登录之前执行的命令
/etc/rc.local
或者添加
chkconfig
进程系统
ps -aux
ps -le
top 会不断的执行,从而刷新最新的情况,使用-n 3 指定执行次数,-b使用批处理模式输出
第一行为任务队列信息
- 系统的当前时间、系统已经运行了x天x小时xx分、当前登录了二个客户端、系统在之前1分钟、5分钟、15分钟的平均负载。一般认为小于1小时负载较小,大于1超过负载
第二行为进程信息
- 系统中的进程总数、正在运行的进程数、睡眠的进程、正在停止的进程、僵尸进程。如果不是0的话要进行检查
第三行为CPU信息
Cpu(s):
0.1%us 用户模式占用的CPU百分比
0.1%sy 系统模式占用的CPU百分比
0.0%ni 改变过优先级的用户进程 占用的CPU百分比
99.7%id 空闲CPU的CPU百分比
0.1%wa 等待输入/输出的进程的占用CPU百分比
0.1%hi 硬中断请求服务占用的CPU百分比
0.1%si 软中断请求服务占用的CPU百分比
0.0%st st(Steal time)虚拟时间百分比,就是当有
第四行为物理内存信息
第五行为交换分区信息
常用的就
1 2 5 9
1、该信号让进程立即关闭,然后重写读取配置文件后重启,平滑重启
2、程序终止信号,用于关闭前台进程,相当于ctrl+c
5、用来立刻结束程序的运行,本信号不能阻塞、处理和忽略,一般用于强制中止
9、正常结束进程的信号,kill命令的默认信号。如果不能正常中止,才会尝试SIGKILL信号
killall
pkill
这种是没有运行的
nice -n -5 service httpd start
这是已经在运行中的
renice -10 pid
执行sh的时候加上&可以在台运行
使用jobs -l查看所有的job
第一列是工作号
fg 工作号 把任务搞前台执行
bg 工作号 把任务搞到后台执行
默认任务跟所在的终端相绑定,终端推出,任务自己也就关闭了
使用nohub sh test.sh &
/etc/rc.d/rc.local是系统启动之后把所有的服务都启动完在用户看到登录之前执行的命令
/etc/rc.local
vmstat
procs r 等待运行的进程数,数量越大,系统就越繁忙
procs b 不可被唤醒的进程数量,数量越大,系统越繁忙
free -h
lsof /usr/local/nginx/sbin/nginx
lsof -c nginx
lsof -u root
在8点过15执行任务 ---> at 20:15 执行的命令
atq看有哪些任务
atrm删除计划任务
能使用at命令的白名单
/etc/at.allow
能禁止at命令的黑单
/etc/at.deny
(白名单存在就忽略黑)
crontab -e进入编辑模式
问题:可能某个时间段停电了,定时任务就没执行。
anacrontab就是解决这个问题的,开机会检查是否已经超过了定时的时间
/etc/cron.{daily,weekly,monthly}只会被anacron调用
/etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22
每隔几天执行 强制延迟时间(分钟) 修改优先级 执行目录下面的所有脚本
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
网络
- ifdown eth0
- ifup eth0
service network restart
ifconfig eth0 172.18.0.254 netmask 255.355.255.0
setup
service network restart
/etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet------------
DEVICE=eth0------------
ONBOOT=yes-----------
BOOTPROTO=static------------
IPADDR=192.168.1.11-------------
NETMASK=255.255.255.0----------
GATEWAY=192.168.1.1----------
DNS1=10.203.104.41---------
HWADDR=00:0C:29:13:5D:74--------
BROADCAST=192.168.1.255------------
NETWORKING=yes 网络功能是否起作用
HOSTNAME=localhost.localdomain 主机名
hostname xxx
service network restart
nameserver 8.8.8.8 DNS服务器
search localhost
nameserver 8.8.8.8
ltunp -> listen tcp udp 不使用域名与服务名,而使用IP地址和端口号 process