记录Linux我常用的命令

857 阅读11分钟

设备名称,常见目录

# 设备名称
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 
# 文件大小以k的单位显示
ls -lh
# 文件的id号也给显示出来
ls -li
# 文件名搜索(手动更新执行updatedb)
locate a.txt
# find搜索当前目录下的xxx(按照文件名、忽略大小写、所属用户、访问时间、改变时间、修改时间、按大小搜索)
 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 对上个命令的结果进行操作
# 过滤查找(忽略大小写,排除one之外的文本)
 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用法:
zip 1.zip 1.txt
unzip 1.zip

zip -r book.zip book(是一个文件夹)
unzip book.zip

zip优点:可以压缩文件夹,压缩比例不如其他俩


#gzip用法:
gzip 1.txt
gzip -d  1.txt.gz(gunzip 也行)
- 压缩后1.txt不见了,解压后1.txt.gz也会被删除
- 但是我们不想被删的话
gzip -c 1.txt > 1.txt.gz

缺点:在压缩文件夹的时候gzip -r,会压缩文件夹里的所有文件。

#bzip2用法:
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
#排除这个文件夹tmpfs 
df -x tmpfs 
#查看当前路径下所有文件或文件夹的大小
du -h (-H就是以G为单位)
#查看当前路径,目录深度为1层,按人类能看懂的结果排序,r逆序
du -hd 1 . | sort -hr
# 查看硬盘分区情况
fisk -l
# 对硬盘sdb分区
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
#用户名,密码占位符,用户编号,用户组编号,用户注释信息,用户主目录,shell类型
/etc/shadow
#所有用户的密码信息

#查看当前用户
whoami
#查看root用户的id
id root
#查看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 #删除一个 dw 删除一个 de 删除到end d$ 删除到行末
u #撤销
ZZ #保存退出

选中任意文本
ctrl v   d  y  p

#全局替换
:%s/old/new/g
:%s/old/new/gc 需要confirm,一个一个自己确认的替换
#替换2-5行
: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的基础上,减去所属组跟其他人的写权限

临时修改umaskumask 044
永久修改是:/etc/profile

ACL

#查看分区是否支持acl权限
dumpe2fs -h /dev/sda1
检查输出Default mount options是否带有acl
#临时开启分区的ACL权限
mount -o remount,acl /dev/sda1
#永久开启分区的ACL权限
vi /etc/fstab
UUID /  ext4 defaults,acl  1 1
mount -o remount /dev/sda1

acl的使用场景:
学生组里有个老师,老师的home目录,自己是7,学生组也是7,可是当另一个用户比如助教来了,只想他有可以读可以写,怎么办呢?如过放进student组,那么多了x权限。放进others里就更坑了,成了除了老师以外所有的用户。
所以我们就使用acl为特定的用户设计权限

#设置用户的acl权限(加上-R给子文件也设置相同的acl权限)
setfacl -m u:guest:rw folder
#设置组的acl权限(加上-R给子文件也设置相同的acl权限)
setfacl -m g:guest:rw folder
#删除acl权限
setfacl -x g:guest folder

#查看文件夹的acl信息
getfacl folder

#设置mask的值
setfacl -m m:rw folder(得在设置acl权限之后设置,不然就会被默认的mask覆盖)
acl也有mask规则,我们设置的acl权限,会&上mask的值,最终的结果,就是最终的权限、
mask的作用其实就是虽然我允许acl权限但是,我不想把所有的控制都交给它,比如我不希望有x权限,我们就设置mask:rw-

#删除所有的ACL权限
setfacl -b folder

#默认ACL权限是指如果给父目录设置了默认ACL权限,那么父目录里所有新建的子文件都会继承父目录的ACL权限
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 --list | grep nginx
开机启动nginx
chkconfig --level 2345 nginx on
开机关闭启动nginx
chkconfig nginx off

--cenos7
查看所有服务,无论是开机启动还是不启动
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 --add nginx

进程系统

#查看系统中所有进程,使用BSD操作系统格式
ps -aux
#查看系统中所有进程,使用Linux标准格式
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)虚拟时间百分比,就是当有

第四行为物理内存信息

第五行为交换分区信息


#kill -l 查看总共有哪些kill信号量
常用的就
1  2  5  9
1、该信号让进程立即关闭,然后重写读取配置文件后重启,平滑重启
2、程序终止信号,用于关闭前台进程,相当于ctrl+c
5、用来立刻结束程序的运行,本信号不能阻塞、处理和忽略,一般用于强制中止	
9、正常结束进程的信号,kill命令的默认信号。如果不能正常中止,才会尝试SIGKILL信号

#按照进程名杀死进程
killall
pkill

#进程的优先级
这种是没有运行的
nice -n -5 service httpd start
这是已经在运行中的
renice -10 pid

#jobs
执行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
# /etc/anacrontab: configuration file for anacron

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 最大随机延迟时间(分钟)
RANDOM_DELAY=45
# anacron的执行时间范围是 3:00 ~ 22:00
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 #重启网络服务

# 临时设置eth0网卡的IP地址与子网掩码
ifconfig eth0 172.18.0.254 netmask 255.355.255.0

# setup永久配置IP
setup 
service network restart

# 网络配置文件修改
/etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet------------#网卡类型
DEVICE=eth0------------#网卡接口名称
ONBOOT=yes-----------#系统启动时是否自动加载
BOOTPROTO=static------------#启用地址协议 --static:静态协议 --bootp协议 --dhcp协议
IPADDR=192.168.1.11-------------#网卡IP地址
NETMASK=255.255.255.0----------#网卡网络地址<
GATEWAY=192.168.1.1----------#网卡网关地址
DNS1=10.203.104.41---------#网卡DNS地址
HWADDR=00:0C:29:13:5D:74--------#网卡设备MAC地址
BROADCAST=192.168.1.255------------#网卡广播地址

# /etc/sysconfig/network
NETWORKING=yes 网络功能是否起作用
HOSTNAME=localhost.localdomain 主机名

hostname xxx
service network restart

# DNS配置文件
# cat /etc/resolv.conf
nameserver 8.8.8.8  DNS服务器
search localhost
nameserver 8.8.8.8


# netstat 
ltunp -> listen tcp udp 不使用域名与服务名,而使用IP地址和端口号 process