Skip to content

cmd

system base info

uname uname -a uname -m

常用

  • 显示文件夹大小du -sh */ 其中,du是查看磁盘使用情况的命令;-s选项表示只显示总大小;-h选项表示以易读的方式显示文件夹大小,即以B、KB、MB等单位显示;*/表示只匹配目录名称,表示当前目录下所有子目录。
  • du -h --max-depth=1 | sort -h 其中,--max-depth=1选项表示只显示当前目录下一级的目录和文件大小。sort命令用于排序。-h选项表示将大小以人类可读的方式排序,即以B、KB、MB等单位排序。默认情况下,sort命令按字典序排序。
  • 显示磁盘占用情况 df -h
  • 查看端口占用情况 sudo lsof -i :8888
  • 只显示文件名 ls -l | awk '{print $9}'

ls

list directory contents, 用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。

ls [-alrtAFR] [name...]

  • -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)

  • -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出

  • -r 将文件以相反次序显示(原定依英文字母次序)

  • -t 将文件依建立时间之先后次序列出

  • -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)

  • -F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"

  • -R 若目录下有文件,则以下之文件亦皆依序列出

  • ls -ll 会显示成字节大小

  • ls- lh 会以 KB、MB 等为单位进行显示,这样比较直观一些

  • ls -lt 时间最近的在前面

  • ls -ltr 时间从前到后

cut

bash
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b-c-f 标志之一。

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。
  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

du

disk usage

du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件] 参数说明

  • -a-all 显示目录中个别文件的大小。
  • -b-bytes 显示目录或文件大小时,以byte为单位。
  • -c--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  • -D--dereference-args 显示指定符号连接的源文件大小。
  • -h--human-readable 以K,M,G为单位,提高信息的可读性。
  • -H--si与-h参数相同,但是K,M,G是以1000为换算单位。
  • -k--kilobytes以1024 bytes为单位。
  • -l--count-links重复计算硬件连接的文件。
  • -L<符号连接>--dereference<符号连接>显示选项中所指定符号连接的源文件大小。
  • -m--megabytes以1MB为单位。
  • -s--summarize仅显示总计。
  • -S--separate-dirs显示个别目录的大小时,并不含其子目录的大小。
  • -x--one-file-xystem以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
  • -X<文件>--exclude-from=<文件>在<文件>指定目录或文件。
  • --exclude=<目录或文件> 略过指定的目录或文件。
  • --max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
  • --help 显示帮助。
  • --version 显示版本信息。

du -sh 显示总计

ps

ps [options] [--help]

ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义

  • -A 列出所有的进程
  • -w 显示加宽可以显示较多的资讯
  • -au 显示较详细的资讯
  • -aux 显示所有包含其他使用者的进程

au(x) 输出格式

USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND`
行程拥有者pid--占用的虚拟记忆体大小占用的记忆体大小终端的次要装置号码 (minor device number of tty)该行程的状态行程开始时间执行的时间所执行的指令

w

查看当前用户名、实际SSH连接的终端数量

cp

cp -frap from_folder/* dist_folder

  • -f 强制覆盖,不询问yes/no(-i的默认的,即默认为交互模式,询问是否覆盖)
  • -r 递归复制,包含目录
  • -a 做一个备份,这里可以不用这个参数,我们可以先备份整个test目录
  • -p 保持新文件的属性不变

date

重命名文件,cp副本+`date +%F`

其他命令参考runoob date

ln

建立软连接 ln -s lib lib.so

chmod

Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

11

bash
chmod [-cfvR] [--help] [--version] mode file...

mode 权限设定字串,格式如下

bash
[ugoa...][[+-=][rwxX]...][,...]
  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • --help : 显示辅助说明
  • --version : 显示版本

使用八进制

#权限rwx二进制
7读 + 写 + 执行rwx111
6读 + 写rw-110
5读 + 执行r-x101
4只读r--100
3写 + 执行-wx011
2只写-w-010
1只执行--x001
0---000
命令说明
chmod a+r file给file的所有用户增加读权限
chmod a-x file删除file的所有用户的执行权限
chmod a+rw file给file的所有用户增加读写权限
chmod +rwx file给file的所有用户增加读写执行权限
chmod u=rw,go= file对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
chmod -R u+r,go-r docs对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
chmod 664 file对file的所有者和用户组设置读写权限, 为其其他用户设置读权限
chmod 0755 file相当于u=rwx (4+2+1),go=rx (4+1 & 4+1)。0 没有特殊模式。
chmod 4755 file4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。
find path/ -type d -exec chmod a-x {} \;删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用'-type f'匹配文件
find path/ -type d -exec chmod a+x {} \;允许所有用户浏览或通过目录path/

chmod +x lib.so

kill

killall -9 pid

tar

  • zip tar -zcvf zip.tar.gz zip/
  • unzip tar -zxvf zip.tar.gz
  • unzip .tar.bz2 tar -jxvf zip.tar.bz2
  • unzip .tat.xz tar -xvf zip.tar.xz

pidof

pidof + pid

tcpdump

tcpdump -i admin port 1433 or port 3306 -vvv -w /home/clog/name.pcap

chown

Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。 chown 需要超级用户 root 的权限才能执行此命令。

bash
chown [-cfhvR] [--help] [--version] user[:group] file...
  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h : 修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件

chown -R clog:clog /home/clog/

ldd

netstat

netstat -anp | grep gateway

gdb

gdb gateway /data/coredump/...

perf

perf top -K -p 27041

Perf 内置于Linux 内核源码树中的性能剖析工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位

find

Linux 查找当前目录下 包含特定字符串 的所有文件

使用 Linux 经常会遇到这种情况:只知道文件中包含某些特定的字符串,但是不知道具体的文件名。需要根据“特定的字符串”反向查找文件。

查找当前目录下,包含“Hello”字符串的所有文件

  1. 【方式1】(其中,r 表示递归, n 表示查询结果显示行号):grep -rn "Hello" ./
  2. 【方式2】 find ./ -name "*.*" | xargs grep "Hello"
  3. 【方式3】(-l 表示只显示文件名)find . | xargs grep -ri "Hello"find . | xargs grep -ri "Hello" -l
  4. 【方式4】 如果不知道文件所在的大致目录,知道文件的类型(例如文本类型 txt),可以在root根目录 / 下根据特定字符串进行查找:find / -type f -name "*.txt" | xargs grep "Hello"

在系统中查找包含 bra 的文件或目录, combine rm xargs wc

find / -name '*bra*'

在某目录下查找名为app.cc”`的文件

