Linux常用命令

Linux常用命令

Learning the Linux command line, like becoming an accomplished pianist, is not something that we pick up in an afternoon. It takes years of practice.

学习 Linux 命令行,就像要成为一名造诣很深的钢琴家一样,它不是我们一下午就能学会的技能。这需要 经历几年的勤苦练习

可以把多个命令放在同一行上,命令之间 用”;”分开。

什么是命令,是什么命令?

可以分为四种:

  • 可执行程序
  • shell自己的命令
  • shell函数
  • 命令的别名alias 

which command     只对可执行程序有效,不包括内建命令和命令别名

info command      # (推荐)好用的查看帮助,还有进度条,空格翻页

command --help     # 不是通用的只是有的有

man command      # 显示程序手册

whatis command    # 显示匹配特定关键字的手册页的名字和一行命令说明

type command 					# 输出命令的类型

➜  ~ type type
type is a shell builtin
➜  ~ type cp
cp is /bin/cp

info 操作

命令 行为
? 显示命令帮助
PgUp or Backspace 显示上一页
PgDn or Space 显示下一页
n 下一个 - 显示下一个结点
p 上一个 - 显示上一个结点
u Up - 显示当前所显示结点的父结点,通常是个菜单
Enter 激活光标位置下的超级链接
q 退出

命令的别名alias 

type command # 构建之前检查别名是否存在

alias foo='cd /usr; ls; cd -'   # =左右没有空格

unalias foo            # 删除别名

用户管理

用户对文件或目录的访问权限拥有控制权。

用户组成员有文件和目录的所有者授予对文件和目录的访问权限。

当用户创建帐户之后,系统会给用户分配一个号码,叫做用户 ID 或者 uid,

系统又会给这个用户分配一个原始的组 ID 或者是 gid

**用户帐户 定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面** 当用户帐户和用户组创建以后, 这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息。 对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名、uid、gid、帐号的真实姓名、家目录 和登录 shell。

adduser     # 添加用户

deluser     # 删除用户

passwd      # 修改当前用户密码

passwd [user]

组管理

更改文件所有者和用户组chown

<font style="color:#F5222D;background-color:#FADB14;">chown [owner][:[group]] file...</font>

参数 结果
bob 把文件所有者从当前属主更改为用户 bob。
bob:users 把文件所有者改为用户 bob,文件用户组改为用户组 users。
:admins 把文件用户组改为组 admins,文件所有者不变。
bob: 文件所有者改为用户 bob,文件用户组改为用户 bob 登录系统时所属的用户组。

设置环境变量

env                           展示当前环境变量

echo $PATH                    查看变量内容

export Variable=value         设置环境变量的值

目录操作

rm -rf mydir                # 递归删除,强制删除

mkdir -p playground/dir-{00{1..9},0{10..99},100}  # -p, --parents  此时若路径中的某些目录尚不存在,加上此选项后,

1625718058684-72df5119-70ae-4e7c-9616-703565f6eaad.png

cd -                        # 返回进入此目录之前所在的目录

cd ..                       # 返回上一级目录,中间有空格

cd ~                        # 回当前用户家目录

cp -r m n           # 复制目录需要这个,递归复制

cp -v m n           # 显示详细信息

cp -a m n           # --archive,复制文件和目录,以及它们的属性,包括所有权和权限

mv tools tool               # 把tools目录改名为tool

mv -u tools tool            # 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。

mv -v tools tool            # 详细信息

ln tool bac         # (目录项)硬链接:相当于建立一个存储空间的指针,删除的时候删的是指针,删最后一个的时候删除的是实际的存储空间, 不能关联所在硬盘分区之外的文件,不能关联目录

ln -s tool bac              # (索引节点)软链接:建立一个文件名字的指针,相当于快捷方式

ls -alh           # 显示全部包括隐藏文件,长格式,不显示字节而是直观的大小

ls -alt           # 显示全部包括隐藏文件,长格式,按时间顺序

文件权限

长格式列表字段

