头图来源：海行こ？-あるみっく-pixivContent文件相关查看文件属性查找文件从磁盘或指定目录查找从环境变量PATH中查找查找包含指定内容的文件分割文件排序文件文本内容查看文件差异删除文件or文件夹移动文件or文件夹复制文件or文件夹新建文件新建文件夹复制文件中的多行到另一文件磁盘管理查看磁盘占用查看内存\CPU占用进程相关显示进程快照kill命令查看端口占用权限相关更改文件or文件夹用户和组权限授予更改用户网络相关指令设置路由规则DNS解析文件相关查看文件属性$ls [-alrtAFR] [name...]相关参数：-a 显示所有文件及目录（包括.开头的隐藏文件）-l 显示文件型态、权限、拥有者、文件大小等详细信息-r 将文件以相反次序显示（英文字母逆序）-t 将文件建立时间按从旧到新排序-A 同-a，但不列出"."（当前目录）以及".."（父目录）-F 在列出的文件名称后加一符号：可执行文件加"*"，目录加"/"-R 递归地显示当前目录及子目录下的文件查找文件从磁盘或指定目录查找$find path -option [-print] [-exec -ok command] {}相关参数：find根据下列规则判断path和expression，在命令列第一个-{},!之前的部分为path，之后为expression。如果path为空则默认使用目前路径，如果expression为空则使用-print为预设expressionexpression：-mount,-xdev 只检查和指定目录在同一文件系统下的文件，避免列出其他文件系统的文件-amin n 在过去n分钟内被读取过（超过n分钟前则在n前加"+"，下同）-anewer file 比文件file更晚被读过的文件-atime n 在过去n天内被读取过的文件-cmin n 在过去n分钟内创建的文件-cnewer file 比文件file更晚被修改的文件-ctime n 在过去n天内创建的文件-mtime n 在过去n天内被修改过的文件-perm xxx 符合权限表达式的文件-empty 空的文件-gid n gid是n的文件-group name group是name的文件-(i)path p 路径文件符合p的文件，加i表示忽略大小写-(i)name n 文件名称符合n的文件，加i表示忽略大小写-size n 文件大小是n的文件。 n的单位：b 512位元组区块c 表示字元数k 表示kb-type c 文件类型是c的文件。 c的取值：d 目录b 区块装置文件p 具名贮列f 一般文件l 符号链接s 套接字文件-pid n 进程id是n的文件[scode type="blue"]可以使用()将运算式分隔，并使用下列运算exp1 and exp2 同时符合两运算式!exp 不符合指定运算式exp1 or exp2 符合运算式1或运算式2[/scode]从环境变量PATH中查找$which name$whereis name以上两种命令会输出指定name文件在环境变量PATH中配置的路径查找包含指定内容的文件$grep [-abcEFGHilLnqrsvVwxy][-A n][-B n][-C n][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]grep命令用于查找文件里符合条件的字符串，也可以用来查找包含查询字符串的文件。相关参数：-aor--text 不忽略二进制数据-bor--byte-offset 在显示符合范本样式的那一行之前，标出该行第一个字符的编号-A nor--after-context=n 除了显示符合范本样式的那一行之外，并显示该行之后n行的内容-B nor--before-context=n 除了显示符合范本样式的那一行之外，并显示该行之前n行的内容-cor--count 计算符合范本样式的行数-C nor--context=norn 除了显示符合样式的那一行之外，并显示该行之前之后各n行的内容-Eor--extended-regexp 使用正则表达式作为范本样式来匹配-f fileor--file=file 指定规则文件，文件中包含一个或多个范本样式，让grep查找符合规则条件的文件内容，格式为每行一个规则样式-For--fixed-regexp 将范本样式视为固定字符串的列表-Gor--basic-regexp 将范本样式视为普通的表示法来使用-hor--no-filename 在显示范本样式的那一行之前不标出包含该行的文件名称-Hor--with-filename 在显示范本样式的那一行之前标出包含该行的文件名称-ior--ignore-case 忽略字符大小写-lor--file-with-matches 列出文件内容包含符合指定范本样式文本的文件名称-Lor--files-without-match 列出文件内容不包含符合指定范本样式文本的文件名称-nor--line-number 在显示符合范本样式的那一行之前标出该行所在行号-oor--only-matching 只显示匹配范本样式的部分-qor--quietor--silent 不显示任何信息-ror--recursive 递归地查询指定目录及其子目录中所有文件的内容-sor--no-messages 不显示错误信息-vor--invert-match 显示不包含匹配文本的所有行-Vor--version 显示版本信息-wor--word-regexp 只显示全字符符合的行-xor--line-regexp 只显示一整行均符合范本样式的行-y 此参数的效果和指定-i参数相同分割文件$split [--help][--version][-n][-b n][-C n][-l n][要分割的文件][输出文件名]split命令用于将一个文件分割成数个文件，默认情况下将按每1000行分割成一个小文件相关参数：-n 指定每n行分割成一个小文件-b n 指定每n个字节切成一个小文件-C n 与参数-b相似，但是在切割时将尽量维持每行的完整性[输出文件名] 设置切割后文件的前置文件名，$split会自动在前置文件名后再加上编号排序文件文本内容$sort [-bcdfimMnr][-o file][-t c][+<起始栏位>-<结束栏位>][--help][--version][file][-k field1[,field2]]sort命令用于将文本文件内容以行为单位加以排序相关参数：-b 忽略每行前面开始的空格字符-c 检查文件是否已经按照顺序排好序-d 排序时仅处理英文字母、数字以及空格字符，忽略其他字符-f 排序时，将小写字母视为大写字母-i 忽略ASCII表中不可打印的字符（如结束符和控制字符等）-M 将前面3个字母按照月份的缩写进行排序（unknown < 'JAN' < ... < 'DEC'）-n 按照数值的大小进行排序-u 将输出结果去重-o file 将排序的结果存入指定file-r 以相反的顺序来排序-t c 指定排序时所用的栏位c分割字符，常与-k搭配使用+<起始栏位>-<结束栏位> 以指定的栏位来排序，范围由起始栏位到结束栏位的前一栏位-k field1[,field2] 按指定的列进行排序关于-t和-k参数的例子：现有个要排序的文件fruit.txt，内容如下：banana:30:5.5 apple:10:2.5 pear:90:2.3 orange:20:3.4文件有三列，列与列之间用冒号隔开，第一列表示水果类型，第二列为水果的数量，第三列为水果的价格。如果想以水果的数量对文件进行排序，就需要先将文本的行按照指定分隔符（即冒号）分隔开，使用-t :可将文本中的行分为三列，然后使用-k 2指定sort按照第二列的内容进行排序$ sort -n -k 2 -t : fruit.txt apple:10:2.5 orange:20:3.4 banana:30:5.5 pear:90:2.3查看文件差异$diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C n][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][file or dir1][file or dir2]diff命令用来比较文本之间的差异，逐行匹配比较文本的异同。相关参数：-<行数> 指定显示多少行文本，此参数必须与-c或-u参数一并使用-aor--text diff预设只会逐行比较文本文件-bor--ignore-space-change 不检查空格字符的不同-Bor--ignore-blank-lines 不检查空白行-c 显示全部内文，并标出不同之处-C nor--context n 与执行-c-<行数>指令相同-dor-minimal 使用不同的演算法，以较小的单位来做比较-D <巨集名称>orifdef <巨集名称> 此参数的输出格式可用于前置处理器巨集-eor--ed 此参数的输出格式可用于ed的script文件-for-forward-ed 输出的格式类似ed的script文件，但按照原来文件的顺序来显示不同处-Hor--speed-large-files 比较大文件时，可加快速度-l<字符或字符串>or--ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同，而这几行同时包含了选项中指定的字符或字符串则不显示这两个文件的差异-ior--ignore-case 忽略大小写-lor--paginate 将结果交给pr程序来分页-nor--rcs 将比较结果以RCS的格式来显示-Nor--new-file 在比较目录时，若文件A仅出现在某个目录中，预设会显示Only in <目录> 文件A若使用-N参数，则$diff会将文件A与一个空白的文件比较-p 若比较的文件为C语言程序码文件时，显示差异所在的函数名称-Por--unidirectional-new-file 与-N类似，但只有当第二个目录包含了一个第一个目录所没有的文件时，才会将这个文件与空白的文件比较-qor--brief 仅显示有无差异而不显示详细信息-ror--recursive 递归地比较目录及其子目录中的所有文件-sor--report-identical-files 若没有发现任何差异，仍显示信息-S<文件>or--starting-file<文件> 在比较目录时，从指定的文件开始比较-tor--expand-tabs 在输出时，将tab字符展开-Tor--initial-tab 在每行前面加上tab字符以便对齐-u<列数>or-unified=<列数> 以合并的方式来显示文件内容的不同-vor--version 显示版本信息-wor--ignore-all-space 忽略所有的空格字符-W<宽度>or--width<宽度> 在使用-y参数时，指定栏宽-x<文件名或目录>or--exclude<文件名或目录> 不比较选项中所指定的文件或目录-X<文件>or--exclude-from<文件> 可将文件或目录类型存成文本文件，然后指定该文本文件-yor--side-by-side 以并列的方式显示文本的异同--left-column 在使用-y参数时，若两个文件某一行内容相同，则仅在左侧的栏位显示该行内容--suppress-common-lines 在使用-y参数时，仅显示不同之处 删除文件or文件夹$rm [options] name...相关参数：-i 删除前逐一询问确认-v 展示删除的内容-f 即使原档案属性设为只读，亦直接删除，无需确认-r 递归地删除目录及其子目录内容[scode type="red"]内容一经$rm删除将无法恢复！谨慎使用[/scode]移动文件or文件夹$mv [options] source dest相关参数：-b 当目标文件或目录存在时，在执行覆盖前会为其创建一个备份-i 如果指定移动的源文件或目录与目标目录或文件重名，则会先询问是否覆盖旧文件，输入y表示覆盖，输入n表示取消-f 不作任何询问，如果出现重名的情况则直接覆盖-n 不要覆盖任何已存在的文件或目录-u 当源文件比目标文件新或目标文件不存在时才执行移动操作示例：将文件a改名为文件b$mv a b将info目录放入logs目录中。（注：如果logs目录不存在，则$mv会将info改名为logs）$mv info/ logs将info目录下所有的文件和目录移动到当前目录$mv info/* .复制文件or文件夹$cp [options] source dest相关参数：-a 此选项通常在复制目录时使用，它保留链接、文件属性，并复制目录下的所有内容。-d 复制时保留链接。-f 覆盖已经存在的目标文件而不给出提示-i 在覆盖目标文件之前请求用户确认，输入y同意覆盖，输入n取消执行该操作-p 除复制文件内容外，还把修改时间和访问权限也复制到新文件中-r 递归地复制目录及其子目录下所有内容-l 不复制文件，只生成链接文件新建文件$touch [-acfm][-d<日期时间>][-r<参考文件或目录>][-t<目录时间>][--help][--version][文件或目录...]touch命令用来修改文件或目录的时间属性（存取时间或更改时间等）。若文件不存在，系统会建立一个新的文件相关参数：-a 改变读取时间记录-m 改变修改时间记录-c 若目标文件或目录不存在，不会建立新的文件或目录。-r 使用参考的时间记录-d 设定时间与日期（可使用多种不同的格式）-t 设定时间记录-hor--no-dereference 影响符号链接而不是被链接的文件（仅可在支持修改符号链接时间戳的系统上使用）--no-create 不建立新的文件或目录 新建文件夹$mkdir [-p] dirName相关参数：-p 确保目录存在，不存在则创建复制文件的多行到另一文件// 1.head(复制文件的头n行） $head -n file1 >> file2 # '>>'表示追加，如果需要覆盖则用'>' // 2.sed $sed 磁盘管理查看磁盘占用检查文件系统磁盘空间的占用情况。可利用该命令获取硬盘被占用了多少空间，目前还剩下多少空间等信息。$df [-ahiKHTm] [目录或文件名]相关参数：-a 列出所有的文件系统，包括系统特有的/proc等文件系统-k 以KB的容量显示各文件系统-m 以MB的容量显示各文件系统-h 以容易阅读的GB、MB、KB等格式自行显示（如1024KB会自动转化为1MB）-H 以M=1000K取代M=1024K的进位方式-T 显示文件类型，连同该partition的文件系统名称（如ext3）也列出-i 不使用硬盘容量而是以inode的数量来显示查看内存\CPU占用$top输出内容：pid 进程的iduser 进程所有者PR 进程的优先级别（priority），越小优先度越高NI 进程的Nice值，Nice值的大小能够影响进程优先级。Nice值越大，抢占CPU能力就越小，优先级就越高VIRT 进程占用的虚拟内存RES 进程占用的物理内存SHR 进程占用的共享内存S 进程的状态 S的取值S 休眠R 正在运行Z 僵死状态%CPU 进程CPU使用率%MEM 进程使用的物理内存占总内存大小的百分比TIME+ 该进程启动后占用的总的CPU时间，即占用CPU使用时间的累加值COMMAND 启动该进程的命令名称top命令除了显示内存使用情况外还显示了CPU的占用情况（位于第三行），下面针对CPU使用情况的输出内容进行解读us 表示用户程序（user）的CPU使用率（没有通过nice调度）sy 表示系统空间（system）的CPU使用率，主要是内核程序ni 表示用户空间中通过nice调度（用户程序可以通过调整nice值来影响程序优先级）的程序的CPU使用率id 空闲CPUwa CPU运行时等待（wait）IO的时间hi CPU处理硬中断（hardware interrupt）的数量si CPU处理软终端（software interrupt）的数量st 被虚拟机偷走的CPU$free相关参数：-m 以MB为单位展示数据-h 以易于阅读的单位展示数据输出内容：total 总计物理内存大小used 已使用的内存大小free 可用内存的大小shared 多个进程的共享内存总额buff/cache 磁盘缓存大小available 可用内存大小（available=free+buff/cache）进程相关显示进程快照$ps [options] [--help]相关参数：-A 列出所有的进程-w 显示加宽以显示更多信息-au 显示较详细的信息-aux 显示所有包含其他使用者的进程-u name 显示用户为name的进程输出内容：USER 进程所有者PID 进程pid%CPU 进程CPU使用率%MEM 进程占用内存率VSZ 进程虚拟内存占用率RSS 占用内存大小TTY 终端的次要装置号码STAT 进程状态 STAT的取值D 不可中断的进程（通常为处于IO的进程）R 运行中S 休眠状态T 暂停执行Z 僵死状态X 挂掉的进程W 没有足够的内存页分配而采用内存交换的进程（从内核2.6开始无效）< 高优先级的进程N 低优先级的进程L 有内存页被锁定的进程（通常为实时系统）位于后台的进程组s 包含子进程的进程START 进程开始的时间TIME 进程执行的时间COMMAND 执行的命令kill命令kill命令用来给进程传递信息（SIGNAL）$kill [-s <信息名称或编号>][程序] or [-l <信息编号>]常用信号：-1 重新加载进程（HUP）-9 杀死一个进程（KILL）-15 正常停止一个进程[scode type="blue"]可使用$kill -l命令显示所有的信号[/scode]查看端口占用$lsof -i:[port]lsof（list open files）命令可用于查看指定端口的占用情况使用示例：$lsof -i:8000 查看8000端口的占用$lsof file 查看开启文件file的进程$lsof -c k 查看k进程当前打开的文件$lsof -c -p pid 列出指定进程（pid）所打开的文件$lsof -g gid 显示归属指定用户组（gid）的进程情况$lsof +d path 显示指定目录（path）下被进程开启的文件$lsof +D path 递归显示指定目录（path）下被开启的文件$lsof -d n 显示使用fd为n的进程$lsof -i -U 显示所有打开的端口和UNIX domain文件$netstat [-tunlp] | grep portnetstat命令用于显示tcp、udp的端口和进程等相关信息相关参数：-t 仅显示tcp相关-u 仅显示udp相关-n 不显示别名，能显示数字的全转化为数字显示-l 仅显示在Listen（监听）的服务状态-p 显示建立相关连接的程序名权限相关更改文件or文件夹用户和组$chown [-cfhvR] user[:group] file...chown(change owner)命令用来设置文件所有者和组相关参数：user 新的文件所有者group 新的文件所有者的组-c 显示更改的部分的信息-f 忽略错误的信息-h 修复符号链接-v 显示详细的处理信息-R 递归地处理目录及其子目录下所有的文件权限授予$chmod [-cfvR] mode file...chmod(change mod)命令用于设置用户对文件的权限相关参数：-c 若该文件权限确实已经更改才显示其更改动作-f 若该文件权限无法被更改也不显示错误信息-v 显示权限变更的详细信息-R 递归地设置目录及其子目录下所有的文件的权限mode取值：mode由9位二进制数字组成上图中r位为1则表示具有读权限，w位为1则表示具有写权限，x位为1则表示具有执行权限，且前三位、中三位、后三位分别表示用户、组和其他用户的权限。mode也可以采用3位八进制数字表示，将每三位二进制数字合并为一位八进制数字。如要同时赋予读写权限，其三位二进制数字表示为110，八进制数字表示为6同时mode还可以用符号(r、w和x等)表示，具体不作描述。当前用户查询$whoami更改用户$su [-fmp] [-c command] [-s shell] [-] [USER [ARG]]相关参数：-for--fast 不比读启动档，仅用于csh或tcsh-m -por--preserve-environment 执行su时不改变环境参数-c commandor--command=command 变更为指定账号同时执行指令（command）后变回原来的使用者-s shellor--shell=shell 指定要执行的shell(bash csh tcsh等),默认为/etc/passwd内的该使用者shell-or-lor--login 加入这个参数后，大部分环境参数(HOME SHELL USER等)都以新使用者为主，并且工作目录也会改变，如果没指定USER，则默认是rootUSER 欲变更的使用者账号ARG 传入新的shell参数网络相关指令设置路由规则$route [option]终端输入route可显示目前所有路由，输出结果自上而下优先度递减，最后一条规则为default，仅当前面规则都无法适用时使用。添加规则//添加一条路由（发往192.168.62这个网段的全部要经过网关192.168.1.1） $route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1删除规则//删除规则时不用写网关 $route del -net 192.168.62.0 netmask 255.255.255.0DNS解析$dig URL输出内容：第一部分显示dig命令的版本和输入参数第二部分显示服务返回的一些技术详情。其中主要就是status，如果status的值为NOERROR则说明本次查询成功。第三部分QUESTION SECTION即为查询的域名第四部分ANSWER SECTION为查询的结果第五部分统计了查询的一些信息，如累计用时，查询了哪个DNS服务器，何时进行的查询等。示例：查询指定类型的记录//查询CNAME记录 $dig abc.com CNAME指定DNS服务器进行查询$dig @8.8.8.8 abc.com
之前都是手动进行备份即麻烦又不节能，于是今天心血来潮写了个脚本挂服务器上一到时间让它自己备份到GitHub。话不多说，具体做法如下头图来源：青色の風-みふる-pixiv初始化本地仓库既然要将备份上传到GitHub，那就得先建一个仓库（ps：记得将仓库设置为private），这部分具体过程随便一搜就有于是省略。仓库目录大致如下. ├── .git ├── backup.log #备份日志 ├── db_bak #数据库备份（sql文件）所在路径 │ └── ***.sql ├── README.md └── wwwroot └── yukinekoneko.com ├── config.inc.php ├── admin ├── index.php ├── install ├── install.php ├── LICENSE.txt ├── usr #usr文件夹所在路径 └── var编写脚本对于typecho博客，我们主要备份的就两样东西:数据库和usr文件夹，将这两样备份起来推送至远程仓库即可。为了方便调试排错，可将当前脚本执行动作输出打印至日志文件（backup.log）。采用https的方式推送至远程仓库（这里用ssh的话可能会更方便一点）#! /bin/bash cd 你本地仓库路径 INTERVAL=21 #删除现在距之前指定间隔天数的数据库备份 DB_BAK_DIR= 数据库备份（sql文件）所在路径 BLOG_BAK_DIR= usr文件夹所在路径 DATE=`date +%Y/%m/%d` #当前系统时间 DB_USER= 数据库账户 DB_PWD= 数据库密码 DATABASE= 所要备份的数据库（就是typecho所用的数据库） DEL_DATE=`date -d "${DATE} -${INTERVAL} day" +%Y/%m/%d` #数据库备份 echo "-------$(date +%F_%T) start-------">>backup.log mysqldump -u${DB_USER} -p${DB_PWD} ${DATABASE}>${DB_BAK_DIR}/data_backup_${DATE}.sql echo "--- data backup completed">>backup.log #删除早期的数据库备份 if [ -a "${DB_BAK_DIR}/data_backup_${DEL_DATE}.sql" ];then rm -f ${DB_BAK_DIR}/data_backup_${DEL_DATE}.sql echo "---delete data_backup_${DEL_DATE}.sql">>backup.log fi #推送至远程仓库 echo "---push to remote repository">>backup.log git add ${DB_BAK_DIR} git add ${BLOG_BAK_DIR} echo `git commit -m "bak-${DATE}"`>>backup.log echo `git push -u origin main`>>backup.log echo "---git push completed">>backup.log[scode type="yellow"]即使配置了GitHub账户和邮箱每次推送至远程仓库Github都还会再请求输入账户和Token，此时可以在GitHub配置中添加$ git config --global credential.helper store一项,这样只需输入一次用户名和Token之后就无需再输入[/scode]使用crontab制定定时任务在编写好脚本之后接下来的就是重头戏了，关于crontab的用法这里有一篇文章讲得很仔细crontab 定时任务做法就是输入命令$ crontab -e来设定你所需执行的定时任务，具体格式如下：第1列分钟0～59第2列小时0～23（0表示子夜）第3列日1～31第4列月1～12第5列星期0～7（0和7表示星期天）第6列要运行的命令至于备份的频率按各自喜好设定即可，我更博的频率比较佛系所以就设定一周执行一次备份0 11 * * 3 /root/backup.sh #每周三十一点执行脚本这里我是将备份脚本放在了根路径。设定好定时任务后重启一下crontabsystemctl restart crond.service备份后通知（可做可不做）这一步主要是通过在IFTTT上挂个webhook，这样每次自动备份到GitHub的时候能够通知你博客已经备份完成。创建你的Applet步骤非常简单，当然首先你需要有一个IFTTT帐号，没有的话快速申请一个。进入IFTTT页面后单击右上角的create就能开始制定Applet了。点击If This后面的Add来设置所要监听的Action，搜索github点进去之后会让你选择Action，我们需要的是仓库每次有新的commit时通知我们，所以这里我们选择Any new commit输入仓库的名称后我们要监听的Action就设定好了，之后就是设置触发事件了，点击Then That后面的Add来设置所要触发的事件。可以选择邮箱、短信等，亦或者你愿意折腾的话也可以是其他任意你希望接收通知的方式，比较自由。具体做法就跟之前类似了，选择邮箱的话则会直接使用你IFTTT帐号所绑定的邮箱，邮件内容可以自定义，也能使用预设的变量（如commit message等）。创建完Applet后，点击大大的connect激活它即可。enjoy！