摘要:关于常用的linux命令记录,以后用到的linux命令尽量记载在这里,不定时更新

批量删除文件

// 批量删除当前目录下以.c结尾的文件,不删除子目录中的文件
find . -name "*.c" -maxdepth 1 | xargs rm -f
find . -maxdepth 1 -name "*.c" -exec rm -f {} \;

// 批量删除当前目录以.c结尾的文件,不删除子目录中的文件
rm -f *.c

批量解压文件

//将/filename文件夹下的文件打包压缩到filename.tar
tar -cvf filename.tar /filename

// 将/www下的所有文件压缩到www1.zip
zip -r /root/www1.zip /www

// 将file1 file2文件添加进filename.zip压缩文件
zip -r filename.zip file1 file2 

//解压filename.tar
tar -xvf filename.tar

// 批量解压当前目录下以.rar结尾的文件
find . -name "*.rar" -exec unrar x {} \;

// 将www1.zip解压到/root/dd目录下,解压后会形成/root/dd/www/文件夹
unzip -o -d /root/dd /root/www1.zip

// 将www1.zip解压到当前目录,会在当前目录形成一个www文件夹
unzip www1.zip

// 从v2ray-linux-64.zip单独提取出来geosite.dat,geoip.dat文件
unzip -o v2ray-linux-64.zip "v2ray" "v2ctl" "geosite.dat" "geoip.dat"

// 1.zip是在windows压缩的,因为编码的问题,需要linux把密码转成gbk,在当成解压密码
unzip -P "$(echo -n 啧啧|iconv -f utf-8 -t gbk)" -O CP936 1.zip

// 将rardir下的所有文件压缩到1.rar
rar a 1.rar rardir

// 将1.rar解压到当前目录下,解压后会在当前目录形成rardir文件夹
rar x 1.rar

// 将1.rar解压到/root/zeze下,解压后会在当前目录形成rardir文件夹
rar x 1.rar /root/zeze

// 将1.rar解压到/root/zeze下,解压后会在当前目录形成rardir文件夹,和上面命令一样
unrar x 1.rar /root/zeze

// 将1.7z解压到/www/downloads/temp下
7za x /www/downloads/1.7z /www/downloads/temp

查找

查找python路径

which  查看可执行文件的位置。
whereis 查看文件的位置。 
locate   配合数据库查看文件位置。
find   实际搜寻硬盘查询文件名称。
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which python
whereis python
locate python

grep

// 在/usr/local/lib/python3.5/dist-packages/Cython下的以.py后缀结尾的文件中寻找字符串docstrings
grep -r --include="*.py" "docstrings" /usr/local/lib/python3.5/dist-packages/Cython
grep -i "root" /etc/passwd  //不区分大小写
grep -n "root" /etc/passwd //显示匹配字段所在行号

chmod

chmod +x 1.bash //给1.bash添加可执行权限

查看占用磁盘大小

df -h //查看磁盘设备以及空间占用情况

fdisk -l //查看磁盘设备以及空间占用情况

du -h --max-depth 1 /www //查看www文件下各个文件占用的空间

查看机器cpu类型

# 显示机器有几个cpu以及cpu的型号
cat /proc/cpuinfo | grep name | cut -f2 -d:

查看操作系统信息

常用的linux命令1.jpg

#显示系统详细信息-依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称
uname -a

最重要的两条命令:
uname -v //显示操作系统的版本,可以定位到操作系统的版本,然后查找漏洞
uname -r //显示操作系统的内核版本号

显示linux内核名称
uname
uname -s

uname命令常用参数:
-a或–all 详细输出所有信息
-m或–machine 显示主机的硬件(CPU)名
-n或-nodename 显示主机在网络节点上的名称或主机名称
-r或–release 显示linux操作系统内核版本号
-s或–sysname 显示linux内核名称
-v 显示显示操作系统是第几个 version 版本
-p 显示处理器类型或unknown
-i 显示硬件平台类型或unknown
-o 显示操作系统名

对用户组的操作

创建一个用户组

# 创建一个名为test1的用户组
groupadd test1

删除一个用户组

# 删除一个名为test1的用户组
groupdel test1

对用户的操作

创建一个用户

# 创建一个名为test1的用户,-m选项表示为其创建用户目录
useradd -m test1

删除一个用户

userdel命令可以用于删除用户帐号及相关档案。
语法:userdel [-r] 用户名
参数:-r 用于彻底删除,用户HOME目录下的档案会被移除,在其他位置上的档案也将一一找出并删除,比如路径/var/mail/用户名 下的邮件。
警告:userdel不允许你移除正在线上的使用者帐号。你必须kill此帐号现在在系统上执行的程序才能进行帐号删除。

# 杀死keepnight用户的全部进程
killall -u keepnight
# 删除一个叫keepnight的用户
userdel keepnight

彻底删除用户

# 杀死keepnight用户的全部进程
killall -u keepnight
# 彻底删除一个叫keepnight的用户
userdel -r keepnight