字段 含义
-rw-r--r-- 对于文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一个普通文件,“d”表明是一个目录(注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性
)。所有者的 访问权限,文件所属组中成员的访问权限,其他所有人的访问权限。1571748170463-99e5d36b-3dd5-4a8b-85e1-0d9e4e8b65d4.png
1 文件的硬链接数目。
root 文件所有者的用户名。
root 文件所属用户组的名字。
32059 以字节数表示的文件大小。
2007-04-03 11:05 上次修改文件的时间和日期。
oo-cd-cover.odf 文件名。
属性 文件 目录
r 允许打开并读取文件内容。 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。
w 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。
x 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 允许进入目录,例如:cd directory 。

修改权限chmod

只有文件的所有者或者超级用户才 能更改文件或目录的模式

chmod 755 /home/wwwroot/a.php       # 给a.php赋予755权限,如果是目录需要加上 -R 参数

rwx  <==>   421加起来就是一个权限
u+x				  为文件所有者添加可执行权限。
u "user"的简写,意思是文件或目录的所有者。
g 用户组。
o "others"的简写,意思是其他所有的人。
a "all"的简写,是"u", "g"和“o”三者的联合。

文件操作

rm go.tar           # 删除go.tar文件 */

touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}  # 创建文件

find mt.cgi         #  查找文件名为mt.cgi的文件 */

file filename     # 打印文件的简单描述

cat           # 显示文件的内容, ctrl+d 退出

less         # 显示文件内容,q退出。d 向下半页,u 向上半页。h 显示帮助,G移动到最后一行,g移动到开头

wc a.txt      # 显示文件所包含的行数、字数和字节数

重定向

输出不只是到屏幕,输入不只是从键盘

可以将查询的结果输入到一个文件里面而不是屏幕

<font style="color:#F5222D;">></font>是输出重定向

<font style="color:#F5222D;">|</font>是输出作为另一个的输入,有可能会把几个命令放在一起组成一个管道线。

ls -l /usr/local/bin > ls-out.txt   # 不存在就创建TXT,存在就清空重写

> ls-out.txt             # 清空文件内容

ls -l /usr/local/bin >> ls-out.txt   # 追加

ls -l /usr/bin | less         # 用less显示结果

ls /bin /usr/bin | sort | less    # ls 命令的输出结果由有序列表组成, 各自针对一个目录。通过在管道线中包含 sort,改变输出数据,从而产生一个 有序列表。

ls /bin /usr/bin | sort | uniq | less

# uniq忽略重复行

ls /bin /usr/bin | sort | uniq | grep zip

# grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行

# 找到文件名中包含单词”zip”的所有文件

# ”-i”使得 grep 在执行搜索时忽略大小写

ls /usr/bin | tail -n 5        # head 命令打印文件的前十行,而 tail 命令打印文件的后十行

# ”-n”选项来调整命令打印的行数

ls /usr/bin | tee ls.txt | grep zip   #  grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt

归档、解、压缩

与文件压缩结合一块使用的文件管理任务是归档。归档就是收集许多文件,并把它们 捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用。当把旧数据从一个系统移到某 种类型的长期存储设备中时,也会用到归档程序。

** .tar 或者 .tgz 的文件,它们各自表示“普通” 的 tar 包和被 gzip 程序压缩过的 tar 包。**
tar cf toole.tar tool       # 打包tool目录
tar xvf wordpress.tar       # 解包tar格式的文件 
tar zcvf vpser.tar.gz tool  # f 被用来指定tar包的名字,
														# .tar文件几乎是没有压缩过的
tar zxvf vpser.tar.gz
tar tvf myfile.tar          # 查看tar文件中包含的文件 

find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
# 这里我们使用 find 命令来匹配 playground 目录中所有名为 file-A 的文件,
# 然后使用-exec 行为,来 唤醒带有追加模式(r)的 tar 命令,
# 把匹配的文件添加到归档文件 playground.tar 里面。
find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz
# find 程序产生了一个匹配文件列表,然后把它们管道到 tar 命令中。 如果指定了文件名“-”,则其被看作是标准输入或输出
# --file-from 选项(也可以用 -T 来指定) 导致 tar 命令从一个文件而不是命令行来读入它的路径名列表。
# 最后,这个由 tar 命令产生的归档 文件被管道到 gzip 命令中,然后创建了压缩归档文件 playground.tgz


