Linux 常用操作指南

大家在工作中肯定少不了跟服务器打交道,对于我来说,各种命令各种参数我常常是记不住的,与其每次上网搜,不如一边学一边记录。


更新历史

  • 2017.07.10: 完成初稿

压缩解压 tar

如果要在服务器之间发送大量数据,肯定少不了压缩和解压这两步,但是 tar 这个命令的参数之多,让我很绝望,于是我发明了一个简单的记忆方法。

使用 tar 命令只要记得参数是『必选+自选+f』即可,我们先来看看『必选!五选一』:

  1. -c 意为 create,表示创建压缩包
  2. -x 意为 extract,表示解压
  3. -t 表示查看内容
  4. -r 给压缩包追加文件
  5. -u 意为 update,更新压缩包中的文件

注意了,上面是一定要五选一的,不能一个都不选,也不能同时选俩。但是自选的部分就可以按照需要挑选了,比如:

  • -z 使用 gzip 属性
  • -j 使用 bz2 属性
  • -Z 使用 compress 属性
  • -v 意为 verbose,显示详细的操作过程
  • -O 将文件输出到标准输出

然后最后一个一定要是 f 后面跟压缩包名(无论是要解压还是要压缩,都是指压缩包的名字)。接下来我们看看具体实例,就很容易理解具体的用法了。

# 假设我们有很多 .md 文件需要打包,那么可以使用
tar -cf posts.tar *.md # c 是创建压缩包,也就是压缩,然后是 f,给出压缩包名,最后是要压缩的文件
# 然后我们发现还有一些 .txt 文件也需要打包进去,那么可以使用
tar -rf posts.tar *.txt # r 是追加文件
# 然后我们发现 hello.md 弄错了,修正后需要更新到压缩包中,可以使用
tar -uf post.tar hello.md # u 是更新
# 压缩好了,我们来看看压缩包的内容,可以使用
tar -tf posts.tar # t 是列出文件内容
# 把压缩包发送到其他位置之后,需要解压,可以使用
tar -xf posts.tar # x 是解压

加入自选参数后的用法(要不要加 v 可以看个人喜好)

# tar.gz 相关
tar -czf posts.tar.gz *.md # 压缩
tar -xzf posts.tar.gz # 解压
# tar.bz2 相关
tar -cjf posts.tar.bz2 *.md # 压缩
tar -xjf posts.tar.bz2 # 解压
# tar.Z 相关
tar -cZf posts.tar.Z *.md # 压缩
tar -xZf posts.tar.Z # 解压

总结一波,遇到不同类型的文件,请用不同的套路来应对:

  • *.tar -> tar -xf
  • *.tar.gz -> tar -xzf
  • *.tar.bz2 -> tar -xjf
  • *.tar.Z -> tar -xZf
  • *.gz -> gzip -d
  • *.rar -> unrar e
  • *.zip -> unzip

空间占用 du

很多时候磁盘被写满了是各种奇怪错误的源头,所以如何快速找到问题所在就很重要了,

# 显示当前文件下 Top 10 空间占用的文件/目录,
# s 表示不显示每个子目录或文件的大小
# h 表示用更加自然的方式显示(比如 K/M/G 这样)
du -sh * | sort -nr | head

系统状态 top

了解系统状态一般少不了 top 命令,虽然基本上不需要做任何操作,但是还是有一些可以自定义的内容的,比如

# 查看某用户的进程
top -u wdxtub
# 进入系统状态显示后,具体值代表的意思是
# PR 进程优先级,越小优先级越高
# VIRT 占用的虚拟内存
# RES 占用的物理内存
# SHR 占用的共享内存
# S 进程状态(S - 休眠,R - 正在运行,Z - 僵死状态,N - 优先级为负数)
# TIME+ 进程启动后占用的总 CPU 时间
# 可以按照不同的指标排序显示,按对应键即可
# P 按照 CPU 使用率排序
# T 按照 MITE+ 排序
# M 按内存使用占比排序

其他查看进程相关信息的命令有

# 查看进程内存分布
pmap -d 12345 # 12345 是进程号
# 按照内存排序,这里的 grep 可以过滤特定的用户
ps -e -o 'pid,comm,srgs,pcpu,rsz,vsz,stime,user,uid' | grep wdxtub | sort nrk5

查找 find

在命令行界面中进行查找是每个需要在服务器上执行操作的同学都必备的技能,这里用实例来说明常见的实用用法

# 找出七天前的文件
find / -type f -mtime +7 -print
# / 表示从根目录中查找
# -type f 表示找出系统普通文件,不包含目录
# -mtime +n 表示寻找 n 天前的数据
# -print 打印文件名称
# 找出并删除七天前的文件
find /temp/ -type f -mtime +7 -print -exec rm -f {} \;
# -exec 表示后面执行系统命令
# {} 只有该符号能跟在命令你后面
# \; 结束符号
find /temp/ -type f -mtime +7 -print | xargs rm -f
# 使用管道和 xargs = -exec
# 查找 /var 下最大的十个文件
find /var -type f -ls | sort -k 7 -r -n | head
# 查找 /var/log 下大于 5GB 的文件
find /var/log/ -type f -size +5120M -exec ls -lh {} \;
# 找出今天所有文件并将它们拷贝到另一个目录
find /home/wdxtub/ -ctime 0 -print -exec cp {} /mnt/backup/{} \;

远程登录 ssh

  • ssh -vvv username@ip ssh 的 debug 模式
  • ssh -i key.pem username@ip 用 pem key 登录 ssh

奇技淫巧

这里是一些比较零碎的命令行技巧

  • openssl rand -hex n 产生随机的十六进制数,n 是字符数
  • source /path/to/filename 在当前 shell 里执行一个文件里的命令
  • ${variable:0:5} 截取变量的前五个字符
  • wget -r --no-parent --reject "index.html*" http://hostname/ -P /home/user/dirs 用 wget 抓取完整的网站目录结构,存放到本地目录中
  • mkdir -p /home/wdxtub/{test0,test1,test2} 一次创建多个目录
  • dd if=/dev/zero of=/tmp/output.img bs=8k count=256k; rm -rf /tmp/output.img 测试硬盘写入速度
  • hdparm -Tt /dev/sda 测试硬盘读取速度
  • echo -n "test" | md5sum 获取文本的 md5
  • curl -I http://wdxtub.com 获取 HTTP 头信息
  • netstat -tln4 | awk '{print $4}' | cut -f2 -d: | grep -o '[0-9]*' 显示所有 tcp4 监听端口
  • time command 查看命令的运行时间
  • export 查看所有的环境变量
  • cmp file1 file2 文件内容对比
  • cat -n file 内容前面会显示行号
  • lsof -i:22 查看 22 端口现在运行的程序
  • lsof -c abc 显示 abc 进程现在打开的文件
  • lsof -p 12 看进程号为 12 的进程打开了哪些文件
捧个钱场?