目录名称 | 描述 |
---|---|
/bin | 存放常用的二进制可执行命令:ls、rm、mkdir、rmdir、gzip、tar、telnet、ftp等 |
/dev | 存放与设备相关的特殊文件,unix与linux将设备当成文件处理 /dev/fdo代表软盘 /dev/cdrom代表光盘 |
/etc | 存放系统管理与配置文件,如LILO的参数、用户的账号密码设置等 |
/etc/apt | 存放软件源相关配置的地方,如sources.list |
/home | 用户所在的目录,如user用户,主目录就是/home/user,使用~回到主目录 |
/lib | 库文件,又叫动态链接共享库 |
/sbin | 系统管理命令,系统管理员使用,fdisk、mke2fs、fsck、mkswap、mount等 |
/boot | 放置系统核心与启动和关闭有关的文档 |
/tmp | 公用的临时文件存储点 |
/root | 系统管理员的主目录 |
/mnt | 让用户临时装载其他的文件系统,如装载软盘的文件系统 |
/lost+found | 这个目录平时为空,系统非正常相关留下的文件在此,类似windows的*.chk文件 |
/proc | 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息 |
/var | 系统在工作时,预先设置的工作目录,日志、邮件等 |
/var/cache/apt/archives | 使用apt-get安装时,缓存的安装包目录 |
/usr | 最庞大和最重要的目录之一,要用到的应用程序和文件几乎都在这 |
/usr/X11R6 | 存放X-window的目录 |
/usr/bin | 众多的应用程序 |
/usr/sbin | 超级用户的一些管理程序 |
/usr/doc | linux系统的说明文档 |
/usr/include | linux下开发和编译应用程序所需的头文件 |
/usr/lib | 存放常用的动态链接库和软件包的配置文件 |
/usr/man | 存放帮助文档 |
/usr/src | linux内核的源代码存放在这,编译内核必须用到 |
/usr/local/bin | 本地增加的命令,通常用于软件升级 |
/usr/local/lib | 本地增加的库 |
tar [主选项+辅选项] [文件或目录]
-c : 创建新档案,压缩
-x : 释放压缩文件(对于xz、xj、bz2等后缀使用)
-v : 报告处理信息
-f : 通常必选,使用档案文件或设备
解压文件a到指定的目录,例子:
tar -xvf a.tar -C /path
tar -xzvf a.tar.gz -C /path
压缩文件或目录,例子:
tar -cvf a.tar *.jpg
tar -czvf a.tar.gz dir
zip [解压后的文件名] [文件或目录]
- -r : 压缩目录
unzip [要解压的文件]
su - [用户名]
相当于备份原文件,可实现同步更新
in [选项] [原文件] [目标文件]
- -s : 生成软链接,相当于快捷方式
chown [用户] [文件或目录]
chgrp [用户组] [文件或目录]
find [搜索范围] [匹配条件]
/ -name [文件名] : 全盘搜索,文件名部分支持使用 通配符 、?等
/ -iname [文件名] : 不区分大小写查找文件
/ -size ±n : 大于或小于n(KB) * 2的文件被查找
/ -user [所有者] : 根据用户类型查找
/ -group [所属组] : 根据所属组查找
/ -amin -5 : 5分钟内被 访问 的文件,+5表示5分钟外,不可无正负号
/ -cmin -5 : 5分钟内被 改变属性 的文件
/ -mmin -5 : 5分钟内被 被改内容 的文件
/ -inum [文件名] : 查找硬链接
/ -size +163840 -a -size -204800 : 查找大于80M小于100M的文件
locate [选项] [文件名]
- -i : 不区分大小写
需配合使用 updatedb 命令更新文件资料库使用(不更新/tmp目录)
which [命令]
whereis [命令]
grep [选项] [字符串] [搜索范围]
-rn : 在目录中递归搜索并返回该行字符串与所对应行号
-i : 不区分大小写
-v : 排除指定字符串
man [命令或配置文件]
[命令] --help
help [内置命令]
who
w
last
lastlog
write [用户名]
使用ctrl+d保存结束
wall [消息]
ifconfig [网卡名称] [IP地址]
临时修改ip地址(重启失效),例子:
ifconfig eth0 192.168.x.xxx
traceroute [网址]
netstat [选项]
-t : 查看TCP连接
-u : 查看UDP连接
-l : 监听
-r : 路由
-n : 显示ip地址和端口号
查看本机监听的端口,例子:
netstat -tuln
查看本机的所有网络连接,例子:
netstat -an
查看本机路由表,例子:
netstat -rn
shutdown [选项] [时间]
-c : 取消前一个关机命令
-h : 关机
-r : 重启
20分钟30秒后关机,例子:
shutdown -h 20:30
立刻重启,例子:
shutdown -r now
其他关机指令:
halt
poweroff
init 0
重启指令:
reboot
init 6
dpkg [选项] [deb包]
-i : 安装
-P : 彻底卸载已安装的软件
–list : 查看已安装的包
seahorse
diff [选项] [文件名] [文件名]
- -l : 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异
gcc [源文件.c] [选项] [目标文件.out] [-lm]
-o : 指定生成的输出文件
-E : 仅执行编译预处理
-S : 将C代码转换为汇编代码
-wall : 显示警告信息
-c : 仅执行编译操作,不进行连接操作
最后加-lm : 可以解决一般未定义引用的问题
lsusb
dmesg
arp
和grep搭配使用,例如:
arp | grep 60:A4:4C:CC:F3:79
scp [选项] [源文件地址] [目标地址]
- -r : 可传输目录
例子:
scp [email protected]:/path/filename /localpath
scp -r /localpath/folder/ [email protected]:/path/
例如:
date -s "2015-9-24 11:42:01"
设置时区:
运行tzselect
命令,再将生成的配置文件导入
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
同步网络时间:
ntpdate time.windows.com #微软
ntpdate 0.pool.ntp.org #有域名负载均衡
ntpdate 0.cn.pool.ntp.org #有域名负载均衡
ntpdate ntp.tuna.tsinghua.edu.cn #清华大学
注意虚拟机不能使用该命令。
将当前目录(包括子目录)中所有文件中的yyyy字符串替换为xxxx字符串(若要仅替换txt文件中的yyyy,将*改为 --include="*.txt" )。例如:
sed -i s/yyyy/xxxx/g `grep yyyy -rl * ./`
注释和恢复含"robot.play_sounds_"的一行代码,例如:
sed -i s#robot.play_sounds_#/robot.play_sounds_#g `grep robot.play_sounds_ -rl * ./`
sed -i s#/robot.play_sounds_#robot.play_sounds_#g `grep //robot.play_sounds_ -rl * ./`
打开一张图片并全屏,例如:
eog -f -g --display=:0 smile.jpg
用来截获网络数据包,针对网络层、协议、主机、网络端口过滤,提供and
、or
、not
等逻辑语句来去掉无用信息。
常用命令
tcpdump [选项] [参数]
-i : 指定网络接口,如
eth1
-D : 显示可用的接口列表
-n : 不要解析主机名
-nn : 不要解析主机名或者端口名
-q : 显示更少的输出,更加简洁
-t : 输出可读的时间戳
-tttt : 输出最大程度可读的时间戳
-A : 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息),在抓取包含网页数据的数据包时,可方便查看数据(nt: 即Handy for capturing web pages)
-X : 以
hex
和ASCII
两种形式显示包的内容-XX : 与X类似,增加以太网
header
的显示-v, -vv, -vvv : 显示更加多的包信息
-c : 只读取指定数量的包,然后停止
-l : 基于行的输出,便于保存查看,或者交给其它工具分析
-s : 指定每一个包捕获的长度,单位是
byte
,使用-s 0
捕获整个包内容-S : 输出绝对的序列号
-e : 获取以太网
header
-E : 使用提供的秘钥解密
IPSEC
流量-w : 将捕获的数据包写入文件
-C : 设置一个文件大小(单位M,1000进制),配合
-w
选项使得原始数据包保存到文件之前,检查文件大小超过指定值,则关闭此文件创建新文件-r : 从文件中读取,使用各种参数分析文件
ip6 : 只显示ipv6的流量
host : 指定主机名、域名、IP监听数据包
net : 监听指定网络的数据包,如
1.2.3.0/24
port : 监听指定的端口
src : 指定目标地址,监听来自目标地址发来的包
dst : 指定目标地址,监听所有发送到目标地址的包
tcp, udp, icmp, ah : 显示特定协议的流量,如根据TCP Flags协议分离数据
'tcp[13] & 4!=0'
,'tcp[tcpflags] == tcp-rst'
portrange : 查看一个端口范围的流量,如
portrange 21-23
高级
使用组合语句可以完成更多高级的过滤。
and
、&&
or
、||
not
、!
less
、<
greater
、>
<=
例子
tcpdump -nnvvS
原始数据输出,不解析主机名、端口号更直观。
tcpdump host A and \( B or C \)
打印A与B或与C之间的数据包。
tcpdump -nnvvS src 10.5.2.3 and dst port 3389
来自10.5.2.3和发往任意主机3389端口的包。
tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
来自192.168.X.X子网,发往10.X子网和172.16.X.X子网,显示十六进制,不翻译主机名,一个v的详细信息。
tcpdump dst 192.168.0.2 and src net and not icmp
发往192.168.0.2,非icmp流量。
tcpdump -vv src mars and not dst port 22
来自mars主机,发往非ssh端口的数据。
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
复杂查询时,使用单引号,忽略特殊字符括号。
tcpdump -vvAs0 port 53
DNS流量。
tcpdump -vvAs0 port ftp or ftp-data
FTP流量。
tcpdump -vvAs0 port 123
NTP流量。
tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '
密码。
tcpdump 'ip[6] & 128 != 0'
IP header中有一个bit从来没有被用过,我们叫它evil bit.可以筛选设置它的包。
tcpdump 'ip[8] < 10'
过滤TTL小于10的包(通常情况下是存在问题或者在使用traceroute)。
根据TCP Flags分离数据
tcpdump 'tcp[13] & 4!=0' #使用TCP RST flag筛选
tcpdump 'tcp[tcpflags] == tcp-rst'
tcpdump 'tcp[13] & 2!=0' #根据 TCP SYN flag筛选
tcpdump 'tcp[tcpflags] == tcp-syn'
tcpdump 'tcp[13]=18' #据TCP SYN和ACK flag筛选
tcpdump 'tcp[13] & 32!=0' #根据TCP URG flag筛选
tcpdump 'tcp[tcpflags] == tcp-urg'
tcpdump 'tcp[13] & 16!=0' #根据TCP ACK flag筛选
tcpdump 'tcp[tcpflags] == tcp-ack'
tcpdump 'tcp[13] & 8!=0' #根据TCP PSH flag筛选
tcpdump 'tcp[tcpflags] == tcp-psh'
tcpdump 'tcp[13] & 1!=0' #根据TCP FIN flag筛选
tcpdump 'tcp[tcpflags] == tcp-fin'
tcpdump 'tcp[13] = 6' #根据SYN 和RST筛选
tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D' #SSH连接
根据关键字筛选
tcpdump -vvAls0 | grep 'User-Agent:' #发现 HTTP User Agent
tcpdump -vvAls0 | grep 'GET' #GET 请求
tcpdump 'tcp[32:4] = 0x47455420'
tcpdump -vvAls0 | grep 'POST' #POST 请求
tcpdump 'tcp[32:4] = 0x504f5354'
tcpdump 'tcp[(tcp[12]>>2):4] = 0x504f5354'
tcpdump -s 0 -A '(tcp[(tcp[12]>>2):4] = 0x47455420) or (tcp[(tcp[12]>>2):4] = 0x504f5354)' #记录GET和POST请求
tcpdump -vvAls0 | grep 'Host:' #HTTP Host
tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:' #HTTP Cookie
sudo tcpdump -s 0 -A tcp[20:2]=0x4745 or tcp[20:2]=0x504f #HTTP 请求
a
:光标所在字符后插入A
:行末插入o
:光标下插入新行O
:光标上插入新行i
:光标所在字符前插入I
:行首插入$
:到行尾0
:到行首光标移动
:↑h、↓l、←j、→kctrl+f
:后翻ctrl+b
:前翻x
:删除光标处字符u
:撤销ctrl+r
:恢复撤销yy
:复制行p
:粘贴dd
:删除一行R
:替换,等同于插入模式
的insert键/string
:搜索指定的字符串,按n
键查找下一个:
):set nu
:设置行号,取消行号为::set nonu
:n
:到第n行:n1,n2d
:删除n1-n2的行:set ic
:不区分大小写,区分大小写为::set noic
:n1,n2s/要替换的字符串/新字符串/g
:替换字符串范围为n1-n2行内,将n1,n2s改为%s
表示全文替换:r [路径文件名]
:将文件内容导入到当前vim中光标位置:![命令]
:在不退出vim时,可执行相应命令:ab [别名] [vim命令]
:为某一命令起别名,如::ab sn set nu
为将显示行号命令改为了:sn
命令:map [快捷键] [触发命令]
:自定义快捷键,如map ^p I#
为给光标处行首添加#
(注意^p是ctrl+v+p组合键)保存配置文件:在home
目录下,设置.vimrc
文件可永久保存设置的各种快捷键。
git init
git add [file]
添加全部变动:
git add .
git commit -m “Notes”
修改上次的commit内容:
git commit --amend
git push -u origin [branch] -f
git status
git diff [file]
查看与特定版本的差异:
git diff [md5] -- [file]
查看当前改动全部差异:
git diff
git log
查看分支的合并情况:
git log --graph
git reset
git reset --hard [md5]
git reflog
放弃当前改动,回退到最近一次commit或add的状态:
git checkout – [file]
回退工作树全部变动:
git checkout – .
切换分支:
git checkout [branch_name]
创建分支并切换到分支:
git checkout -b [branch_name]
git merge [target_branch]
git tag [name]
查看当前分支:
git branch
创建分支:
git branch [branch_name]
删除分支:
git branch -d [branch_name]
git fetch origin [remote_branch]
主分区
:最多只能有4个
扩展分区
:只能有1个,也是主分区的一种,不能存储、格式化
逻辑分区
:存在于扩展分区,Linux最多支持59个逻辑分区(IDE硬盘59个,SCSI硬盘最多11个)
分区形式 | 分区文件名 | 意义 |
---|---|---|
主分区1 | /dev/sda1 | sd 表示:SCSI和SATA硬盘,IDE硬盘用hd** 表示; a 表示:当前操作系统挂载的第一块磁盘,第二块就为b 表示,以此类推; 1 表示:该磁盘的第一个分区; |
扩展分区 | /dev/sda2 | sda3、sda4会自动留给可能出现的其他主分区,不会被逻辑分区占用 |
逻辑分区1 | /dev/sda5 | 第一个逻辑分区 |
逻辑分区2 | /dev/sda6 | 第二个逻辑分区 |
逻辑分区3 | /dev/sda7 | 第三个逻辑分区 |
ext2
:最大支持16TB分区,2TB文件;
ext3
:同上,自带日志功能,可靠性提高;
ext4
:最大支持1EB分区,16TB文件;
df [选项]
-a : 显示全部文件系统,包含隐藏和特殊文件系统
-h : 以友好的数据单位显示文件系统大小(例如-h显示GB,-m显示MB,-k显示KB)
-T : 显示文件系统类型
du [选项] [目录或文件名]
-a : 显示每个子目录与文件占用量,默认只统计子目录占用
-s : 统计总占用量,其余不显示
du
命令只看文件占用空间,df
会看文件、命令、程序的占用空间。
-a : 不显示提示,自动修复文件系统
-y : 自动修复,功能和-a一致,有些发行版Linux不支持-a可用-y
dumpe2fs [分区设备文件名]
- -h : 只看超级块内容
例如查看一个分区的uuid:
dumpe2fs /dev/sda1
或
sudo blkid
mount [选项] [文件系统] [设备文件名] [挂载点]
-t : 一般必选这个参数,设置需要挂载的文件系统,vfat = fat32, fat = fat16
-o : 挂载命令的特殊选项,多个选项由逗号隔开,用来使操作系统识别被挂载对象的内容,一般防止出现中文文件乱码
-l : 显示已挂载的设备,并显示卷标
-a : 依据/etc/fstab的内容,自动挂载
例子1,挂载光盘:
mount -t iso9660 /dev/sr0 /mnt/[path]
例子2,挂载U盘:
1、先查看U盘的设备文件名,U盘可能是/dev/sdb1:
sudo fdisk -l
2、再挂载U盘,一下提供两种方式:
mount -t vfat -o utf8=1 /dev/sdb? /mnt/[path]
mount -t vfat -o iocharset=utf8 /dev/sdb? /mnt/[path]
例子3,重新挂载/home目录并取消可执行能力,不需要重启操作系统:
mount -o remount,noexec /home
例子4,使用NTFS-3G软件可使Linux支持NTFS文件系统的磁盘:
mount -t ntfs-3g [设备文件名] [挂载点]
例子5,临时挂载swap文件的方法:
1、新建swap虚拟磁盘文件:
fallocate -l 2048M swapfile
2、给予权限:
chmod 600 swapfile
3、格式化为swap文件系统格式:
mkswap swapfile
4、设置为swap分区,不用时可用swapoff
将其卸载,此时swapfile文件即可删除:
sudo swapon swapfile
5、使用free -h
命令看到该swap分区,fdisk
看不到,因为是虚拟的。
umount [/dev/设备文件名 或 设备挂载点]
fdisk [选项]
- -l : 查询系统中有多少个可以被识别的硬盘
在fdisk命令的交互环境中进行硬盘分区:
1、首先选中一块硬盘:
fdisk /dev/sdb
2、常用交互指令意义:
注意:按住ctrl才可以使用退格键。
指令 | 含义 |
---|---|
a | 设置可引导标记 |
b | 编辑bsd磁盘标签 |
c | 设置DOS操作系统兼容标记 |
d | 删除一个分区 |
l | 设置已知的文件系统类型,82位Linux swap分区,83位Linux分区,5为扩展分区 |
m | 显示帮助菜单 |
n | 新建分区 |
o | 建立空白的DOS分区表 |
p | 显示分区列表 |
q | 不保存推出 |
s | 新建空白sun磁盘标签 |
t | 改变一个分区的系统ID,即文件系统类型:82、83等 |
u | 改变显示记录单位 |
v | 验证分区表 |
w | 保存推出 |
x | 附加功能 |
3、分区结束后,还需要使用partprobe
、mkfs
、mkdir
、mount
等命令使分的驱动器能够正常使用,见下文。
分区结束后执行该命令可以避免分区表被占用时重启的麻烦。
partprobe
将新建立的驱动器按照需要的文件系统格式化,不能格式化扩展分区,扩展分区也不能写入。
mkfs -t ext4 /dev/sdb1
1、编辑/etc/fstab文件,文件字段意义:
列序 | 意义 |
---|---|
第一字段 | 分区设备文件名或UUID(硬盘通用唯一识别码),可用dumpe2fs /dev/··· 或sudo blkid 查看 |
第二字段 | 挂载点(eg:根分区:"/",swap:“none”) |
第三字段 | 文件系统名称(eg:ext4、swap) |
第四字段 | 挂载参数 |
第五字段 | 分区是否被dump备份(eg:1代表每天;2代表不定期;0代表不备份,一般为0) |
第六字段 | 分区是否被fsck检测(eg:1优先级比2高,一般"/"为1,其他为2;0代表不检测,swap就为不检测) |
2、配置好fstab文件后,使用mount -a
命令检查是否报错,否则重启可能会导致系统崩溃。
若重启时,因fstab文件产生的错误,可用mount -o remount,rw /
命令重新挂载以下根目录,使其拥有读写权限,再进行fstab文件修复。
以下内容不适用Ubuntu,仅作了解。
1、RPM包默认安装的服务 (Linux时用RPM包安装的,所以用RPM包安装出来的服务和系统默认一样):
独立的服务(大多数、在内存里,响应速度快,耗费资源);
基于xinetd的服务(独立服务,在内存里,管理一些不在内存中的服务);
2、源码包安装的服务:
源码包安装的服务(相当于外来的、第三方的服务)
以下内容不适用Ubuntu,仅作了解。
chkconfig --list
Linux进入2、3、4、5这四个运行级别的某一个,代表该服务会开机启动,但并不代表该服务正在运行。
ps aux
netstat -tlu
可查看到端口的进程。
以下内容不适用Ubuntu,仅作了解。
在/usr/local
下,查看服务安装的位置,RPM包约定俗成的系统软件配置文件目录/etc
,启动脚本/etc/rc.d/init.d/
。
service命令就是搜索init.d目录的启动脚本,把源码包服务启动脚本移动至init.d中就可以使用RPM包服务的管理方法(不推荐这样使用)。
/etc/init.d/
:启动脚本位置,所有RPM包安装独立服务的启动脚本;
/etc/sysconfig/
:初始化环境配置文件位置(Ubuntu无);
/etc/
:配置文件位置;
/etc/xinetd.conf
:xinetd配置文件(逐渐被淘汰)
/etc/xinetd.d/
:基于xinetd服务的启动脚本(逐渐被淘汰)
/var/lib/
:服务产生的数据放在这里
/var/log/
:日志
/etc/init.d/[独立服务名] [start|stop|status|restart]
service [独立服务名] [start|stop|status|restart]
列出所有服务的状态:
service --status-all
列出单独服务的状态:
service [服务名] status
方式一,修改服务自启动级别(Ubuntu不支持):
chkconfig [独立服务名] [on|off]
设置httpd服务的自启动,运行级别在2345,例如:
chkconfig --level 2345 httpd on
不写--level 2345
也可,默认为2345运行级别。
方式二,修改/etc/rc.d/rc.local
文件,Ubuntu下为/etc/rc.local
文件:
在这个文件中写的任何命令,都会在系统启动之后,输入用户名、密码之前执行。
巧妙的记录上次系统启动时间,在rc.local文件中写入:
touch /var/lock/subsys/local
方式三,使用ntsysv
命令管理自启动
独立、xinetd都可以管理,不能管理源码包服务。
方式四,使用systemctl
命令(Ubuntu支持):
sudo systemctl enable [服务名]
xinetd逐渐被淘汰,Linux不再默认安装xinetd服务,需要手工安装。
使用绝对路径启动脚本,或将启动脚本软链接放入/etc/init.d/
目录中,用service命令管理。
例如,在rc.local中写入:
/usr/local/apache2/bin/apachectl start
ps aux
查看系统中所有进程,a表示前台,u表示用户,x表示后台。
ps -le
l表示详情,e表示所有。
内容:
字段 | 含义 |
---|---|
USER | 产生该进程的用户 |
PID | 进程ID号 |
%CPU | 该进程占cpu百分比 |
%MEN | 该进程占用内存百分比 |
VSZ | 该进程占用虚拟内存的大小(KB) |
RSS | 该进程占用物理内存的大小(KB) |
TTY | 该进程在哪个终端运行,tty1-tty7表示本地控制台终端,pts/0-pts/256代表虚拟终端 |
netstat -tlu
可查看到端口的进程。
top
使用-d选项指定刷新秒数。在交互指令中执行命令,获得相应反馈:
命令 | 含义 |
---|---|
?/h | 帮助 |
P | 以CPU使用率来排序 |
M | 以内存使用率排序 |
N | 以PID排序 |
q | 退出 |
内容:
字段 | 含义 |
---|---|
load average | 显示负载,单核最大值为1,四核最大值为4 |
100 id | 空闲CPU百分比 |
Men | 物理内存:总量、用量、剩余、缓冲 |
pstree [选项]
-p : 显示进程PID
-u : 显示进程所属用户
kill [选项]
- -l : 查看可用的进程号
kill [信号] [进程号]
-1 : 重启进程
-9 : 强制杀死进程
-15 : 正常结束进程(默认),杀死进程后,重启它的父进程,该进程也会启动
杀死一类进程
killall [选项] [信号] [进程名]
-i : 交互式,询问是否要杀死某个进程
-I : 忽略进程名的大小写
例如,强制杀死httpd进程树:
kill -9 httpd
例如,按照终端号踢除用户,强制杀死从pts/1终端登录的进程(可先用w
命令查看当前登录用户):
pkill -kill -t pts/1
把进程放入后台执行:
命令 + &
ctrl + z
查看后台工作:
jobs -l
指定恢复工作到前台:
fg [工作号]
指定恢复到后台:
bg [工作号]
说明:以上命令打印出的内容,"+“为最后一个放入的工作,”-“为倒数第二个放入的工作,恢复时若不指定工作号,默认恢复”+"的工作,与用户有交互的工作不能恢复,如top命令。
查看系统资源
vmstat [刷新延时] [刷新次数]
例如:
vmstat 1 3
dmesg
例如查看最后新输入设备:
dmesg | tail
例如查看CPU检测信息:
dmesg | grep CPU
查看内存使用的:总大小、用量、剩余、共享、缓冲(buffer)、缓存(cached),以MB为单位:
free -m
缓存用于加速硬盘读取,缓冲用于加速硬盘写入;
/proc位于内存中,断电后内容消失。
cat /proc/cpuinfo
类似命令top
和w
的部分内容。
umane [选项]
-a : 显示全部内核信息
-r : 显示系统内核版本
-s : 显示内核类型
file /bin/ls
打印内容参考:
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x83531f308f1fa18221be53eaf399303400c14638, stripped
lsb_release -a
lsof [选项]
-c [字符串] : 列出此字符串开头的进程打开的文件
-u [用户名] : 列出某个用户的进程打开的文件
-p [pid] : 以进程号查看打开的文件
crontab [选项]
-l : 查看crontab任务
-e : 编辑crontab定时任务
-r : 删除当前用户所有crontab任务
关于使用-e
选项的编辑内容的标准格式:* * * * * command
字段 | 内容 |
---|---|
第一 | 分钟(0~59) |
第二 | 小时(0~23) |
第三 | 一月中的第几天(0~31) |
第四 | 一年中的第几月(1-12) |
第五 | 一周中的星期几(0-7,0和7都代表星期天) |
第六 | 命令或任务 |
例如:
45 22 * * * 命令 #在每天22点45分执行命令
0 17 * * 1 命令 #每周一的17点执行命令
0 5 1,15 * * 命令 #每月1日和5日,5点执行命令
40 4 * * 1-5 命令 #每周1-5的4点40分执行命令
*/10 4 * * * 命令 #每天4点每十分钟执行一次命令
0 0 1,15 * 1 命令 #每月1日、15日和每周一的0点执行命令
*/5 * * * * /bin/echo "test" >> /temp/test.txt #每五分钟写入一次文档
5 5 * * 2 /sbin/shutdown -r now #每周二的5点5分重启
0 5 1,10,15 * * /root/sh/autoback.sh #每月1,10,15日的5点执行脚本
lastb
: 查看错误登录日志
lastlog
: 所有用户最后一次登录时间
last
: 查看所有用户登录、注销、启动、重启、关机时间
w
、who
、users
: 查看当前已登录的用户信息
在/etc/logrotate.d/目录下存放相关软件的日志轮替管理文件,例如轮替文件:
/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 进程将立即再次读取其配置并继续运行 |
自己写一个日志轮替文件(一般用于源码包安装的软件),为其指定一个目录后,再执行指令使其生效:
logrotate /etc/logrotate.d/[log-file]
启动logrotate:
logrotate /etc/logrotate.conf
显示日志轮替过程:
logrotate -v /etc/logrotate.conf
logrotate -v /etc/logrotate.d/[log-file]
强制执行日志轮替:
logrotate -f /etc/logrotate.d/[log-file]
可以使用runlevel
目录来查看当前的默认运行级别。
使用init [n]
来改变为第n个运行级别。
运行级别 | 作用 |
---|---|
0 | 关机 |
1 | 单用户模式,可以想象Windows的安全模式,主要用于系统修复 |
2 | 不完全的命令行模式,不含NFS(文件共享)服务 |
3 | 完全的命令行模式,标准的字符界面 |
4 | 未分配,系统保留 |
5 | 图形界面 |
6 | 重启 |
在/etc目录下有rc0.drc6.d目录,代表运行级别(06),这些目录里的文件如S75sudo
、S70dns-clean
等,S打头的为启动顺序,K打头的为关闭顺序,不能与S、K后的数字冲突,可以给稍大点的数字;
Ubuntu关闭图形界面 ,使用字符界面的方式:
将/etc/default/grub
文件中的:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
修改为GRUB_CMDLINE_LINUX_DEFAULT="text"
然后执行命令:
update-grub
/etc/default/grub
文件:
名称 | 含义 |
---|---|
GRUB_DEFAULT | 设定默认启动项,一般用于多系统使用 |
GRUB_HIDDEN_TIMEOUT | 引导菜单隐藏时间 |
GRUB_HIDDEN_TIMEOUT_QUIET | true 不显示倒计时。false 在GRUB_HIDDEN_TIMEOUT 中配置的时间,空白屏幕上会有一个倒数计时器。 |
GRUB_TIMEOUT | 设定启动项显示时间,-1表示取消倒计时 |
GRUB_DISTRIBUTOR | 获得发行版本的名称 |
GRUB_CMDLINE_LINUX_DEFAULT | quiet 的意思是内核启动时候简化提示信息,splash 是以图形界面启动 |
GRUB_CMDLINE_LINUX | 为空将会导入到每个启动项(包括recovery mode 启动项)的’linux’命令行 |
1、先生成一个的 sha 值:
grub-mkpasswd-pbkdf2
ubuntu@ubuntu-Vostro-1400:~$ grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
Your PBKDF2 is grub.pbkdf2.sha512.10000.349720D3C453C6CCD93E36BD8A132AABCA266A74B41D6DD43A9796744200B7DC5FA90E44922525B1CxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD7F74D4.FC93B4845B3ECD71B14015628A0E30AE9EED340A721C70C120E8352219F5E72ADB442BDB1BD7552B11B274D07033E219B71495FF95D35xxxxxxxxxxxxxxxxxxx
系统若无法使用grub-mkpasswd-pbkdf2
命令需要先安装:
sudo apt-get install grub
2、然后在/etc/grub.d/00_header
文件的末尾添加:
### Add those line to set GRUB2 password
cat << EOF
set superusers="username" #定义一个grub的用户名,在重启时按e编辑grub时会使用
password_pbkdf2 leekwen grub.pbkdf2.sha512.10000.BC4D0A450E86EE447561FC822C832xxxxxxxxxxxxx45572D3B4E40500CE
EOF
### Add end
3、更新grub使配置生效:
update-grub
修改/etc/default/grub
文件,将:
GRUB_CMDLINE_LINUX=""
修改为:
GRUB_CMDLINE_LINUX="vga=791"
可设置为1024*768分辨率,其他分辨率调整vga
值如下:
色深\分辨率 | 640×480 | 800×600 | 1024×768 | 1280×1024 |
---|---|---|---|---|
8位 | 769 | 771 | 773 | 775 |
15位 | 784 | 787 | 790 | 793 |
16位 | 785 | 788 | 791 | 794 |
32位 | 786 | 789 | 792 | 795 |
用户密码(可用单用户模式破解) -> grub加密(光盘启动破解) -> BIOS加密(拔除主板电池)
(未完成)
备份包含完整备份、增量备份(dump
、restore
)、差异备份。
备份部分:
dump [选项] [备份之后的文件名] [原文件或目录]
-[数字0-9] : 0-9十个备份级别,0完全备份,1第一次增量备份,2、3以此类推
-f [文件名] : 指定备份后的文件名
-u : 完成备份后,把备份时间记录在
/etc/dumpdates
文件中-v : 显示备份过程
-j : 备份的同时,把备份文件直接压缩成
.bz2
-W : 查看被
dump
的分区备份等级及备份时间
注意,Ubuntu没有dump
、restore
指令,请在apt
安装dump
后再执行。例如:
1、完全备份并压缩和更新备份的时间
dump -Ouj -f /root/boot.bak.bz2 /boot/
2、增量备份并压缩
dump -1uj -f /root/boot.bak1.bz2 /boot/
恢复部分:
restore [模式选项] [选项]
模式选项,只能选1个,不能混用:
-C : 比较备份数据和实际数据的变化
-i : 进入交互模式,手工选择需要恢复的文件
-t : 查看模式,用于查看备份文件中拥有哪些数据
-r : 还原模式,用于数据还原
选项:
- -f : 指定备份文件的文件名
1、实际数据与备份文件对比,例子:
restore -C -f /root/boot.bak.bz2
再备份文件中有对应参数,不需要指定对比对象。
2、还原备份,例子:
mkdir boot_test #先创建备份目录
cd boot_test
restore -r -f /root/boot.bak.bz2
rostore -r -f /root/boot.bak1.bz2 #还原增量部分
/etc/passwd
用户信息文件:
字段顺序 | 字段意义 | 说明 |
---|---|---|
1 | 用户名 | - |
2 | 密码标志 | x 表示有密码,可在shadow 文件中看到 |
3 | 用户ID | 0表示超级管理员,1-499为系统用户,500-65535位普通用户。将用户ID改为0,该用户就会变为超级用户 |
4 | 用户初始组ID | 可变,但只有一个 |
5 | 用户说明 | - |
6 | 家目录位置 | - |
7 | 登录之后使用的shell | 更改为nologin 后表示禁用 |
/etc/shadow
影子文件:
字段顺序 | 字段意义 | 说明 |
---|---|---|
1 | 用户名 | - |
2 | 加密密码 | * 和! 表示无密码,禁止登陆 |
3 | 密码最后一次修改日期 | 从1970/1/1计算天数 |
4 | 两次密码修改间隔 | - |
5 | 密码有效期 | - |
6 | 密码到期前预警天数 | - |
7 | 密码过期后宽限天数 | - |
8 | 账号失效时间 | - |
9 | 保留 | - |
把时间戳换算为日期:
date -d "1970-01-01 16066 days"
把日期换算为时间戳,注意%
和+
间不能有空格:
echo $(($(date --date="2014/01/06" +%s) / 86400+1))
/etc/group
组信息文件文件:
字段顺序 | 字段意义 | 说明 |
---|---|---|
1 | 组名 | - |
2 | 组密码标志 | - |
3 | 组ID | GID |
4 | 组中附加用户 | 不能看到初始用户 |
/etc/gshadow
组密码文件:
字段顺序 | 字段意义 |
---|---|
1 | 组名 |
2 | 组密码 |
3 | 组管理员用户名 |
4 | 组中附加用户 |
用户邮箱位置:/var/spool/mail/[用户名]/
,收到邮件时就会建立该用户的文件夹。
用户模板目录:/etc/skel/
,例如每新建一个用户,/home/用户/下就会有.bashrc
等文件,都是由此而来。
useradd [选项] [用户名]
-u : 手工指定用户的UID号
-d : 手工指定用户的home目录
-c : 手工指定用户的说明
-g : 手工指定用户的初始组
-G : 手工指定用户的附加组
-s : 手工指定用户的登录shell,默认是
/bin/bash
例如:
useradd -u 550 -G root,bin -d /home/lamp1 -c "test user" -s /bin/bash testusername
/etc/default/useradd
,用户默认值文件:
变量名 | 意义 | 例如 |
---|---|---|
GROUP | 用户默认组 | GROUP=100 |
HOME | 用户家目录 | HOME=/home |
INACTIVE | 密码过期宽限天数 | INACTIVE=-1 |
EXPIRE | 密码失效时间 | EXPIRE= |
SHELL | 默认shell | SHELL=/bin/sh |
SKEL | 模板目录 | SKEL=/etc/skel |
CREATE_MAIL_SPOOL | 是否建立邮箱 | CREATE_MAIL_SPOOL=yes |
/etc/login.defs
,常用变量:
变量名 | 意义 | 例如 |
---|---|---|
PASS_MAX_DAYS | 密码有效期 | PASS_MAX_DAYS 99999 |
PASS_MIN_DAYS | 密码修改间隔 | PASS_MIN_DAYS 0 |
PASS_WARN_AGE | 密码到期警告 | PASS_WARN_AGE 7 |
UID_MIN | UID范围,最小值 | UID_MIN 1000 |
UID_MAX | UID范围,最大值 | UID_MAX 60000 |
ENCRYPT_METHOD | 加密模式 | ENCRYPT_METHOD SHA512 |
passwd [选项] [用户名]
-S : 查询用户密码的密码状态,仅root可用
-l : 暂时锁定用户,仅root可用
-u : 解锁用户,仅root可用
–stdin : 可通过管道符输出的数据作为用户的密码,一般用于shell编程
[用户名] : 可为用户设置密码
通过管道符输出的数据作为用户的密码,例如:
echo "123" | passwd --stdin username
usermod [选项] [用户名]
-u : 修改UID
-c : 修改说明信息
-G : 修改附加组
-L : 临时锁定用户
-U : 解锁用户锁定
chage [选项] [用户名]
-l : 列出用户的详细密码状态
-d : 日期,修改密码最后一次更改日期(相当于shadow文件中的第3字段)
-m : 天数,两次修改密码间隔(相当于shadow文件中的第4字段)
-M : 天数,密码有效期(相当于shadow文件中的第5字段)
-W : 天数,密码过期警告天数(相当于shadow文件中的第6字段)
-I : 天数,密码过期后宽限天数(相当于shadow文件中的第7字段)
-E : 日期,账号失效时间(相当于shadow文件中的第8字段)
把密码修改日期归0,即一登录就要修改密码,例如:
chage -d 0 username
删除用户,-r
为同时删除家目录,例如:
userdel -r username
查看用户的ID,例如:
id username
su [选项] [用户名]
- : 表示用户环境变量一起切换,可用
env
命令查看环境变量-c : 仅执行一次命令,而不切换用户
例如:
su - root -c "useradd username"
添加用户组
groupadd [选项] [组名]
- -g [GID] : 指定组ID
修改用户组
groupmod [选项] [组名]
-g [GID] : 修改组ID
-n [新组名] : 修改组名,但不建议修改,建议删除重新建立
将group1组名改为group2例如:
groupmod -n group2 group1
删除用户组
groupdel [组名]
含有初始用户的用户组不建议删除。
把用户添加进组,或从组中删除
gpasswd [选项] [组名]
-a [用户名] : 把用户加入组
-d [用户名] : 把用户从组中删除
用于添加除文件所有者、所属组、其他人之外的用户或组的权限。
1、查看sda1分区是否支持ACL权限,例如:
sudo dumpe2fs -h /dev/sda1
若显示如下信息则表示已开启ACL权限:
Default mount options: user_xattr acl
2、重新挂载根分区,临时开启分区ACL权限,例如:
mount -o remount,acl /
3、让分区永久有ACL管理权限,修改/etc/fstab
文件,修改文件中的
字段项,其已有的选项后面追加acl
,例如:
defaults,acl
查看ACL权限,例如:
getfacl filename
设定ACL权限命令
setfacl [选项] [文件名]
-m : 设定ACL权限
-x : 删除指定ACL权限
-b : 删除所有ACL权限
-d : 设定默认ACL权限
-k : 删除默认ACL权限
-R : 递归设定ACL权限
例如:
1、修改project文件夹的所有者为root,所属组为tgroup:
chown root:tgroup /project/
2、让用户username对目录project有读执行权限:
setfacl -m u:username:rx /project/
3、让组tgroup对project对目录project有rwx权限:
setfacl -m g:tgroup:rwx /project/
mask
为最大有效权限,分配权限与mask
权限相与才能分配准确的权限用户和组。
给mask
分配读、执行权限:
setfacl -m m:rx /project/
为用户和组删除ACL权限:
setfacl -x u:username /project/
setfacl -x g:groupname /project/
删除该文件的所有ACL权限:
setfacl -b /project/
递归表示父目录和其中的子目录都遵守相同的设置。
这条命令执行后,新建的目录不会被递归到,例如:
setfacl -m u:username:rx -R [只能为目录名]
默认ACL权限设定,新建目录时,也会遵守权限规定,但之前的老文件还是原来的权限设定,例如:
setfacl -m d:u:username:rx [只能为目录名]
以上两条指令需配合使用。
SUID的限制和功能:
1、只有可执行文件才能设定SUID;
2、命令执行者要对该程序拥有执行权限;
3、命令执行者在执行该程序时获得该程序文件所有者身份;
4、SetUID只在程序执行过程中有效;
例如:
1、先查看passwd
指令的详情:
ll /usr/bin/passwd
获得:
-rwsr-xr-x 1 root root 41284 9月 13 2012 /usr/bin/passwd*
其中所有者的s
代表SUID权限,所属组的x
代表SGID权限,其他人的x
代表SBIT权限。
2、设定SetUID权限,4代表SUID,2代表SGID,1代表SBIT,7代表以上三者(无意义):
chmod 4755 [文件名]
或:
chmod u+s [文件名]
对某些不在该文件所属组的用户对文件进行操作使用,限制和功能:
1、只有可执行文件和目录才能设置SGID;
2、执行者要对该程序有可执行权限;
3、命令执行过程中,用户组身份会变为该文件的所属组;
4、只在程序执行过程中有效;
例如:
ll /usr/bin/locate
注意:有些版本Ubuntu该命令并未存在SGID权限。
对目录的作用:
1、普通用户对此目录拥有读和执行权限,才能进入目录;
2、普通用户在此目录中的有效组就会变为此目录所属组;
3、普通用户对此目录有写权限时,新建文件默认组为目录的所属组;
设定SGID,例如:
chmod 2777 [文件名/目录]
或:
chmod g+s [文件名/目录]
黏着位权限,限制和功能:
1、只对目录分配;
2、普通用户对该目录有写和执行权限;
3、有黏着位权限时,普通用户只能删除自己的文件,不能删除其他用户的文件;
设定SBIT,例如:
chmod 1777 [目录]
或:
chmod o+t [目录]
可以用来限制root权限对文件的操作。
chattr [±=] [选项] [文件或目录名]
**[±=]**选项:
+ :
- :
= :
[选项]部分,和[±=]选项之间不能有空格,且无小短线:
i : 设置i属性后,不允许对文件删除、改名、修改。对目录设置i属性,只能修改目录下文件数据,不能新建和删除文件
a : 只能在文件中添加数据,不能删除和修改数据,目录中只能建立和修改文件,不能删除文件(不能对文件使用vi编辑器,只能用
echo ... >>> [文件]
的方式)
查看chattr
命令设置的文件属性
lsattr [选项] [文件名]
-a : 显示所有文件和目录
-d : 若目标是目录,仅列出目录本身的属性,不是子文件的
例如:
ubuntu@ubuntu-Vostro-1400:~$ sudo chattr +i filename
ubuntu@ubuntu-Vostro-1400:~$ lsattr -a filename
----i--------e- filename
ubuntu@ubuntu-Vostro-1400:~$ sudo chattr -i filename
ubuntu@ubuntu-Vostro-1400:~$ lsattr -a filename
-------------e- filename
e
表示ext4文件系统格式。
操作对象是系统命令,其配置文件于/etc/sudoers
,可使用visudo
命令直接查看。
内容:
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
字段说明,例如:
root ALL=(ALL:ALL) ALL
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段 | 意义 |
---|---|
root | 能使用sudo 命令的用户,若第一个字符为% 则说明是组名 |
第一个ALL | 允许使用sudo 的主机,ALL表示该用户从任何机器登录,都可以应用接下来的规则 |
第二个ALL | 使用sudo 后,可以以任何用户的身份运行一些命令,即以什么身份来执行命令 |
第三个ALL | 可以以任何用户组的身份运行一些命令,即sudo 命令允许执行的命令 |
第四个ALL | 授权命令,ALL表示这个用户可以从任何机器登录,以任何用户和用户组的身份运行任何命令 |
将第一个ALL改成本地局域网,或某些特定的网段,这样的话,用户在其他机器上登陆以后,就无法使用sudo
命令了;
第二个和第三个ALL是可选的,如果省略,则默认为root用户,即变为ALL= ALL表示可以从任何host登录,然后以root身份运行任何命令;
第四个ALL若改成某条指令,则说明该用户可以执行该条命令;
授权用户可以重启服务器,例如:
username ALL= /sbin/shutdown –r now
请看一个关于sudoers的深入介绍。
shell是解释执行的脚本语言。shell分类如下:
名称 | 描述 | 家族 |
---|---|---|
Bourne Shell | 从1979年其Unix开始使用,Bourne Shell主文件名为sh |
sh、ksh、bash、psh、zsh |
C Shell | 主要用在BSD版本的Unix系统,语法和C语言类似 | csh、tcsh |
查看/etc/shells
文件可以看到当前Linux支持的Shell,命令输入shell名可以切换到该shell。
一个简单的脚本,例如:
#!/bin/bash
echo -e 'hello,world'
shell语言以#
为注释符,但第一句不为注释,它表示以bash shell
运行的脚本文件的标识符。
脚本需要通过bash
指令调用,但赋予一个脚本执行权限后可以直接运行:
chmod 775 hello.sh
./hello.sh
注意:在Linux中回车符识别为$
,Windows中回车符为^M$
,可用cat -A [filename]
查看到回车符。所以在Windows中写的脚本不能直接在Linux中使用。可使用dos2unix
命令转换,同理也存在unix2dos命令将Linux下的文本转换为Windows下正常回车符的文本。
echo [选项] [输入内容]
- -e : 支持反斜线控制的字符转换,转义字符
\
和C语言使用方法一致
例如,使用缩进符合换行符:
echo -e "a\tb\tc\nd\te\tf"
例如,打印颜色:
echo -e "\e[字背景颜色;字颜色m打印内容\e[0m"
关于颜色编号:黑:30、红:31、绿:32、黄:33、蓝:34、洋红:35、青:36、白:37。
\e[
为开启颜色输出,\e[0m
为关闭颜色输出。
history [选项] [历史命令保存文件]
-c : 清空历史命令
-w : 把缓存中的历史命令写入
~/.bash_history
默认会保存1000条历史命令,在/etc/profile
中修改配置。
历史命令的调用:
1、使用上下键调用以前的历史命令;
2、使用!n
重复执行第n条历史命令;
3、使用!!
重复执行上一条命令;
4、使用!字符串
执行最后一条以该字符串开头的命令;
设定命令别名:
alias [别名]='原命令'
查询命令别名:
alias
删除别名:
unalias [别名]
命令执行时顺序:
1、用绝对路径或相对路径执行的命令;
2、执行别名;
3、执行Bash的内部命令;
4、执行按照$PATH
环境变量定义的目录查找顺序找到的第一个命令;
命令行中设置的别名重启后会失效,在.bashrc
中定义的别名会永久生效,例如:
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
1、标准输入输出:
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2、输出重定向:
[命令] [重定向符] [文件名]
其中,重定向符>
,表示:把输出结果写入文件中;
其中,重定向符>>
,表示:把输出结果追加到文件中;
其中,重定向符2>
,表示:把报错结果写入文件中;
其中,重定向符2>>
,表示:把报错结果追加到文件中;
其中,重定向符&>
,表示:把错误与正确的输出全写入文件中;
其中,重定向符&>>
,表示:把错误与正确的输出全追加入文件中;
例如,把输出结果抛弃:
ls &> /dev/null
一种特殊用法,把正确结果追加到文件A中,把错误文件追加到文件B中:
命令 >> 文件A 2>>文件B
3、输入重定向:
一般很少用,主要为源码包打补丁使用。
例如,把文件作为wc
命令输入:
wc < [文件名]
把对应两个"字符"之间的输入作为wc
命令输入:
wc << [字符]
[正文]
[字符]
wc [选项] [文件名]
-c : 统计字节数
-w : 统计单词数
-l : 统计行数
1、多命令执行
[命令1] ; [命令2]
多个命令顺序执行,命令1执行完成执行命令2。
[命令1] && [命令2]
当命令1正确执行后,才执行命令2。
[命令1] || [命令2]
当命令1执行失败后,才执行命令2。
例如:
date ; sleep 10 ; date
2、管道符
[命令1] | [命令2]
将命令1的正确输出作为命令2的操作对象。
例如,分屏显示输出结果:
ls | more
1、通配符
通配符 | 意义 |
---|---|
? |
匹配一个任意字符 |
* |
匹配0个或任意多个字符,也就是可以匹配任何内容 |
[] |
匹配括号中任意一个字符,如:[abc],匹配a、b或c |
[-] |
匹配范围内任一个字符,如:[a-c] |
[^] |
逻辑非,匹配不是括号内的一个字符,如:[^0-9],表示匹配的不是数字 |
2、Bash中其他特殊符号
符号 | 意义 |
---|---|
' ' 和" " |
单引号内所有字符都没有特殊符号,双引号中$ 、` 、\ 是例外,分别代表"调用变量的值"、“引用命令”、“转义符” |
` ` |
反引号,括起来的是系统命令,用来在Bash中先执行,再把结果赋值给变量或显示 |
$() |
同反引号一样,如:echo &(ls) 等价于 echo `ls` |
# |
在shell脚本中代表注释 |
$ |
用来调用变量的值,如:name=sc ; echo $name |
\ |
转义符,使一些特殊符号失去作用,如 echo $ 会输出$符号 |
1、在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须修改指定变量类型为数值型;
2、变量的值若有空格,需要用单引号或双引号包括;
3、在变量中的值中,可以使用\
转义符;
4、变量值进行叠加需要用双引号包含"$变量名"
或"${变量名}"
包含;
5、把命令结果作为变量值,需要用反引号或$()
包含;
6、环境变量建议大写,便于区分;
例如,本地变量叠加:
a=123
a="$a"456
a=${a}789
变量分类:
类型 | 产生 |
---|---|
本地变量 | 用户自定义变量 |
环境变量 | 保存系统操作环境相关的数据,可以新建、修改,但不能更名 |
位置参数变量 | 用来向脚本中传递参数或数据,可以修改,不能新建和更名 |
预定义变量 | Bash已经定义好的变量,只能修改,不能新建和更名 |
命令查看所有变量:
set
删除变量:
unset [变量名]
用户自定义变量只会在当前shell中生效,环境变量会在所有shell中生效。
设置环境变量:
export [变量名]=[变量值] #声明变量
env #查询变量
unset [变量名] #删除变量
系统常见环境变量:
变量名 | 描述 |
---|---|
PATH | 系统查找命令的途径,以: 为分割符,例如:PATH="$PATH":/root/sh ,将一个脚本的路径附加到PATH环境变量中,该脚本就可以和执行命令一样执行 |
PS1 | 定义系统提示符的变量 |
在脚本中使用:
变量 | 描述 |
---|---|
$n |
n为数字,$0 代表命令本身,使用10个以上参数是使用${10} |
$* |
代表命令行中所有参数,但把所有参数看成一个整体,for 循环只传递一次 |
$@ |
代表命令行中所有参数,但把每个参数区分对待,可使用for 循环递归 |
$# |
代表命令行中参数的个数,不包括$0 |
变量 | 描述 |
---|---|
$? |
最后一次执行的命令所返回的状态,0表示正确,非0表示不正确 |
$$ |
当前进程的进程号 |
$! |
后台运行的最后一个进程的进程号 |
read [选项] [变量名]
-p : 在等待read输入时,输出提示信息
-t : read命令等待用户输入指定的等待时间(秒)
-n : 只接受指定的字符数,输入完会自动执行,不需要回车
-s : 隐藏输入的数据,使用于机密信息的输入
例如:
read -t 30 -p "please input your name:" name
read -s -t 30 -p "please enter your age:" age
read -n 1 -t 30 -p "please select your gender[M/F]:" gender
1、declare
声明变量类型
declare [±] [选项] [变量名]
**[+=]**选项:
+ : 给变量设定类型属性
- : 取消变量的类型属性
[选项]:
-i : 将变量声明为整数型
-x : 将变量声明为环境变量
-p : 显示指定变量的被声明的类型
例如,加法:
declare -i cc=11+22 && echo $cc
打印出33。
2、expr
或let
数值运算工具
例如,加法:
aa=11 ; bb=22
dd=$(expr $aa + $bb)
echo $dd
dd=`expr $aa + $bb`
echo $dd
注意:加号运算符两边都要有空格。
3、$((运算式))
或#[运算式]
,推荐使用该方式
例如,加法:
aa=11 ; bb=22
ff=$(($aa+$bb))
echo $ff
dd=$[$aa+$bb]
echo $ff
例如,逻辑与:
kk=$((1&&0))
运算符优先级和C语言类似。
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y有值 |
---|---|---|---|
x=${y-新值} |
x=新值 | x为空 | x=$y |
x=${y:-新值} |
x=新值 | x=新值 | x=$y |
x=${y+新值} |
x为空 | x=新值 | x=新值 |
x=${y:+新值} |
x为空 | x为空 | x=新值 |
x=${y=新值} |
x=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
x=${y?新值} |
新值输出到标准错误输出(就是屏幕) | x为空 | x=$y |
x=${y:?新值} |
新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
按照以上第一列的公式,可以获得相应的x值。
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc 或 /etc/bash.bashrc
~/.bashrc
~/.bash_profile
etc下的环境变量配置文件对所有登录用户都生效。
home下的配置文件只对当前用户有效。
可使用source
命令去调用环境变量文件重新加载环境变量。
~/.bash_logout
注销时生效的环境变量配置文件;
/.bash_history
历史命令;
/etc/issue
本地shell终端登录信息提示;
/etc/issue.net
远程登录shell终端登录信息提示,不可使用转义符;
/etc/motd
登录shell后提示信息,本地和远程登录时都显示;
正则表达式是包含匹配,通配符(*
、?
、[]
)是完全匹配,ls
、find
、cp
等命令不支持正则表达式。
正则符号 | 作用 |
---|---|
* |
前一个字符匹配0次或任意多次 |
. |
匹配处换行符外,任意一个字符 |
^ |
匹配行首,例如:^hello 会匹配以hello开头的行 |
$ |
匹配行尾,例如:hello$ 会匹配以hello结尾的行 |
[] |
匹配括号中的任意字符,同通配符用法 |
[^] |
逻辑非,匹配不是括号内的一个字符,如:[^0-9],表示匹配的不是数字 |
\ |
转义符,取消特殊符号用法 |
\{n\} |
匹配其前面的字符恰好出现n次,例如:[1][3-8][0-9]\{9\} 匹配电话号码 |
\{n,\} |
匹配其前面的字符出现不小于n次,例如:[0-9]\{2,\} 表示两位及以上数字 |
\{n,m\} |
匹配其前面的字符出现至少n次,最多m次 |
更多例子:
匹配至少含有一个a的行:
grep "aa*" file
匹配s和d之间有任意多个字符的行:
grep "s.*d" file
匹配空白行,并找出行号:
grep -n "^$" flie
文件中的空白行数:
grep -n "^$" flie | wc -l
匹配用小写字母开头的行:
grep "^[a-z]" file
匹配用点结尾的行:
grep "\.$" file
匹配连续三个数字的字符串:
grep "[0-9]\{3\}" file
推荐cut
和grep
配合使用有较好的效果。
cut [选项] [文件名]
-f [列号]: 提取文件的第几列,提取多个列用逗号隔开列号
-d [“分隔符”]: 按照指定分隔符将文件分割成列,默认分隔符为Tab
注意:对空格作为分隔符使用时不友好,例如df
命令的打印内容。对识别\t
、:
、,
、。
等使用较好。
例如,查找出所有普通用户:
cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1
printf [输出类型输出格式] [输出内容]
%ns : 输出字符串,n指定输出几个字符
%ni : 输出整数,n指定输出几个字符
%m.nf : 浮点输出,m位数中,n个小数
注意:输出内容不能写成文件名,不接受管道符输出。不识别空格,且行末无换行。
若要处理文件中的内容,例如:
printf '%s' `cat file.txt`
输出提示音,和C语言一致,例如:
printf '\a'
该命令可接受管道符的输出。
awk ‘条件1{动作1} 条件2{动作2}’ [文件名]
条件 : 一般使用关系表达式,如
x>10
,常用条件BEGIN
、END
动作 : 打印、流程控制语句,如
print $1 "\t" $3
1、关于print
命令:只能在awk
命令中使用,不同于printf
命令,它识别空格且行末有换行;
2、关于$
符号:代表一行,$1
代表一行中的第一列;
3、关于常用条件BEGIN
、END
:用于在打印需要的内容前,会执行该条件大括号中的内容;
4、关于FS
分隔符变量:它一般在BEGIN
中被定义,若不定义则分隔符默认为空格;
例如:
识别df
命令的空格为分隔符,打印第一列和第三列:
df -h | awk '{print $1 "\t" $3}'
打印sda1
分区使用率:
df -h | grep sda1 | awk '{print $5}' | cut -d '%' -f 1
在打印文件内容之前,先处理BEGIN
后的动作:
awk 'BEGIN{print "test"} {print $2 "\t" $3}' /etc/passwd
awk 'BEGIN{FS=":"} {print $2 "\t" $3}' /etc/passwd
打印出用户ID大于100的用户:
awk 'BEGIN{FS=":"} $3>100{print $1 "\t" $3}' /etc/passwd
sed
是一种轻量级流编辑器,可用于文件、命令结果的选取、替换、删除、新增。
sed [选项] [‘动作’] [文件或命令结果]
[选项]:
-n : 一般选项,只输出经过
sed
处理过的行-e : 允许对输入数据应用多条
sed
命令编辑-i : 直接修改读取的文件,不打印
[‘动作’]:
a\ : 追加一行或多行,追加多行时,每行用
\
加回车符
隔开,最后一行除外c\ : 替换一行或多行,替换多行时,每行用
\
加回车符
隔开,最后一行除外i\ : 前方插入一行或多行,多行时,每行用
\
加回车符
隔开,最后一行除外d : 删除指定行
p : 打印,输入指定的行
s : 字符串替换,格式为
行范围s/旧字符串/新字符串/g
,未写行范围则在整片文章中查找,多条替换用;
隔开
例子:
打印第二行和整个文件:
sed '2p' file.txt
只打印第二行:
sed -n '2p' file.txt
删除2-4行,源文件不变:
sed '2,4d' file.txt
第二行后追加一行hello:
sed '2a hello' file.txt
第二行前插入两行hello:
sed '2i hello\
hello' file.txt
第二行替换为test:
sed '2c test' file.txt
把第三行的74换成99:
sed '3s/74/99/g' file.txt
把liming和gao替换为空:
sed -e 's/liming//g;s/gao//g' file.txt
排序命令sort
:
sort [选项] [文件名]
-f : 忽略大小写
-n : 以数值型进行排序,默认使用字符串类型排序
-r : 反向排序
-t : 指定分隔符,默认为Tab
-k n[,m] : 按照指定的字段范围排序,从n字段开始,m结束
例如:
以头字母排序:
sort /etc/passwd
使用用户UID排序,若不使用-n
选项,则将会使10、11等排在2前面:
sort -n -t ":" -k 3,3 /etc/passwd
统计输入命令wc
参见前文。
1、判断文件类型,常用:
条件 | 结果 |
---|---|
-d 文件 | 为目录返回1 |
-e 文件 | 文件存在返回1 |
-f 文件 | 普通文件返回1 |
执行判断条件后,会使预定义变量$?
变化,推荐使用中括号形式,例如:
test -e file.txt
echo $?
[ -e file.txt ]
echo $?
2、判断文件权限
条件 | 结果 |
---|---|
-r 文件 | 文件存在读权限返回1 |
-w 文件 | 文件存在写权限返回1 |
-x 文件 | 文件存在执行权限返回1 |
-u 文件 | 文件存在SUID权限返回1 |
-g 文件 | 文件存在SGID权限返回1 |
-k 文件 | 文件存在SBIT权限返回1 |
3、文件修改时间的比较
条件 | 结果 |
---|---|
文件1 -nt 文件2 | 第一个文件比第二个文件修改时间新返回1 |
文件1 -ot 文件2 | 第一个文件比第二个文件修改时间旧返回1 |
文件1 -ef 文件2 | 两个文件的Inode 号一致返回1,使用stat 命令可查看文件Inode 号,用于硬链接 |
4、整数间比较
条件 | 结果 |
---|---|
整数1 -eq 整数2 | 两个整数相等返回1,例如:[ $a -eq $b ] |
整数1 -ne 整数2 | 两个整数不相等返回1 |
整数1 -gt 整数2 | 整数1大于整数2返回1 |
整数1 -ge 整数2 | 整数1大于等于整数2返回1 |
整数1 -lt 整数2 | 整数1小于整数2返回1 |
整数1 -le 整数2 | 整数1小于等于整数2返回1 |
5、字符串判断
条件 | 结果 |
---|---|
-z 字符串 | 字符串为空时返回1,例如:[ -z $hello ] ,若未定义该变量则返回0 |
-n 字符串 | 字符串非空时返回1 |
字串1 == 字串2 | 两字符串相等时返回1,不能用于整数 |
字串1 != 字串2 | 两字符串不相等时返回1 |
6、多重条件判断
条件 | 结果 |
---|---|
判断1 -a 判断2 | 逻辑与 |
判断1 -o 判断2 | 逻辑或 |
! 判断 | 逻辑非 |
1、单分支if
条件语句,两种写法,条件成立执行then
下的程序:
if [ 条件 ]; then
程序
fi
if [ 条件 ]
then
程序
fi
2、双分支if条件语句:
if [ 条件 ]
then
程序1
else
程序2
fi
3、多分支if条件语句:
if [ 条件1 ]
then
程序1
elif [ 条件2 ]
then
程序2
else #elif [ 条件3 ]
...
fi
类似于C语言的switch。
case $变量名 in
"1")
如果变量的值等于值1,则执行程序1
;;
"2")
如果变量的值等于值2,则执行程序2
;;
······
*)
如果变量的值都不是以上的值,则执行此程序,相当于default
;;
esac
例子:
#!/bin/bash
#判断用户输入
read -p "Please choose yes/no: " -t 30 cho
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
;;
esac
for
循环值中,有几个值就循环几次,每次把不同值赋给变量,靠空格判断,可以是字符串变量。
语法一:
for 变量 in 值1 值2 值3…
do
程序
done
语法二:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
语法一,例子:
#!/bin/bash
#打印时间
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
#!/bin/bash
#批量解压缩脚本
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log
语法二,例子:
#!/bin/bash
#从1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "The sum of 1+2+...+100 is : $s"
#!/bin/bash
#批量添加指定数量的用户
read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g') #把num中的数字全删掉,把剩余值赋给y,判断y为空就执行for,用于判断输入中是否有非数字
if [ -z "$y" ]
then
for (( i=1;i<=$num;i=i+1 ))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass | /usr/bin/passwd --stdin "$name$i" &>/dev/null #--stdin用于管道符输入作为用户密码
done
fi
fi
while
在条件表达式成立时执行,而until
表达式条件不成立时执行。
while [ 条件判断式 ]
do
程序
done
until [ 条件判断式 ]
do
程序
done
例子:
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ] #如果变量i的值小于等于100,则执行循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"
#!/bin/bash
#从1加到100
i=1
s=0
until [ $i -gt 100 ] #循环直到变量i的值大于100,就停止循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"
1、同步系统时间:
ntpdate asia.pool.ntp.org &>/dev/null
2、统计目录大小:
size=$(du -sh /etc/ | cut -d "M" -f 1)
3、打印时间的年月日:
date +%y%m%d
4、以变量作为文件名,注意$date
变量:
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql
5、扫描指令,扫描指定服务器上的TCP端口开启状态:
nmap -sT 192.168.1.129
6、输入指令,类似C++的cin
和scanf
函数:
read -p "Please input a filename:" file
7、终止if语句,返回错误结果,即可用$?
可查看到的结果:
exit 1