gzip ge.tar           			# 压缩,后缀为gz,原始文件的压缩版会替代原始文件
gzip -d ge.tar.gz           # 解压缩。正如 gunzip 命令一样。也可以用--decompress 或者--uncompress 选项来指定.
gunzip                      # 解压,解压后缀是gz的文件

bzip2 foo.txt								# 比gzip更慢,压缩比更高
bunzip2 foo.txt.bz2

zip -r playground.zip playground		# r不写对目录就是压缩了一个空目录
unzip phpbb.zip             				# 解压zip文件
unzip ./playground.zip playground/dir-87/file-Z # 解压单个对应的文件
# -l 选项,导致 unzip 命令只是列出文件包中的内容而没有抽取文件

gzip 选项

选项 说明
-c 把输出写入到标准输出,并且保留原始文件。也有可能用--stdout 和--to-stdout 选项来指定。
-d 解压缩。正如 gunzip 命令一样。也可以用--decompress 或者--uncompress 选项来指定.
-l 列出每个被压缩文件的压缩数据。也可用--list 选项。
-r 若命令的一个或多个参数是目录,则递归地压缩目录中的文件。也可用--recursive 选项来指定。
-t 测试压缩文件的完整性。也可用--test 选项来指定。
-v 显示压缩过程中的信息。也可用--verbose 选项来指定。
-number 设置压缩指数。number 是一个在1(最快,最小压缩)到9(最慢,最大压缩)之间的整数。 数值1和9也可以各自用--fast 和--best 选项来表示。默认值是整数6。

下载

wget http://soft.vpser.net/web/nginx/nginx-0.8.0.tar.gz

下载远程服务器上的文件到自己的服务器

wget -c http://soft.vpser.net/web/nginx/nginx-0.8.0.tar.gz

继续下载上次未下载完的文件 */

进程管理

当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程序。init, 依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。 其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户接口(User Interface)。 这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。

内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,这个数字叫做 进程(process) ID 或 PID。PID 号按升序分配,init 进程的 PID 总是1。内核也对分配给每个进程的内存和就绪状态进行跟踪以便继续执行这个进程。 

ps

ps

默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。是机器状态快照

TTY 是 “Teletype”(直译电传打字机) 的简写,是指进程的控制终端。TTY足足显示了 Unix 的年代久远。

TIME 字段表示 进程所消耗的 CPU 时间数量。正如我们所看到的,这两个进程使计算机工作起来很轻松。

ps x   # 告诉 ps 命令,展示所有进程,不管它们由什么 终端(如果有的话)控制。在 TTY 一栏中出现 “?” 表示没有控制终端

ps aux     # 显示属于每个用户的进程信息

ps命令输出字段的含义:

USER,进程所有者的用户名。

PID,进程号,可以唯一标识该进程。

%CPU,进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。

%MEM,进程使用内存的百分比。

VSZ,进程使用的虚拟内存大小,以K为单位。

RSS,进程占用的物理内存的总数量,以K为单位。

TTY,进程相关的终端名。

STAT,进程状态(R-运行或准备运行;S-睡眠状态;I-空闲;Z-僵尸进程,终止的子进程但是父进程没有删除;D-不间断睡眠;W-进程没有驻留页;T停止或跟踪。)

START,进程开始运行时间,若它的值超过24小时,则用天表示。。

TIME,进程使用的总CPU时间。

COMMAND,被执行的命令行。

ps -aux | grep nginx  # 在所有进程中,查找nginx的进程

top

top    # 动态查看进程

启动一个程序并让它立即在后台 运行,我们在程序命令之后,加上”&”字符

shell 提示符返回,同时打印一些有趣的数字。 这条信息是 shell 特性的一部分,叫做任务控制 (job control)。

通过这条信息,shell 告诉我们,已经启动了 任务号(job number)为1(“[1]”),PID 为28236的程序。

h:显示帮助画面,给出一些简短的命令总结说明;

k:终止一个进程;

i:忽略闲置和僵死进程,这是一个开关式命令;

q:退出程序;

r:重新安排一个进程的优先级别;

S:切换到累计模式;