find /home/app/ -name app.cc

查找文件名中包含某字符(如app)的文件

find /home/app/ -name '*app*'
find /home/app/ -name 'app*'
find /home/app/ -name '*app'

rm

  • -i 删除前逐一询问确认。
  • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
  • -r 将目录及以下之档案亦逐一删除。

rm -rf

find and then delete

  • find . -name "*.a" | wc -l
  • find . -name "*.a" | xargs rm -rfv

xargs

xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

somecommand | xargs -item command

  • -a file 从文件中读入作为 stdin
  • -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
  • -p 当每次执行一个argument的时候询问一次用户。
  • -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
  • -t 表示先打印命令,然后再执行。
  • -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
  • -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
  • -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
  • -L num 或者是 -l num 从标准输入一次读取 num 行送给 command 命令。
  • -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
  • -x exit的意思,主要是配合-s使用。。
  • -P 修改最大的进程数,默认是1,为0时候为as many as it can

wc

bash
wc [-clw][--help][--version][file...]
  • -c或--bytes或--chars 只显示Bytes数。
  • -l或--lines 显示行数。
  • -w或--words 只显示字数。
  • --help 在线帮助。
  • --version 显示版本信息。

ar

Linux ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。
ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

bash
ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]

必要参数

  • -d  删除备存文件中的成员文件。
  • -m  变更成员文件在备存文件中的次序。
  • -p  显示备存文件中的成员文件内容。
  • -q  将文件附加在备存文件末端。
  • -r  将文件插入备存文件中。
  • -t  显示备存文件中所包含的文件。
  • -x  自备存文件中取出成员文件。

选项参数

  • a<成员文件>  将文件插入备存文件中指定的成员文件之后。
  • b<成员文件>  将文件插入备存文件中指定的成员文件之前。
  • c  建立备存文件。
  • f  为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入备存文件中过长的成员文件名称。
  • i<成员文件>  将文件插入备存文件中指定的成员文件之前。
  • o  保留备存文件中文件的日期。
  • s  若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表。
  • S  不产生符号表。
  • u  只将日期较新文件插入备存文件中。
  • v  程序执行时显示详细的信息。
  • V  显示版本信息。

tree

获取目录结构

win

  • tree 只显示文件夹

  • tree /f 显示文件夹及所有文件

  • 导出

    bash
    tree /f >1.txt
    保存的树形结构,只含有文件夹
    tree /f >1.txt
    保存的树形结构,包含文件夹和文件

mac

  • brew install tree
  • tree
  • tree -L 1 只显示一级目录
  • -d option displays only directories
  • -I option allows to exclude directories that match specific pattern tree -I 'node_modules|cache|test_*'

e.g.
tree -a -I 'node_modules|.git|.github|.idea|.vscode|.cache|.temp|nuxt*|dist' -L 4 > 1.txt

