Linux 常用命令


ls

ls -alh

-a, -all 列出目录下的所有文件,包括以 . 开头的隐含文件
-l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来
-h, –human-readable 以容易理解的格式列出文件大小 (例如 1K 234M 2G)

cd

cd /usr/local 使用绝对路径

cd ../ 使用相对路径

cd ~ home目录

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

pwd

查看“当前工作目录”的完整路径

pwd -P 显示出实际路径,而非使用连接(link)路径

pwd -L 目录连接链接时,输出连接路径

rm

删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。
对于链接文件,只是删除了链接,原有文件均保持不变。

rm -rf /a/b/c 我是谁,我在哪里,我做了什么?

rm -i /a/b/*.log 可以使用通配符

-f, –force 忽略不存在的文件,从不给出提示。
-i, –interactive 进行交互式删除
-r, -R, –recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。

rmdir

删除空目录,一个目录被删除之前必须是空的。

mv

mv命令是move的缩写,可以用来移动文件或者将文件改名。

mv test.log test1.txt 把test.log重命名为test1.txt

cp

复制文件或者目录

cp log1 log.bak 复制log1为log.bak

cat

显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。

cat filename 显示filename的内容

cat filename1 fielname2 > filename3 把filename1和2合并为filename3,只能创建新文件,不能编辑已有文件

less

文件或其它输出进行分页显示,文件比较大时less不是加载整个文件

显示开头

head -n 10 filename 显示前10行

tail

显示结尾

tail -n 10 -f filename 循环显示结尾10行,调试监控某日志文件时经常使用

which

查看可执行文件的位置。
在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

whereis

查看文件的位置。定位可执行文件、源代码文件、帮助文件在文件系统中的位置。

locate

配合数据库查看文件位置。loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理

find

实际搜寻硬盘查询文件名称。

find . -type f -exec ls -l {} \; ls -l命令放在find命令的-exec选项中

find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

find . -name "*.log" -print 在当前目录及子目录中查找所有的‘*.log’文件

chomd

改变linux系统文件或目录的访问权限。

chomd -R 0644 /test 递归修改目录权限

chomd +x /test/test.sh 增加执行权限

tar

压缩,解压缩,打包,解包等

tar xvf FileName.tar 解包

tar cvf FileName.tar DirName 打包

tar zxvf FileName.tar.gz 解压

tar zcvf FileName.tar.gz DirName 压缩

tar jxvf FileName.tar.bz2 解压

tar jcvf FileName.tar.bz2 DirName 压缩

chown

将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;
文件是以空格分开的要改变权限的文件列表,支持通配符

chown mail:mail -R /test 递归把/test 目录的用户和用户组改成mail

df

检查linux服务器的文件系统的磁盘空间占用情况。

df -h 方便阅读方式显示

du

文件和目录磁盘使用的空间的查看

du -h --max-depth=1 输出当前目录下各个子目录所使用的空间

ln

为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,
我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,
然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间

ln -s log2013.log link2013 给文件log2013.log创建软链接

diff

用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方

diff log2014.log log2013.log

date

可以用来显示或设定系统的日期与时间

date '+%Y-%m-%d %T' 2020-03-26 15:26:08

grep

(Global Regular Expression Print)使用正则表达式搜索文本,并把匹 配的行打印出来。

ll /usr/local/bin |grep php

wc

(Word Count)统计指定文件中的字节数、字数、行数,并将统计结果显示输出

ps aux|grep php-fpm|wc -l 统计php-fpm的进程数

ps

ps aux|grep php-fpm

解释:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

USER 进程用户

PID 进程ID

%CPU 进程占用的CPU百分比

%MEM 占用内存的百分比

VSZ 进程使用的虚拟内存量(KB)

RSS 进程占用的固定内存量(KB)

TTY 该进程在哪个终端上运行(登陆者的终端位置),若与终端无关,则显示(?)。若为pts/0等,则表示由网络连接主机进程

STAT 当前状态(D 无法中断的休眠状态、R 正在运行、S 处于休眠、T 停止或被追踪、Z 僵尸进程、< 优先级高、N 优先级较低、s 进程的领导者、l 多进程、+ 位于后台的进程组)

START 进程被触发启动时间

TIME 进程实际使用CPU运行的时间

COMMAND 命令的名称和参数
`

ps -ef|grep php-fpm

kill

用来终止指定的进程

kill -9 12345 强制杀死进程

kill -15 12345 终止指定进程

killall

用于杀死指定名字的进程(kill processes by name)

killall php-fpm

pkill

pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果想杀掉单个进程,请用kill来杀掉。

软件能用自己提供的命令来终止,重启最好

top

实时显示系统中各个进程的资源占用状况

uptime

top中运行时间,负载值

free

显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer

free -m

vmstat

Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控

字段说明

Procs(进程):

  • r: 运行队列中进程数量
  • b: 等待IO的进程数量

Memory(内存):

  • swpd: 使用虚拟内存大小

  • free: 可用内存大小

  • buff: 用作缓冲的内存大小

  • cache: 用作缓存的内存大小

  • Swap:

  • si: 每秒从交换区写到内存的大小

  • so: 每秒写入交换区的内存大小

IO:(现在的Linux版本块的大小为1024bytes)

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

system:

  • in: 每秒中断数,包括时钟中断
  • cs: 每秒上下文切换数

CPU(以百分比表示)

  • us: 用户进程执行时间(user time)
  • sy: 系统进程执行时间(system time)
  • id: 空闲时间(包括IO等待时间)
  • wa: 等待IO时间

watch

watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果

watch -n 1 -d netstat -ant 每隔一秒高亮显示网络链接数的变化情况

crontab

crontab -u www -l 查看

crontab -e 编辑

ifconfig

命令用来查看和配置网络设备。当网络环境发生改变时可通过此命令对网络进行相应的配置

ifconfig eth0 up 启动网卡

ifconfig eth0 down 关闭网卡

route

用于显示和操作IP路由表(show / manipulate the IP routing table)

ping

测试与目标主机的连通性

ping www.baidu.com

ping 112.112.112.112

traceroute

通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。
输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。

traceroute www.baidu.com

netstat

显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

netstat -anlp |grep :9999

netstat -s 统计各网络信息

  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项

ss

Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。
但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

ss -anlp|grep :9999

telnet

用来远程登录、测试tcp服务的端口是否可用

telnet 127.0.0.1 9999

nc

探测UDP端口

nc -vuz 112.91.151.10 4500

但是要注意,如果对端开启了防火墙,防火墙把包DROP了,那么是收不到icmp端口不可达消息的,那么使用nc命令就会发现实际不通的端口是通的。
仔细想想UDP的原理就清楚了,UDP不像TCP一样需要ACK,所以过一段时间没收到端口不可达,UDP就认为端口是通的,但是实际上UDP数据被防火墙DROP了

rcp

用于在计算机之间拷贝文件。rcp命令有两种格式。第一种格式用于文件到文件的拷贝;第二种格式用于把文件或目录拷贝到另一个目录中。

rcp test1 webserver1:/home/root/test3 将当前目录下的 test1 复制到名为 webserver1的远程系统

scp

secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。

复制文件
scp local_file remote_username@remote_ip:remote_folder 从本地服务器复制到远程服务器
scp local_file remote_username@remote_ip:remote_file

复制目录
scp -r local_folder remote_username@remote_ip:remote_folder

scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/ 从远程服务器复制到本地服务器

wget

一个下载文件的工具,它用在命令行下

wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip 下载单个文件

wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080 使用wget -O下载并以不同的文件名保存

wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip 使用wget -c断点续传

wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip 使用wget -b后台下载

tcpdump

在调试网络通信程序是 tcpdump 是必备工具。tcpdump 很强大,可以看到网络通信的每个细节。
如 TCP,可以看到 3 次握手,PUSH/ACK 数据推送,close4 次挥手,全部细节。包括每一次网络收包的字节数,时间等。

tcpdump -i lo -Xnlps0 tcp port 9999 抓lo网卡,tcp协议,端口9999 通信的数据内容

tcpdump host 127.0.0.1 指定IP

命令详解

strace

可以跟踪系统调用的执行情况,在程序发生问题后,可以用 strace 分析和跟踪问题。

strace -o /tmp/strace.log -f -p $PID

gdb

GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具,可以用来调试 C/C++ 开发的程序,PHP 和 Swoole 是使用 C 语言开发的,
所以可以用 GDB 来调试 PHP+Swoole 的程序。
gdb 调试是命令行交互式的,需要掌握常用的指令。

gdb -p 进程ID

lsof

可以查看某个进程打开的文件句柄。可以用于跟踪 swoole 的工作进程所有打开的 socket、file、资源。

lsof -i:9999

lsof -p [进程ID]

pref

非常强大的动态跟踪工具,perf top 指令可用于实时分析正在执行程序的性能问题。
与 callgrind、xdebug、xhprof 等工具不同,perf 无需修改代码导出 profile 结果文件。

perf top -p [进程ID]

awk

一个数据处理工具

awk '条件类型1'{动作1} 条件类型2{动作2}... filename

# 变量名称
# $0 代表一整行数据
# $1-$n 代表第几列数据
# NF 每一行拥有的字段总数($0)
# NR 目前 awk 处理的是 第几行 数据
# FS 目前的分隔符,默认是空格键

# 处理流程
# 1、读入第一行,并将第一行数据填入$0,$1,$2..$n变量中
# 2、依据条件类型的限制,判断是否要进行后面的动作
# 3、做完所有的动作与条件类型
# 4、若后面还有行数据,则重复1、2、3,直到所有的行读取完毕

cat /etc/passwd |awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'

groups

查看有效与支持的用户组

useradd

新增用户

userass test_user

passwd

设置修改用户密码

passwd test_user

su

切换用户身份,需要输入切换用户的密码

su username 切换成username用户,读取变量的设置方式为non-loginshell的方式,这样方式下很多原本的环境变量不会被改变

su - username 读取变量的设置方式为loginshell的方式

su -c username "cmd" 代表仅用此用户执行一次命令

sudo

切换用户,输入自己的密码,需要配置 /ect/sudoers,可用visudo命令编辑

sudo -u username pwd 不加用户参数,默认root

curl

基于网络协议,对指定URL进行网络传输
curl支持的通信协议有DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SBMS, SMTP, SMTPS, TELNET 和TFTP

curl --trace-time -v https://www.baidu.com 可以调试请求时间和具体过程

ssh

SSH是一种网络协议,用于计算机之间的加密登录

ssh-keygen 创建公钥
ssh-keygen -t rsa -b 2048

ssh-copy-id user@host 复制本机公钥到服务器

ssh -p 2222 user@host 登录服务器

用来传输数据

cd && tar czv src | ssh user@host 'tar xz' 将$HOME/src/目录下面的所有文件,复制到远程主机的$HOME/src/目录

ssh user@host 'tar cz src' | tar xzv 将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录

绑定本地端口

可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性

ssh -D 8080 user@host 让8080端口的数据,都通过SSH传向远程主机

SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。
可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口

本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的”端口转发”。
为了区别后文的”远程端口转发”,我们把这种情况称为”本地端口转发”(Local forwarding)。

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。
因此,很自然的想法就是,通过host3,将host1连上host2

ssh -L 2121:host2:21 host3

命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。
这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)
这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口

“本地端口转发”使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH隧道”

远程端口转发

既然”本地端口转发”是指绑定本地端口的转发,那么”远程端口转发”(remote forwarding)当然是指绑定远程端口的转发。

还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,”本地端口转发”就不能用了,怎么办?

解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了

ssh -R 2121:host2:21 host1

R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。
这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为”远程端口绑定”

ssh -NT -f -D 8080 host

N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作
f参数,表示SSH连接成功后,转入后台运行。这样一来,就可以在不中断SSH连接的情况下,在本地shell中执行其他操作

netcat

调试tcp udp

netcat -u ip port 调试udp

time

显示命令执行时间

time command

ldd

查看程序依赖库

ldd test

第一列:程序需要依赖什么库
第二列: 系统提供的与程序需要的库所对应的库
第三列:库加载的起始地址

pstack

跟踪进程栈,命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置

例子:pstack pid

ipcs

显示进程间通信设施状态的工具,可以显示消息队列、共享内存和信号量的信息

iostat

I/O statistics(输入/输出统计)的缩写,用来动态监视系统的磁盘操作活动

需执行安装yum -y install sysstat
需要启动 service sysstat start

sar

System Activity Reporter(系统活动情况报告)

rsync

rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)

rsync -r source destination

-r 递归
-a -a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
-n 如果不确定 rsync 执行后会产生什么结果,可以先用-n或--dry-run参数模拟执行的结果
-v 将结果输出到终端
--delete 要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件
--exclude 排除某些文件或目录 多个排除模式,可以用多个--exclude参数
-exclude-from 如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件
--include 定必须同步的文件模式,往往与--exclude结合使用
-e 如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令
-z 指定同步时压缩数据

使用ssh密钥登录同步

rsync -avz --delete -e 'ssh -i $id_rsa_file -o StrictHostKeyChecking=no -p $SERVER_PORT' $src_dir user@host:~/test_dir

参考链接:

每天一个Linux命令

Swoole文档 工具使用

阮一峰 SSH原理与运用(二):远程操作与端口转发


文章作者: 江湖义气
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 江湖义气 !
  目录