s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;

f或者F:从当前显示中添加或者删除项目;

o或者O:改变显示项目的顺序;

l:切换显示平均负载和启动时间信息;

m:切换显示内存信息;

t:切换显示进程和CPU状态信息;

c:切换显示命令名称和完整命令行;

M:根据驻留内存大小进行排序;

P:根据CPU使用百分比大小进行排序;

T:根据时间/累计时间进行排序;

kill

kill 命令不是真的“杀死”程序,

而是给程序 发送信号。信号是操作系统与程序之间进行通信时所采用的几种方式中的一种。 在使用 Ctrl-c 和 Ctrl-z 的过程中我们已经看到信号的实际用法。

当终端接受了其中一个按键组合后,它会给在前端运行 的程序发送一个信号。在使用 Ctrl-c 的情况下,会发送一个叫做 INT(Interrupt,中断)的信号;当使用 Ctrl-z 时,则发送一个叫做 TSTP(Terminal Stop,终端停止)的信号。程序,相应地,监听信号的到来,当程序接到信号之后,则做出响应。

进程,和文件一样,拥有所有者,所以为了能够通过 kill 命令来给进程发送信号, 你必须是进程的所有者(或者是超级用户

kill [-signal] PID...
# 如果在命令行中没有指定信号,那么默认情况下,发送 TERM(Terminate,终止)信号。
# kill 命令被经常 用来发送以下命令:
kill 1234   # 1234为进程ID,即ps -aux 中的PID
killall nginx #  killall 命令,给匹配特定程序或用户名的多个进程发送信号
							# 通过程序的名字,直接杀死所有进程,nginx为进程名

kill -1 13546
# kill 命令,发送给它一个 HUP 信号。这个程序终止运行,并且 shell 指示这个后台进程已经接受了一个挂起信号。

常用信号

编号 名字 含义
1 HUP 挂起(Hangup)。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂断”。 通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。
许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。
2 INT 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。
9 KILL 杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。
15 TERM 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。
18 CONT 继续。在一个停止信号后,这个信号会恢复进程的运行。
19 STOP 停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。

资源、网络占用查询

du -sh /home/wwwroot/*      # 查看/home/wwwroot/下各个目录的占用大小 */

df -h                   # 查看磁盘剩余空间 */

free -m                     # 查看内存核swap使用情况 */

top                         # 查看程序的cpu、内存使用情况 */

lsof -i :80                 # 查看80端口被什么程序占用

netstat

netstat -ntl                # 查看端口占用情况 */

netstat -tunlp | grep :     # 所有端口占用情况

netstat -an | grep :80      # 查看80端口的是否已在使用中,可验证使用该端口的服务是否已正常运行

-a或--all:显示所有连线中的Socket;端口

-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;

-c或--continuous:持续列出网络状态;

-C或--cache:显示路由器配置的快取信息;

-e或--extend:显示网络其他相关信息;

-F或--fib:显示FIB;

-g或--groups:显示多重广播功能群组组员名单;

-h或--help:在线帮助;

-i或--interfaces:显示网络界面信息表单;

-l或--listening:显示监控中的服务器的Socket;

-M或--masquerade:显示伪装的网络连线;

-n或--numeric:直接使用ip地址,而不通过域名服务器;

-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;

-o或--timers:显示计时器;

-p或--programs:显示正在使用Socket的程序识别码和程序名称;

-r或--route:显示Routing Table;

-s或--statistice:显示网络工作信息统计表;

-t或--tcp:显示TCP传输协议的连线状况;

-u或--udp:显示UDP传输协议的连线状况;

-v或--verbose:显示指令执行过程;

-V或--version:显示版本信息;

-w或--raw:显示RAW传输协议的连线状况;

-x或--unix:此参数的效果和指定"-A unix"参数相同;

--ip或--inet:此参数的效果和指定"-A inet"参数相同。

列出所有端口 (包括监听和未监听的)

netstat -a     #列出所有端口
netstat -at    #列出所有tcp端口
netstat -au    #列出所有udp端口

列出所有处于监听状态的 Sockets

netstat -l        #只显示监听端口
netstat -lt       #只列出所有监听 tcp 端口
netstat -lu       #只列出所有监听 udp 端口
netstat -lx       #只列出所有监听 UNIX 端口

显示每个协议的统计信息

netstat -s   显示所有端口的统计信息
netstat -st   显示TCP端口的统计信息
netstat -su   显示UDP端口的统计信息

在netstat输出中显示 PID 和进程名称

netstat -pt

netstat -p可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中,这样debugging的时候可以很方便的发现特定端口运行的程序。

显示系统不支持的地址族(Address Families)

netstat --verbose

显示核心路由信息

netstat -r

找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

netstat -ap | grep ssh

找出运行在指定端口的进程:

netstat -an | grep ':80'

通过端口找进程ID

netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1

显示网络接口列表

netstat -i

显示详细信息,像是ifconfig使用netstat -ie

IP和TCP分析

查看连接某服务端口最多的的IP地址:

netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr

TCP各种状态列表:

netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'

echo

算术表达式展开

echo $((2 + 2))

echo $(($((5**2)) * 3))

花括号展开

echo Front-{A,B,C}-Back    # Front-A-Back Front-B-Back Front-C-Back

echo Number_{1..5}      # Number_1  Number_2  Number_3  Number_4  Number_5

echo {Z..A}          # Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

echo a{A{1,2},B{3,4}}b    # aA1b aA2b aB3b aB4b

mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}