修改用户所属用户组

# 将test1用户添加到redis组中,注意是覆盖不是追加组
usermod -g redis test1

# 将test1用户添加到redis组中,注意是追加组不是覆盖,可以多次追加
gpasswd -a test1 redis

# 将test1用户添加到redis组中,注意是追加组不是覆盖,多次追加无效
usermod -G redis test1

#  将test1用户从redis组中移除
gpasswd -d test1 redis

设置文件的拥有者和用户组

方式1

# 将linux下的www-data目录的拥有者和用户组设置为www-data
# www-data:www-data 拥有者:用户组
chown -R www-data:www-data /www

方式2

# 将linux下的www-data目录的拥有者设置为www-data
chown -R www-data /www
# 将linux下的www-data目录的用户组设置为www-data
chgrp -R www-data /www

linux查看用户

# linux查看有用的用户(能够登录系统或者使用系统服务)
cat /etc/passwd | grep -v /bin/false | cut -d : -f 1

# linux查看所有用户(只要是个用户就算)
cat /etc/passwd | cut -d : -f 1

linux查看用户组

cat /etc/group | cut -d : -f 1

快速查看nginx页面的访问情况

cd /var/log/nginx && zcat access.log.*.gz | awk '{print $1,$7}' | sort -n | uniq -c | sort -n | tail -n 15

卸载华为云监控

cd /usr/local/uniagent/script
./uninstall.sh

删除卸载软件后残留的配置文件

$ dpkg -l |grep "^rc"|awk '{print $2}' |xargs aptitude -y purge

linux开启root远程登录

sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config;
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config;
service sshd restart

ssh-keygen

-C "test" 选项一定要使用,不然会将自己电脑的电脑名称附加到生成的公钥里面。
//生成rsa私钥和公钥
//-C "test"会把"test"附加在公钥末尾。
//如果不指定,会默认附加自己电脑的电脑名称
//-f ./test8 指定文件保存路径
ssh-keygen -t rsa -C "test" -f ./test8

//更改私钥的密码
//-p 表示更改私钥的密码
//-f /root/your_private_path,指定私钥路径
ssh-keygen -p -f /root/your_private_path

//将openssh格式公钥转换为pem格式公钥
//-e表示将openssh格式公钥转换成pem格式公钥
//-m指定导出的公钥为pem格式
ssh-keygen -f /root/temp/openssh.pub -e -m pem > pulic.pem

//将pem格式公钥转换为openssh格式公钥
//-i 表示将其他格式公钥转换成openssh格式公钥 
//-m指定-f输入的为pem格式公钥
ssh-keygen -f /root/temp/pulic.pem -i -m pem > openssh.pub

终止进程

批量终止进程

# 批量杀死/usr/local/bin/gunicorn开头的进程
killall -9 "/usr/local/bin/gunicorn"

# 批量杀死含有"gunicorn"关键字的进程
ps -ef | grep gunicorn | awk '{ print $2 }' | sudo xargs kill -9

踢除系统当前登录用户

# 使用w命令査询本机已经登录的用户
[root@localhost ~]# w
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash
# 当前主机已经登录了三个root用户,一个是本地终端ttyl登录,另外两个是从192.168.0.100登陆的远程登录                                                            
# 强制杀死从pts/1虚拟终端登陆的进程
# -t 终端号:按照终端号踢出用户;
[root@localhost ~]# pkill -9 -t pts/1
#虚拟终端pts/1的登录进程已经被杀死了
[root@localhost ~]# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 21:27 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.06s 0.00s w

linux系统指标

查看负载

# 说明:系统最近1分钟、5分钟以及15分钟的平均负载值。
# 一核一线程、一核二线程的正常负载值最大分别为1、2,表示系统满负载。
cat /proc/loadavg

需要注意的是loadavg很高,不代表cpu使用率很高,具体可以参考下面这篇文章。
参考自:《面向应用开发者的系统指南》CPU篇之Linux系统平均负载

vmstat

# 每隔两秒采集一次服务器状态,并打印
root@VM-8-10-ubuntu:~# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 165688 184176 2432752    0    0     1    38    5    4  1  1 98  0  0
 0  0      0 163640 184176 2432756    0    0     0   146  915 1307  2  3 96  0  0
 0  0      0 163852 184176 2432756    0    0     0     0  793 1286  2  2 97  0  0
 0  0      0 164812 184176 2432764    0    0     0     0  923 1499  3  2 95  0  0
 0  0      0 164956 184176 2432764    0    0     0   158  876 1456  2  2 96  0  0
 0  0      0 165100 184176 2432776    0    0     0    10  848 1370  2  2 96  0  0

r:表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b:表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free:空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache:cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in:每秒CPU的中断次数,包括时间中断。

cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt:等待IO CPU时间。

参考自:Linux vmstat命令实战详解

查看系统软中断

cat /proc/softirqs
watch -d cat /proc/softirqs