linux常用命令
摘要:关于常用的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:
查看操作系统信息
#显示系统详细信息-依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称
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时间。
查看系统软中断
cat /proc/softirqs
watch -d cat /proc/softirqs
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。