# 创建一系列以数值”年-月”形式命名的目录。通过这种方式,可以使目录名按照 年代顺序排列。

参数展开

echo $USER

命令替换

ls -l $(which cp)       # 命令替换允许我们把一个命令的输出作为一个展开模式来使用

file $(ls /usr/bin/* | grep zip) # 管道线的输出结果成为 file 命令的参数列表

ls -l "two words.txt"     # 操作有空格的文件名

在双引号中,参数展开、算术表达式展开和命令替换仍然有效

echo "$USER $((2+2)) $(cal)"

dianerta 4     October 2019

Su Mo Tu We Th Fr Sa

1  2  3  4  5

6  7  8  9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

软件安装

系统自带一些软件包仓库,你也可以安装新的软件包仓库。有时候需要先下载软件仓库才可以安装

基础知识:
https://www.vpser.net/vps-howto
关于ufw
https://www.cnblogs.com/sweet521/p/5733466.html

搜索历史命令

**<font style="color:#F5222D;background-color:#FADB14;">history | less</font>**

**<font style="color:#F5222D;background-color:#FADB14;">history | grep /usr/bin</font>**

安装需要编译的软件

- 编译
    GNU configure system默认会编译输出到根目录,没有权限,所以在家目录创建一个文件夹
    进入包含源代码的文件夹
    设置安装路径
    $ ./configure --prefix=$HOME/units174
    创建成功之后文件夹里面会有Makefile文件
- 生成
    $ make && make install
    若提示没有make,输入sudo apt install make
    安装到指定目录
- 执行
    进入对应文件夹的bin目录运行即可

查找文件

locate bin/zip| grep bin			# locate 命令将会搜索它的路径名数据库,输出任一个包含字符串“bin/zip”的路径名
															# locate 程序只能依据文件名来查找文件
                              
                              # find 程序能基于各种各样的属性 搜索一个给定目录(以及它的子目录),来查找文件
find ~                        # 递归输出此文件夹的所有内容   
find ~ | wc -l								# wc 程序来计算出文件的数量
  203978
find ~ -type d | wc -l				# 添加测试条件-type d 限制了只搜索目录
   23728
find ~ -type f | wc -l				# 只搜索普通文件
find ~ -type l | wc -l				# 搜索符号链接
find ~ -type f -name "*.JPG" -size +1M | wc -l	# 把它用双引号引起来, 从而阻止 shell 展开路径名
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

xargs

从标准输入接受输入,并把输入转换为一个特定命令的 参数列表

find ~ -type f -name 'foo*' -print | xargs ls -l
# find 命令的输出被管道到 xargs 命令,之后,xargs 会为 ls 命令构建 参数列表,然后执行 ls 命令

posted on 2025-10-12 20:18  chuchengzhi  阅读(38)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客