Linux的常用命令集
| 指令 | 作用 |
|---|---|
| at 命令详解 | 安排,检查,删除队列中的工作 |
| uniq命令用法 | 去除/保留重复的行 |
| cat 命令详解 | 连接文件并打印到标准输出 |
| cd | 改变目录,能处理绝对和相对路径 |
| chmod | 改变文件保护权限 |
| chown | 改变文件的属主和组 |
| clear | 清除屏幕(象DOS中的cls) |
| cp | 拷贝文件 |
| cron计划任务配置 | 操作每个用户的守护程序和执行的时间表 |
| date 常用方式 | 打印或设置系统日期和时间 |
| dd命令使用方法 | 拷贝一个文件(并可以同时转化它) |
| df | 报告磁盘剩余空间 |
| du | 报告磁盘空间使用情况 |
| file 命令详解 | 探测文件和目录类型 |
| find 命令详解 | 搜索目录中文件 |
| grep | 在文件中搜索匹配的行并输出 |
| gzip 命令详解 | 压缩或展开文件 |
| head | 显示文件的前几行 |
| history | 显示历史命令记录 |
| kill 命令详解 | 中止一个进程 |
| last | 显示过去多少个用户或终端登录到本机器 |
| less | 想对于more命令,用来按页显示文件 |
| ln | 在文件间建立连接 |
| ls | 列出当前目录下的文件 |
| man | 显示具有一定格式的在线手册 |
| more | 命令能逐页阅读文本 |
| mount | 安装一个文件系统 |
| mv | 将文件改名 |
| passwd | 设置用户的密码 |
| ps | 命令罗列运行进程 |
| reboot | 重新启动系统 |
| rm | 命令用于删除文件 |
| su | 创建和编辑Unix归档文件 |
| tar命令使用 | 创建和编辑Unix归档文件 |
| touch | 改变文件的时间参数 |
| wc | 统计一个文件中的字节数,单词数,行数 |
| who | 查看其他登录的用户 |
| which | which–显示命令的全路径 |
| ping | 命令—确定网络上机器是否可达或到达速率 |
| wget离线下载工具 | 著名的离线下载工具 |
| curl实战 | 用于在 Linux/Unix 系统中传输数据 |
at 命令详解
使用方式 :
at -V [-q queue] [-f file] [-mldbv] TIME
说明 :
at 可以让使用者指定在 TIME 这个特定时刻执行某个程序或指令,TIME 的格式是 HH:MM其中的 HH 为小时,MM 为分钟,甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点钟)等口语词。
如果想要指定超过一天内的时间,则可以用 MMDDYY 或者 MM/DD/YY 的格式,其中 MM 是分钟,DD 是第几日,YY 是指年份。另外,使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间,其中的时间间隔可以是 minutes, hours, days, weeks。
另外,使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后,at 会进入交谈模式并要求输入指令或程序,当你输入完后按下 ctrl+D 即可完成所有动作,至于执行的结果将会寄回你的帐号中。
参数 :
-V : 印出版本编号 -q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个 -m : 即使程序/指令执行完成后没有输出结果, 也要寄封信给使用者 -f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入 -l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l) -d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d) -v : 列出所有已经完成但尚未删除的指定
例子 :
三天后的下午 5 点锺执行 /bin/ls :
at 5pm + 3 days /bin/ls
三个星期后的下午 5 点锺执行 /bin/ls :
at 5pm + 2 weeks /bin/ls
明天的 17:20 执行 /bin/date :
at 17:20 tomorrow /bin/date
1999 年的最后一天的最后一分钟印出 the end of world !
at 23:59 12/31/1999 echo the end of world !
uniq命令用法
文件经过处理后在它的输出文件中可能会出现重复的行。
例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。
语法:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
该命令各选项含义如下:
-c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。 -d 只显示重复行。 -u 只显示文件中不重复的各行。 -n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。 +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。 -f n 与- n相同,这里n是字段数。 -s n 与+n相同,这里n是字符数。
cat 命令详解
使用方式:
cat [-AbeEnstTuv] [--help] [--version] fileName
说明:
把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号 -b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号 -s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -v 或 --show-nonprinting
范例:
把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat -b textfile1 textfile2 >> textfile3 cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
cat 也可以用来制作 image file。例如要制作软碟的 image file,将软碟放好后打
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软碟,请打
cat IMG_FILE > /dev/fd0
注意:
- OUTFILE 指输出的 image 档名。
- IMG_FILE 指 image file。
- 若从 image file 写回 device 时,device 容量需与相当。
- 通常用在制作开机磁片。
用户和组的权限控制
当你使用的linux系统用户有一定数目的时候, 系统对用户在文件系统安全方面和在系统资源使用方面的控制就变得越来越重要。
下面就从这四个方面谈谈Linux。
文件权限
文件权限对于每个linux的使用者来说是最为熟悉了。 它是一种对用户文件访问控制的机制,能限制用户对文件系统活动范围,能降低用户对系统安全威胁。
来看一个简单的例子:
[chase@lustre doc]$ ls -l -rw-rw-r-- 1 chase chase 2 Feb 17 00:17 a.txt
这是运行ls -l 的结果。在这里我们可以清楚的看到一些关于文件a.txt的信息。
这些信息主要的含义如下:
-rw-rw-r--(文件权限) 1(文件链接数) chase(拥有者) chase(用户组号) 2(文件大小) Feb 17 00:17(最后修改日期) a.txt(文件名)
上面的信息表示文件是由chase拥有和属于chase用户组。而在权限位上,我们可以把它分成四部分:
-(文件类型) rw-(拥有者权限) rw-(用户组权限) r--(其他用户权限)
对于第一部分表示文件的类型,在linux下一共有七种**文件属性** (括号中是文件在权限位上的表示符)
- 套接字(s)
- 符号链接文件(l)
- 普通文件(-)
- 块设备文件(b)
- 目录(d)
- 字符设备©
- 命名管道(P)
其他三部份结构类似,都是用三个字符(rwx)表示。r对应的是读权限,w对应的是写权限,x对应的是有运行的权限。
对于这三部分我们都可以用三位二进制或一位八进制数来表示,当某一位使能时就把这一位符值为1,如rw-就表示读和写位使能,对应的位赋1,所以在这种情况下可以用二进制110或八进制6表示。
简单的说,就是r(ead)为4,w(rite)为2,x(exec)为1
当我们要改变文件权限时既可以用字符方式,又可以用八进制数的方式。
改变文件权限的命令是chmod,其中u代表拥有者,g代表用户组,o代表其他用户和a代表所有人。
例如当你要把上文件a.txt的权限改变为用户组只能读,就可以用
[chase@lustre doc]$ chmod g-w a.txt [chase@lustre doc]$ ls -l -rw-r--r-- 1 chase chase 2 Feb 17 00:35 a.txt
这样用户组就对这个文件只读。
如果你运行下面的命令
[chase@lustre doc]$ chmod +x a.txt [chase@lustre doc]$ ls -l-rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
所有的可运行位都会使能,但是
[chase@lustre doc]$ chmod +w a.txt [chase@lustre doc]$ ls -l-rw-rw-r-- 1 chase chase 2 Feb 17 00:35 a.txt
就不会把可写位全部使能,一定要a+w才可以,主要的原因我不太清楚, 可能出于安全考虑吧。
如果用数字方式,同样按上的权限改变顺序,运行命令如下
[chase@lustre doc]$ chmod 644 a.txt [chase@lustre doc]$ ls -l-rw-r--r-- 1 chase chase 2 Feb 17 00:35 a.txt
所有运行位使能
[chase@lustre doc]$ chmod 755 a.txt [chase@lustre doc]$ ls -l-rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
另外还有SUID或SGID,这两个权限位主要是设定用户或用户组的运行ID。
SUID功能是当用户(不一定是该文件的拥有者)执行SUID文件时,这个文件有效用户号(UID)就会被设定为该文件拥有者的用户号(UID);如passwd命令
GUID只适用于目录,当用户在此目录下修改的任何文件的有效用户组号(GID)就会被设定为此目录的用户组号(GID);如创建一个小组的工程目录
除了以上说权限位以外,还有一个权限位说一说的,当你运行下面的命令时
[chase@lustre doc]$ ls -ld /tmp/ drwxrwxrwt 3 root root 4096 Feb 16 23:42 /tmp/
有没有注意到在权限位中第三部份的最后一位竟然是t,这一权限位的名字叫粘着位(sticky bit)。
这种权限主要是在目录上出现,它是使用户在这个目录里只能删除属于自己的文件,而不能删除其他人的文件。
对于上面说的三个权限位,我们怎样改变呢?对于这三个权限位,chmod有对应的字符和八进制数方式来改变。
对于SUID和SGID位我们只能用u+/-s或g+/-s来改变;而粘着位就用+t就可以拉,因为它是对所有的用户授权的,这是用字符方式改变的方法:
SUID改变
[chase@lustre doc]$ ls -l a.txt;chmod u+s a.txt;ls -l a.txt -rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt -rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
GUID改变
[chase@lustre doc]$ ls -l a.txt;chmod g+s a.txt;ls -l a.txt -rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt -rwsr-sr-x 1 chase chase 2 Feb 17 00:35 a.txt
粘着位改变
[chase@lustre doc]$ ls -l;chmod +t sticky;ls -l drwxrwxr-x 2 chase chase 4096 Feb 17 04:25 sticky drwxrwxr-t 2 chase chase 4096 Feb 17 04:25 sticky
在用八进制方式改变的话,它们三位都有像读写和可执行位八进制表示法,只不过在文件权限的扩展位,对应的八进制分别为4000(SUID),2000(SGID)和1000(sticky bit)
SUID改变
[chase@lustre doc]$ ls -l a.txt;chmod 4755 a.txt;ls -l a.txt -rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt -rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
GUID改变
[chase@lustre doc]$ ls -l a.txt;chmod 2755 a.txt;ls -l a.txt -rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt -rwsr-sr-x 1 chase chase 2 Feb 17 00:35 a.txt
粘着位改变
[chase@lustre doc]$ ls -l;chmod 1755 sticky;ls -l drwxrwxr-x 2 chase chase 4096 Feb 17 04:25 sticky drwxrwxr-t 2 chase chase 4096 Feb 17 04:25 sticky
当然,用户访问该文件时,系统会读取权限位来判断用户对该文件的访问权限。
和文件权限有关的系统参数还有用户缺省的文件掩码,了解用户的缺省的文件掩码可以运行命令
[chase@lustre doc]$ umask 0002
0002就是用户缺省的文件掩码,它决定当用户建立文件时缺省的文件权限,它和文件权限的关系是:普通文件:666&002=664;目录:777&002=775。
改变缺省的文件掩码只要在umask后加上想要设定的文件掩码就可以拉。 如果你不想每次登陆修改的话,可以在~/.bash_profile加上umask 077。
可能以上说的,对于很多人来说都知道,但是当你的系统用户人数比较多的时候,这些文件权限使用是要特别小心,以免一时不慎,造成对系统不必要破坏。
额外的文件属性修改
chattr使用格式
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
chattr主要参数
-R :递归处理所有的文件及子目录。
-V :详细显示修改内容,并打印输出。
- :失效属性。
+ :激活属性。
= :指定属性。
-A :Atime,告诉系统不要修改对这个文件的最后访问时间。
-S :Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
-a :Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。
如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
-i :Immutable,系统不允许对这个文件进行任何的修改。
如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
-D :检查压缩文件中的错误。
-d :No dump,在进行文件系统备份时,dump程序将忽略这个文件。
-C :Compress,系统以透明的方式压缩这个文件。
从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。
-s :Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。
-u :Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。
chattr 命令的作用很大,其中一些功能是由Linux内核版本来支持的(内核中的文件系统需要打开对额外属性的支持),如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。
cron计划任务配置
计划任务概述
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 crond 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对httpd 服务器重新启动,这就是一个计划任务;
在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。
cron 的安装和启动
在一般情况下,cron都是系统默认安装的,我们要学会查看软件包是否已经安装
在Redhat 或 Fedora等RPM包管理的系统的安装
判断系统是否已经安装cron相关的包
Fedora 5.0 系统的情况;
其它版本的Fedora及Redhat的系统和这相似;
[root@localhost ~]# rpm -qa |grep cron vixie-cron-4.1-54.FC5 anacron-2.3-36.1 crontabs-1.10-7.1
其中vixie-cron软件包是cron的主程序,您可以通过下面的命令来了解它,其它软件包同理;
[root@localhost beinan]# rpm -ql vixie-cron
crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
cron 守护进程检查 crontab 文件来查看某个指定命令被调度执行的时间。如果命令已经调度,守护进程就会执行它们。
了解crontabs软件包都安装了些什么,应该用下面的命令
[root@localhost beinan]# rpm -ql crontabs
如果没有安装,可以从光盘中找出文件名带有cron字样的软件包来安装。
[root@localhost ~]# rpm -ivh vixie-cron-4.1-54.FC5* [root@localhost ~]# rpm -ivh crontabs*
也可以用yum 来在线安装
[root@localhost ~]# yum install vixie-cron [root@localhost ~]# yum install crontabs
cron 启动、停止、重新启动方法
cron配置文件被修改后,想让新文件生效,必须重新crond服务器,有两种方法可供选择;
第一种 在Fedora或Redhat 等以RPM包管理的系统中;
[root@localhost ~]# /etc/init.d/crond start [root@localhost ~]# /etc/init.d/crond stop [root@localhost ~]# /etc/init.d/crond restart
如果想在Fedora 和 Redhat 或以这些发行版为基础克隆的发行版,如果想自动开机运行,请用下面的办法;
[root@localhost ~]# chkconfig --levels 35 crond on
第二种:通用
[root@localhost ~]# pgrep crond 注:判断crond 是否在运行; [root@localhost ~]# pkill crond 注:杀掉正在运行中的crond; [root@localhost ~]# pgrep crond 注:查看是否被杀掉了; [root@localhost ~]# /usr/sbin/crond 注:运行crond;
cron 配置文件
cron 是一个服务器程序,我们都知道Linux的服务器的配置,大多是通过配置文件来完成的,cron自然也不例外,在Redhat/Fedora 等系统中它的全局性配置文件是/etc/crontab;在Slackware系统中,全局性文件是/var/spool/cron/crontabs/root 。每个用户也有自己的cron配置文件,我们可以通过crontab -e 来编辑它;
全局性配置文件
下面是一个全局性的配置文件例子,以Fedora Core 5为例;
这些行是用来在同一时间批量执行任务的,我们在以后的例子中独立出来解说,在这里只是让大家心中有数;
[root@localhost ~]# more /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 1 * * * * root run-parts /etc/cron.hourly 注:表示每个小时的第一分钟,开始执行/etc/hourly目录下的可执行程序或脚本; 2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4点2分,开始执行/etc/cron.daily目录下的可执行程序或脚本; 22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7个周4点我22分,开始执行 /etc/cron.weekly目录下的可执行程序或脚本; 42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4点42分,开始执行/etc/cron.monthly目录下的可执行程序或脚本; */5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg 注:每隔5分钟用mrtg生成mrtg图
对于全局性配置文件,我们要用root权限来更改,一般是通过crontab -e 来修改。
但有时也并不一定是这样的,比如Fedora Core 5 如果通过crontab -e 修改的是root用户的cron 配置文件。
所以我们要在Fedora Core 5中修改全局性配置文件可以用vi 编辑器来修改。
# vi /etc/crontab
在全局性配置文件中,定义了可执行命令的路径环境变量,所用SHELL类型的定义等,这些大多不用修改;
我们经常添加的是计划任务或修改任务执行的时间等;
非交互模式写入crontab定时任务
# 执行以下命令 (crontab -l;echo "0 0 * * * cmd ") | crontab #查看有没有,有就在运行,不用reload什么 crontab -l #主要是把列表剔除想删掉的行,再整体倒到crontab里 crontab -l | grep -v "cmd" | crontab #清空crontab ""|crontab
计划任务cron配置
说明
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
参数
-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。 -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe) -r : 删除目前的时程表 -l : 列出目前的时程表
时程表的格式如下
f1 f2 f3 f4 f5 program 分 时 日 月 星期 命令
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
PS:
新版本的Crontab可以实现以秒运行程序的。可以通过 man crontab查看是否支持second
格式如下:
1:2 second 2 of minute 1 1:2,5:10 second 2 of minute 1 and second 10 of minute 5 *:3 second 3 of any minute *:*/5 any second that is divisible by 5
只是设置分钟那里跟平时的不大一样,其他部分一样。
例子
每月每天每小时的第 0 分钟执行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo “haha” 20 0-23/2 * * * echo “haha”
如果我希望21点到8点期间每三小时执行一次:
0 21-8/3 * * * 命令
希望每10分钟执行一次:
*/10 * * * * 命令
注意
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可
date 常用方式
在linux下获取时间字符串
命令 date
# 以yyyymmdd格式输出3天之前现在这个时刻的时间 $ date +%Y%m%d –d="-3 day"
$ date -u Thu Sep 28 09:32:04 UTC 2006
$ date -R Thu, 28 Sep 2006 17:32:28 +0800
# 测试十亿分之一秒 $ date +"%Y%m%d %H:%M:%S.%N" $ date +"%Y%m%d %H:%M:%S.%N" $ date +"%Y%m%d %H:%M:%S.%N" $ date +"%Y%m%d %H:%M:%S.%N" 20060928 17:44:20.906805000 20060928 17:44:20.909188000 20060928 17:44:20.911535000 20060928 17:44:20.913886000
date时间转换成秒数
seconds=`date -d "now" +%s`
date 参考
$ date –help Usage: date [OPTION]… [+FORMAT] or: date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]] Display the current time in the given FORMAT, or set the system date. -d, –date=STRING display time described by STRING, not `now’ # such as ‘n days ago |1 month ago|n years ago’ -f, –file=DATEFILE like –date once for each line of DATEFILE -ITIMESPEC, –iso-8601[=TIMESPEC] output date/time in ISO 8601 format. TIMESPEC=`date’ for date only, `hours’, `minutes’, or `seconds’ for date and time to the indicated precision. –iso-8601 without TIMESPEC defaults to `date’. -r, –reference=FILE display the last modification time of FILE -R, –rfc-2822 output RFC-2822 compliant date string -s, –set=STRING set time described by STRING -u, –utc, –universal print or set Coordinated Universal Time –help display this help and exit –version output version information and exit
FORMAT controls the output. The only valid option for the second form specifies Coordinated Universal Time. Interpreted sequences are: %% 输出%符号 a literal % %a 当前域的星期缩写 locale’s abbreviated weekday name (Sun..Sat) %A 当前域的星期全写 locale’s full weekday name, variable length (Sunday..Saturday) %b 当前域的月份缩写 locale’s abbreviated month name (Jan..Dec) %B 当前域的月份全称 locale’s full month name, variable length (January..December) %c 当前域的默认时间格式 locale’s date and time (Sat Nov 04 12:02:33 EST 1989) %C n百年 century (year divided by 100 and truncated to an integer) [00-99] %d 两位的天 day of month (01..31) %D 短时间格式 date (mm/dd/yy) %e 短格式天 day of month, blank padded ( 1..31) %F 文件时间格式 same as %Y-%m-%d %g the 2-digit year corresponding to the %V week number %G the 4-digit year corresponding to the %V week number %h same as %b %H 24小时制的小时 hour (00..23) %I 12小时制的小时 hour (01..12) %j 一年中的第几天 day of year (001..366) %k 短格式24小时制的小时 hour ( 0..23) %l 短格式12小时制的小时 hour ( 1..12) %m 双位月份 month (01..12) %M 双位分钟 minute (00..59) %n 换行 a newline %N 十亿分之一秒 nanoseconds (000000000..999999999) %p 大写的当前域的上下午指示 locale’s upper case AM or PM indicator (blank in many locales) %P 小写的当前域的上下午指示 locale’s lower case am or pm indicator (blank in many locales) %r 12小时制的时间表示(时:分:秒,双位) time, 12-hour (hh:mm:ss [AP]M) %R 24小时制的时间表示 (时:分,双位)time, 24-hour (hh:mm) %s 自基础时间 1970-01-01 00:00:00 到当前时刻的秒数 seconds since `00:00:00 1970-01-01 UTC’ %S 双位秒 second (00..60); the 60 is necessary to accommodate a leap second %t 横向制表位(tab) a horizontal tab %T 24小时制时间表示 time, 24-hour (hh:mm:ss) %u 数字表示的星期(从星期一开始 1-7)day of week (1..7); 1 represents Monday %U 一年中的第几周星期天为开始 week number of year with Sunday as first day of week (00..53) %V 一年中的第几周星期一为开始 week number of year with Monday as first day of week (01..53) %w 一周中的第几天 星期天为开始 0-6 day of week (0..6); 0 represents Sunday %W 一年中的第几周星期一为开始 week number of year with Monday as first day of week (00..53) %x 本地日期格式 locale’s date representation (mm/dd/yy) %X 本地时间格式 locale’s time representation (%H:%M:%S) %y 两位的年 last two digits of year (00..99) %Y 年 year (1970…) %z RFC-2822 标准时间格式表示的域 RFC-2822 style numeric timezone (-0500) %Z 时间域 time zone (e.g., EDT), or nothing if no time zone is determinable
dd命令使用方法
shell:dd用法
虚拟块设备文件又称硬盘镜像文件(Hard Disk Image),但不是所有的硬盘镜像文件都是虚拟块设备文件,例如,目前Ghost的GHO格式的镜像文件就不能成为虚拟机中的硬盘。
Linux的dd命令,可以用于生成虚拟块设备文件。既可以用于创建空镜像文件,也可以用于创建物理硬盘的镜像。
# dd if=/dev/hda of=/mnt/hda_dd.image 4757130+0 records in 4757130+0 records out
上面这个命令将IDE设备/dev/hda的内容复制到/mnt/hda_dd.image文件。
参数if告诉dd从哪个文件读取数据,参数 of告诉dd读出的数据写入哪个文件中。注意,对于dd来说,输入和输出都是文件,dd做的只是文件拷贝工作,这得益于Unix/Linux下面将设备也抽象为特殊的文件。
一般来说设备文件有两种,一种是块设备,一种是字符设备。
块设备的特点是可以随机读写(Random Access),比如内存、硬盘等。 字符设备的特点是顺序读写(Sequential Access),比如鼠标,键盘,麦克风等。
前面说了如何生成物理硬盘的镜像,如果想生成空镜像文件(本文的主要目的),还需要一个特殊的设备。/dev/zero是Linux提供的一个特殊的字符设备,它的特点是可以永远读该文件,每次读取的结果都是二进制0。
下面的命令可以生成一个100M的空镜像文件:
dd if=/dev/zero of=100M.img bs=1M count=100
除了前面已经解释的of和if参数,这次又出现了bs和count参数。bs=1M表示每一次读写1M数据,count=100表示读写 100次,这样就指定了生成文件的大小为100M。bs参数还可以进一步细分为ibs和obs两种,为读操作与写操作分别指定不同的Buffer大小。
这样就生成100M的空镜像文件,问题是,如果要生成1G的虚拟块设备文件,就得占用1G的硬盘空间,而这个镜像文件完全是空的,是不是有一点浪费?好在Linux支持Sparse(稀疏)文件。
请看下面的例子
[root@CentOs4 home]# dd if=/dev/zero of=1G.img bs=1M count=0 seek=1024 0+0 records in 0+0 records out [root@CentOs4 home]# ls -al 1G.img -rw-r--r-- 1 root root 1073741824 Dec 8 12:49 1G.img [root@CentOs4 home]# du -sm 1G.img 0 1G.img
这里用了一个新的命令seek,表示略过1024个Block不写(这里Block按照bs的定义是1M),count=0表示写入0个Block。用ls命令看新生成的文件,大小可以看出是1000M。但是再用du一看,实际占用硬盘大小只有1M。
用dd备份指定部分
举例说明:
假如我有一个文件abc.gz,大小为83456k,我想用dd命令实现如下备份结果:首先将备份分成三个部分,第一部分为备份文件abc.gz的前10000k,第二部分为中间的70000k,最后备份后面的3456k.
备份方法如下三条命令:
dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000 dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000 dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000
恢复方法如下:
dd if=abc.gz.bak1 of=abc.gz dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000 dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000
这时你查看一下恢复的文件将和你原来的文件一模一样,说明备份成功!
说明一下:
bs=xxx这个选项是指你要备份时一次性创建的块大小,而count=xxx则是指从备份的开头开始算总共备份多少块.
也就是说假如你的bs=3k而count=5,则说明你一个块为3k,总共5个块,则备份了原文件的15k(3k*5=15k).
而skip=xxx则是在备份时对if后面的部分也就是原文件跳过多少块再开始备份,相反seek=xxx则是在备份时对of后面的部分也就是目标文件跳过多少块再开始写。
file 命令详解
功能说明:
辨识文件类型。
语法:
file [-beLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
补充说明:
通过file指令,我们得以辨识该文件的类型。
参数:
-b 列出辨识结果时,不显示文件名称。 -c 详细显示指令执行过程,便于排错或分析程序执行的情形。 -f <名称文件> 指定名称文件,其内容有一个或多个文件名称呢感,让file依序辨识这些文件,格式为每列一个文件名称。 -L 直接显示符号连接所指向的文件的类别。 -m <魔法数字文件> 指定魔法数字文件。 -v 显示版本信息。 -z 尝试去解读压缩文件的内容。
find 命令详解
功能
在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
语法
file [-beLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
说明
find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。
该命令提供的寻找条件可以是一个用逻辑运算符not、and、or组成的复合条件。逻辑运算符and、or、not的含义为: (1)and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足。例如:
$ find –name 'tmp' –xtype c -user 'inin'
该命令寻找三个给定条件都满足的所有文件。
(2)or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足。例如:
$ find –name 'tmp' –o –name 'mina*'
该命令查询文件名为'tmp'或是匹配'mina*'的所有文件。
(3)not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。例如:
$ find ! –name 'tmp'
该命令查询文件名不是’tmp’的所有文件。
当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符““来去除括号的意义。 例:$ find (–name 'tmp' –xtype c -user 'inin')
寻找条件有以下选项
首先,下列各个选项中的n值可以有三种输入方式,假设n为20,则:
+20 表示20以后(21,22,23等) -20 表示20以前(19,18,17等) 20 表示正好是20
以名称和文件属性查找。
-name '字串' 查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[] -lname '字串' 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符*、?、[]。 -gid n 查找属于ID号为n的用户组的所有文件。 -uid n 查找属于ID号为n的用户的所有文件。 -group '字串' 查找属于用户组名为所给字串的所有的文件。 -user '字串' 查找属于用户名为所给字串的所有的文件。 -empty 查找大小为0的目录或文件。 -path '字串' 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[]。 -perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。 -size n[bckw] 查找指定文件大小的文件,n后面的字符表示单位,缺省为b,代表512字节的块。 -type x 查找类型为x的文件,x为下列字符之一: b 块设备文件 c 字符设备文件 d 目录文件 p 命名管道(FIFO) f 普通文件 l 符号链接文件(symbolic links) s socket文件 -xtype x 与-type基本相同,但只查找符号链接文件。
以时间为条件查找
-amin +n -n 按访问时间查找 -n指n分钟以内,+n指n分钟以前。 -atime +n -n 按访问时间查找 -n指n天以内,+n指n天以前。 -cmin +n -n 按创建时间查找 -n指n分钟以内,+n指n分钟以前。 -ctime +n -n 按创建时间查找 -n指n天以内,+n指n天以前。 -mmin +n -n 按修改时间查找 -n指n天以内,+n指n天以前。 -mtime +n -n 按修改时间查找 -n指n天以内,+n指n天以前。
可执行的操作
-exec 命令名称 {} 对符合条件的文件执行所给的Linux命令,而不询问用户是否需要执行该命令 {} 表示命令的参数即为所找到的文件;命令的末尾必须以** "\;"** 结束 -ok 命令名称 {} 对符合条件的文件执行所给的Linux命令,与exec不同的是,它会询问用户是否需要执行该命令 -ls 详细列出所找到的所有文件 -fprintf 文件名 将找到的文件名写入指定文件 -print 在标准输出设备上显示查找出的文件名 -printf 格式 格式的写法请参考有关C语言的书
例1:查找当前目录中所有以main开头的文件,并显示这些文件的内容。
$ find . -name 'main*' -exec more {} \;
例2:删除当前目录下所有一周之内没有被访问过的a .out或.o文件。 $ find . (-name a.out -o -name '.o') -atime +7 -exec rm {} \;
例3:查找当前目录下的所有的某种格式的文件并移动到另外的目录
$ find /home/ -name *.zip -exec mv {} /home1/zipback/ \;
高级用法:
查当前目录以下包括各个子目录中所有PHP文件,并用GREP查代里面含有“viewnew”字样,并把这个文件名显示出来。
find . -name "*.php" -exec grep viewnew {} -H \;
寻找包含有空白的文件
find /home -size +10000k -print0 | xargs -0 ls -l
gzip 命令详解
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。
gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
语法:
gzip [选项] 压缩(解压缩)的文件名
各选项的含义:
-c 将输出写到标准输出上,并保留原有文件。 -d 将压缩文件解压。 -l 对每个压缩文件,显示下列字段: 压缩文件的大小 未压缩文件的大小 压缩比 未压缩文件的名字 -r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。 -t 测试,检查压缩文件是否完整。 -v 对每一个压缩和解压的文件,显示文件名和压缩比。 -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比) 系统缺省值为6。
假设一个目录/home下有文件mm.txt、sort.txt、xx.com。
例1:把/home目录下的每个文件压缩成.gz文件。
$ cd /home $ gzip * $ ls m.txt.gz sort.txt.gz xx.com.gz
例2:把例1中每个压缩的文件解压,并列出详细的信息。
$ gzip -dv * mm.txt.gz 43.1%-----replaced with mm.txt sort.txt.gz 43.1%-----replaced with sort.txt xx.com.gz 43.1%-----replaced with xx.com $ ls mm.txt sort.txt xx.com
例3:详细显示例1中每个压缩的文件的信息,并不解压。
$ gzip -l * compressed uncompr. ratio uncompressed_name 277 445 43.1% mm.txt 278 445 43.1% sort.txt 277 445 43.1% xx.com $ ls mm.txt.gz sort.txt.gz xx.com.gz
例4:压缩一个tar备份文件,如usr.tar,此时压缩文件的扩展名为.tar.gz
$ gzip usr.tar $ ls usr.tar.gz
kill 命令详解
功能说明:
删除执行中的程序或工作。
语法:
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>] [程序] [程序]可以是程序的PID或是PGID,也可以是工作编号。
补充说明:
kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。
程序或工作的编号可利用ps指令或jobs指令查看。
参数:
- l <信息编号> 若不加<信息编号>选项,则-l参数会列出全部的信息名称。
- s <信息名称或编号> 指定要送出的信息。
tar命令使用
打包命令
tar zcvf xx.tgz axx bxx cxx
排除某些包打包
tar zcvf my.tar.gz --exclude "/var/www/drupal/files" --exclude "/var/www/drupal/themes" /var/www/drupal
解压命令
tar zxvf xx.tgz -C /prefix
wget离线下载工具
wget --no-check-certificate -c -r -nd -np -nH -k -L -R "index.html*" \ https://mirror.rc.usf.edu/elrepo/kernel/el8/x86_64/RPMS/
-c : 断点续传 -r : 遍历所有子目录 -nd : 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录 -np : 不到上一层子目录去 -nH : 不要将文件保存到主机名文件夹 -R index.html : 不下载 index.html 文件 -k : 将绝对链接转为相对链接,下载整个站点后脱机浏览网页,最好加上这个参数 -L : 递归时不进入其它主机,如wget -c -r www.xxx.org/ 如果网站内有一个这样的链接:www.yyy.org,不加参数-L,就会像大火烧山一样,会递归下载www.yyy.org网站 -p : 下载网页所需的所有文件,如图片等 -i : 后面跟一个文件,文件内指明要下载的URL
wget -r -np -nd --accept=iso http://example.com/centos-5/i386/
多加了一个 –accept=iso 选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。
wget -m -k (-H) http://www.example.com/
该命令可用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。
curl实战
curl(Client URL)是一个强大的命令行工具,用于在 Linux/Unix 系统中传输数据。它支持多种协议,包括 HTTP、HTTPS、FTP、SFTP 等,是开发者和系统管理员日常工作中不可或缺的工具。
curl 的主要特点
多协议支持:支持几乎所有主流网络协议 无界面操作:纯命令行工具,适合脚本和自动化任务 功能丰富:支持文件上传下载、表单提交、Cookie 处理等 跨平台:在 Linux、macOS、Windows 上均可使用
基本请求控制
| 选项 | 说明 | 示例 |
|---|---|---|
| -X | 指定 HTTP 方法 | curl -X POST https://example.com |
| -d | 发送 POST 数据 | curl -d “name=John” https://example.com |
| -G | 将 -d 数据作为 GET 参数发送 | curl -G -d “q=keyword” https://search.com |
| -H | 添加请求头 | curl -H “Content-Type: application/json” https://api.com |
curl模拟websocket协议
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \ -H "Host: gd.mix.ecn.upyun.com:32242/websocket/HKDL_AC1701" \ -H "Origin: gd.mix.ecn.upyun.com" \ http://gd.mix.ecn.upyun.com:32242/websocket/
time echo '[2,"3","Heartbeat",{}]' | websocat_amd64-linux-static -k ws://gd.mix.ecn.upyun.com:32242/websocket/HKDL_AC1701
curl支持哪些tls协议版本
很多软件都依赖最新版openssl的软件如: openssh, stunnel, curl, wget, nginx, redis…
# 编译新的openssl版本, 1.1.1o,开启tls高级别,禁用rc4 ./config --prefix=/opt/openssl -fPIC enable-tls1_3 enable-shared enable-zlib no-asm no-rc4 # 编译新的stunnel软件,使用openssl库 ./configure --prefix=/opt/stunnel --with-ssl=/opt/openssl # 编译新的openssh 版本 ./configure --prefix=/usr --with-pam \ --libexecdir=/usr/libexec/openssh \ --sysconfdir=/etc/ssh \ --with-privsep-path=/var/empty/sshd \ --with-ssl-dir=/opt/openssl/ # 编译新的curl 版本如7.83.1 ./configure --prefix=/usr/local --without-nss --with-ssl=/opt/openssl
查看curl支持哪些tls version
curl -h all | grep -- --tlsv curl https://upwan.net --resolve upwan.net:443:101.251.144.11
使用curl上传json数据
curl -X POST -T dump.json \ -H "Content-Type: application/json" \ -H "ApiKey: YyB5Tqq93oY46tz5BDMsd1OqpkNFTtsP" \ --tlsv1.1 --tls-max 1.3 -k -m 60 \ --resolve "nsq-cdn.x.upyun.com:443:183.136.236.254" \ https://nsq-cdn.x.upyun.com/pub?topic=machine_facts_cdn curl -X POST -u "guest:upyun.com123" \ http://devops.upyun.com/users/ \ -H 'Content-Type: application/json' \ -d '{ "dcid": 100, "uid": 16780 }'
用curl模拟ftp上传下载备份数据库
客户是国企,服务器上不了外网,也无法下载ftp客户,幸好已经安装了curl,于是用curl来模拟ftp指令。
#!/bin/bash TADAY=$(data +%Y%m%d) OLDDAYS=$(data -d "7 day ago" +%Y%m%d) CURL="curl -u username:password" FILE="xihuguo_$TADAY.sql.gz" OLDFILE="xihuoguo_$OLDDAYS.sql.gz" echo "backup sql .... $FILE" mysqldump --opt -u x -p xx xihuo | gzip -c > $FILE echo "upload file ... $FILE" $CURL ftp://10.0.0.1/sqlbackup/ -T $FILE echo "delete old file ... $OLDFILE" $CURL ftp://10.0.0.1/ -Q --quote "DELE /sqlbackup/$OLDFILE"