-a All files are printed. By default tree does not print hidden files (those beginning with a dot .'). In no event does tree print the file system constructs .(current directory) and..` (previous directory).

cat

Linux复制文件内容到另一个文件中

shell
# 将a文件中的内容追加到b文件中的末尾命令
cat a >> b

# 将a文件中的内容覆盖b文件内容命令
cat a > b

# 清空文件内容
> filename
echo "" > filename
cat /dev/null > filename

>

输出重定向

mac

有两种方式可以将输出重定向:

  • n> file 将文件描述符n重定向到文件file中,如果文件不存在则会创建文件,如果存在的话将会覆盖原有内容。
  • n>> file 将文件描述符n重定向到文件file中,如果文件不存在将会创建文件,如果存在则会在文件的结尾开始写入输出。

rz sz

bash
apt-get install lrzsz
# 从服务端发送文件到客户端:
sz filename 
# 从客户端上传文件到服务端:
rz

sz 命令

  • 用途说明:将选定的文件发送(send)到本地机器。sz命令是利用ZModem协议来从Linux服务器传送文件到本地,一次可以传送一个或多个文件。相对应的从本地上传文件到Linux服务器,可以使用rz命令。
  • 常用参数
    • -a: 以文本方式传输(ascii)。
    • -b: 以二进制方式传输(binary)。
    • -e: 对控制字符转义(escape),这可以保证文件传输正确。
  • 如果能够确定所传输的文件是文本格式的,使用: sz -a files
  • 如果是二进制文件,使用: sz -be files

rz

  • rz -bye

scp

scp -r server_a server_b

bash
scp -r local_folder remote_username@remote_ip:remote_folder 
# 或者 
scp -r local_folder remote_ip:remote_folder

如果使用了指定端口,则需要加上 -P your_port_number

服务器A上执行scp到服务器B,报错:Permission denied (publickey).

解决方法,把A的公钥放到B上

具体操作:

  • A:cat .ssh/id_rsa.pub
  • B: cat .ssh/authorized_keys

把A的公钥贴过来即可

ssh-keygen

ssh-keygen -t rsa -C "your_email@example.com"

  • -t 指定密钥类型,默认是 rsa ,可以省略。
  • -C 设置注释文字,比如邮箱。
  • -f 指定密钥文件存储文件名。

clip

clip < ~/.ssh/id_rsa.pub

crontab

bash
crontab [-u username]    #省略用户表表示操作当前用户的crontab
    -e      #(编辑工作表)
    -l      #(列出工作表里的命令)
    -r      #(删除工作作)

我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。 crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

  • * 取值范围内的所有数字
  • / 每过多少个数字
  • - 从X到Z
  • , 散列数字

实例

实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart

logrotate

主流Linux发行版上都默认安装有logrotate包,如果出于某种原因,logrotate没有出现在里头,你可以使用apt-get或yum命令来安装。

  • apt-get install logrotate cron
  • yum install logrotate crontabs

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

案例

从创建一个日志文件开始,然后在其中填入一个10MB的随机比特流数据。

shell
touch /var/log/log-file
head -c 10M < /dev/urandom > /var/log/log-file

创建一个配置文件 vim /etc/logrotate.d/log-file

/var/log/log-file {
    monthly
    rotate 5
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    postrotate
        /usr/bin/killall -HUP rsyslogd
    endscript
}
  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
  • rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
  • notifempty: 如果日志文件为空,轮循不会进行。
  • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

lsof

list open files

lsof -i: port

shell
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件

netstat

netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。

netstat -tunlp | grep port

  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名
shell
netstat -ntlp   //查看当前所有tcp端口
netstat -ntulp | grep 80   //查看所有80端口使用情况
netstat -ntulp | grep 3306   //查看所有3306端口使用情况

curl

refer

command

curl command

查看网页源码

shell
curl genshin.hoyoverse.com/main/news/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>

如果要把这个网页保存下来,可以使用-o参数,这就相当于使用wget命令了。

shell
curl -o file_name genshin.hoyoverse.com/main/news/

自动跳转

有的网址是自动跳转的。使用-L参数,curl就会跳转到新的网址。

shell
curl -L genshin.hoyoverse.com/main/news/

显示头信息

-i参数可以显示http response的头信息,连同网页代码一起。

-I参数则是只显示http response的头信息。

显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。

shell
curl --trace output.txt genshin.hoyoverse.com/main/news/
# or
curl --trace-ascii output.txt genshin.hoyoverse.com/main/news/

发送表单信息

发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。

shell
curl example.com/augus?data=xxx

POST方法必须把数据和网址分开,curl就要用到--data参数。

shell
curl -X POST --data "data=xxx" example.com/augus

如果你的数据没有经过表单编码,还可以让curl为你编码,参数是--data-urlencode

shell
curl -X POST --data-urlencode "date=April 1" example.com/augus

HTTP动词

curl默认的HTTP动词是GET,使用-X参数可以支持其他动词。

shell
curl -X POST www.example.com
curl -X DELETE www.example.com

readelf

objdump

addr2line

others


参考:

吃好喝好 快乐地活下去