Ubuntu个人笔记,用于Ctrl+F查询

Linux目录结构

目录名称描述
/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/doclinux系统的说明文档
/usr/includelinux下开发和编译应用程序所需的头文件
/usr/lib存放常用的动态链接库和软件包的配置文件
/usr/man存放帮助文档
/usr/srclinux内核的源代码存放在这,编译内核必须用到
/usr/local/bin本地增加的命令,通常用于软件升级
/usr/local/lib本地增加的库

常用命令

压缩和解压 - tar

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、unzip

zip [解压后的文件名] [文件或目录]

  • -r : 压缩目录

unzip [要解压的文件]


切换用户 - su

su - [用户名]


生成硬链接 - in

相当于备份原文件,可实现同步更新

in [选项] [原文件] [目标文件]

  • -s : 生成软链接,相当于快捷方式

改变文件或目录所有者 - chown

chown [用户] [文件或目录]


改变文件或目录所属组 - chgrp

chgrp [用户组] [文件或目录]


文件查找 - find

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

locate [选项] [文件名]

  • -i : 不区分大小写

需配合使用 updatedb 命令更新文件资料库使用(不更新/tmp目录)


找到命令所在目录 - which

which [命令]


找到命令所在目录及帮助文档路径 - whereis

whereis [命令]


在文件中找到匹配的字符串行并输出 - grep

grep [选项] [字符串] [搜索范围]

  • -rn : 在目录中递归搜索并返回该行字符串与所对应行号

  • -i : 不区分大小写

  • -v : 排除指定字符串


查看帮助 - man、–help、help

man [命令或配置文件]
[命令] --help
help [内置命令]


当前的登录信息查看 - who、w

who
w


列出目前与过去登入系统的用户信息 - last

last


最后一次登录信息 - lastlog

lastlog


给同服务器的用户发送信息 - write

write [用户名]

使用ctrl+d保存结束


发送广播消息 - wall

wall [消息]


查看和临时设置网卡信息 - ifconfig

ifconfig [网卡名称] [IP地址]

临时修改ip地址(重启失效),例子:

ifconfig eth0 192.168.x.xxx

显示数据包到主机间的路径 - traceroute

traceroute [网址]


显示网络相关信息 - netstat

netstat [选项]

  • -t : 查看TCP连接

  • -u : 查看UDP连接

  • -l : 监听

  • -r : 路由

  • -n : 显示ip地址和端口号

查看本机监听的端口,例子:

netstat -tuln

查看本机的所有网络连接,例子:

netstat -an

查看本机路由表,例子:

netstat -rn

关机命令 - shutdown、halt、poweroff、init0

shutdown [选项] [时间]

  • -c : 取消前一个关机命令

  • -h : 关机

  • -r : 重启

20分钟30秒后关机,例子:

shutdown -h 20:30

立刻重启,例子:

shutdown -r now

其他关机指令:

halt
poweroff
init 0

重启指令:

reboot
init 6


安装包管理指令 - dpkg

dpkg [选项] [deb包]

  • -i : 安装

  • -P : 彻底卸载已安装的软件

  • –list : 查看已安装的包

  • -L package:查看软件包的安装位置


打开浏览器密码环,以解锁登录密码 - seahorse

seahorse


比较文本文件差异 - diff

diff [选项] [文件名] [文件名]

  • -l : 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异

编译器 - gcc

gcc [源文件.c] [选项] [目标文件.out] [-lm]

  • -o : 指定生成的输出文件

  • -E : 仅执行编译预处理

  • -S : 将C代码转换为汇编代码

  • -wall : 显示警告信息

  • -c : 仅执行编译操作,不进行连接操作

  • 最后加-lm : 可以解决一般未定义引用的问题


查看设备厂商号、设备号 - lsusb、dmesg

lsusb

dmesg


查看与本Linux交互过的所有IP - arp

arp

和grep搭配使用,例如:

arp | grep 60:A4:4C:CC:F3:79

使用ssh协议传输文件 - scp

scp [选项] [源文件地址] [目标地址]

  • -r : 可传输目录

例子:

scp username@xxx.xxx.xxx.xxx:/path/filename /localpath
scp -r /localpath/folder/ username@xxx.xxx.xxx.xxx:/path/

设置系统时间 - date

例如:

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  #清华大学

注意虚拟机不能使用该命令。


批量修改文件中的字符串 - sed

将当前目录(包括子目录)中所有文件中的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

打开一张图片并全屏,例如:

eog -f -g --display=:0 smile.jpg

tcpdump命令

用来截获网络数据包,针对网络层、协议、主机、网络端口过滤,提供andornot等逻辑语句来去掉无用信息。
常用命令

tcpdump [选项] [参数]

  • -i : 指定网络接口,如eth1

  • -D : 显示可用的接口列表

  • -n : 不要解析主机名

  • -nn : 不要解析主机名或者端口名

  • -q : 显示更少的输出,更加简洁

  • -t : 输出可读的时间戳

  • -tttt : 输出最大程度可读的时间戳

  • -A : 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息),在抓取包含网页数据的数据包时,可方便查看数据(nt: 即Handy for capturing web pages)

  • -X : 以hexASCII两种形式显示包的内容

  • -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 请求

vim编辑器

命令模式
  • a:光标所在字符后插入
  • A:行末插入
  • o:光标下插入新行
  • O:光标上插入新行
  • i:光标所在字符前插入
  • I:行首插入
  • $:到行尾
  • 0:到行首
  • 光标移动:↑h、↓l、←j、→k
  • ctrl+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#<ESC>为给光标处行首添加#(注意^p是ctrl+v+p组合键)
  • :set paste:用于解决粘贴代码到vim时,缩进错误的问题,用完后set nopaste取消

保存配置文件:在home目录下,设置.vimrc文件可永久保存设置的各种快捷键。


Git

初始化仓库 - git init

git init


添加修改的文件 - git add

git add [file]

添加全部变动:

git add .

注意:已经被纳入版本管理中的文件,则修改.gitignore文件是无效的情况,建议删除本地缓存在执行git add

git rm -r --cached .

提交一次变动 - git commit

git commit -m “Notes”

修改上次的commit内容:

git commit --amend

强制回滚远程分支到当前hard
git push -u origin [branch] -f

查看当前仓库状态 - git status

git status


查看变动文件与版本库的差异 - git diff

git diff [file]

查看与特定版本的差异:

git diff [md5] -- [file]

查看当前改动全部差异:

git diff

由近到远显示提交日志 - git log

git log

查看分支的合并情况:

git log --graph


把暂存区(即git add后的)内容回退到工作区、回退当前版本库到特定版本 - git reset

git reset
git reset --hard [md5]


查看历史命令 - git reflog

git reflog


切换分支或恢复工作树文件 - git checkout

放弃当前改动,回退到最近一次commit或add的状态:

git checkout – [file]

回退工作树全部变动:

git checkout – .

切换分支:

git checkout [branch_name]

创建分支并切换到分支:

git checkout -b [branch_name]


合并所指分支到当前分支 - git merge

git merge [target_branch]


给当前分支打标签 - git tag

git tag [name]


分支管理 - git branch

查看当前分支:

git branch

创建分支:

git branch [branch_name]

删除分支:

git branch -d [branch_name]


获取远程仓库某个分支

git fetch origin [remote_branch]


Linux分区

主分区:最多只能有4个
扩展分区:只能有1个,也是主分区的一种,不能存储、格式化
逻辑分区:存在于扩展分区,Linux最多支持59个逻辑分区(IDE硬盘59个,SCSI硬盘最多11个)


/dev目录下的分区文件名称及意义:
分区形式分区文件名意义
主分区1/dev/sda1sd表示:SCSI和SATA硬盘,IDE硬盘用hd**表示;
a表示:当前操作系统挂载的第一块磁盘,第二块就为b表示,以此类推;
1表示:该磁盘的第一个分区;
扩展分区/dev/sda2sda3、sda4会自动留给可能出现的其他主分区,不会被逻辑分区占用
逻辑分区1/dev/sda5第一个逻辑分区
逻辑分区2/dev/sda6第二个逻辑分区
逻辑分区3/dev/sda7第三个逻辑分区

文件系统

ext2:最大支持16TB分区,2TB文件;
ext3:同上,自带日志功能,可靠性提高;
ext4:最大支持1EB分区,16TB文件;


文件系统查看命令 - df

df [选项]

  • -a : 显示全部文件系统,包含隐藏和特殊文件系统

  • -h : 以友好的数据单位显示文件系统大小(例如-h显示GB,-m显示MB,-k显示KB)

  • -T : 显示文件系统类型


统计目录或文件大小 - du

du [选项] [目录或文件名]

  • -a : 显示每个子目录与文件占用量,默认只统计子目录占用

  • -s : 统计总占用量,其余不显示

du命令只看文件占用空间,df会看文件、命令、程序的占用空间。


文件系统修复命令 - fsck
  • -a : 不显示提示,自动修复文件系统

  • -y : 自动修复,功能和-a一致,有些发行版Linux不支持-a可用-y


显示磁盘状态命令 - dumpe2fs

dumpe2fs [分区设备文件名]

  • -h : 只看超级块内容

例如查看一个分区的uuid:

dumpe2fs /dev/sda1

sudo blkid

挂载命令 - mount

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

umount [/dev/设备文件名 或 设备挂载点]


硬盘分区命令 - fdisk

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、分区结束后,还需要使用partprobemkfsmkdirmount等命令使分的驱动器能够正常使用,见下文。


重新读取分区表信息 - partprobe

分区结束后执行该命令可以避免分区表被占用时重启的麻烦。

partprobe


格式化分区 - mkfs

将新建立的驱动器按照需要的文件系统格式化,不能格式化扩展分区,扩展分区也不能写入。

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文件修复。


服务管理

Linux服务

以下内容不适用Ubuntu,仅作了解。
1、RPM包默认安装的服务 (Linux时用RPM包安装的,所以用RPM包安装出来的服务和系统默认一样):
独立的服务(大多数、在内存里,响应速度快,耗费资源);
基于xinetd的服务(独立服务,在内存里,管理一些不在内存中的服务);

2、源码包安装的服务:
源码包安装的服务(相当于外来的、第三方的服务)


查询服务自启动状态,看到所有RPM包安装的服务 - chkconfig

以下内容不适用Ubuntu,仅作了解。

chkconfig --list

Linux进入2、3、4、5这四个运行级别的某一个,代表该服务会开机启动,但并不代表该服务正在运行。


查看系统当中所有的运行进程 - ps
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

独立服务的自启动 - chkconfig

方式一,修改服务自启动级别(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服务(超级守护进程)管理

xinetd逐渐被淘汰,Linux不再默认安装xinetd服务,需要手工安装。


源码包服务的管理

使用绝对路径启动脚本,或将启动脚本软链接放入/etc/init.d/目录中,用service命令管理。

例如,在rc.local中写入:

/usr/local/apache2/bin/apachectl start

进程管理

进程查看 - ps
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

top

使用-d选项指定刷新秒数。在交互指令中执行命令,获得相应反馈:

命令含义
?/h帮助
P以CPU使用率来排序
M以内存使用率排序
N以PID排序
q退出

内容:

字段含义
load average显示负载,单核最大值为1,四核最大值为4
100 id空闲CPU百分比
Men物理内存:总量、用量、剩余、缓冲

查看进程树 - pstree

pstree [选项]

  • -p : 显示进程PID

  • -u : 显示进程所属用户


终止进程 - kill,killall,pkill

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 [刷新延时] [刷新次数]

例如:

vmstat 1 3

查看开机时内核检查信息 - demsg

dmesg

例如查看最后新输入设备:

dmesg | tail

例如查看CPU检测信息:

dmesg | grep CPU 

查看内存使用状态 - free

查看内存使用的:总大小、用量、剩余、共享、缓冲(buffer)、缓存(cached),以MB为单位:

free -m

缓存用于加速硬盘读取,缓冲用于加速硬盘写入;


查看CPU信息

/proc位于内存中,断电后内容消失。

cat /proc/cpuinfo

显示启动时间和平均负载 - uptime

类似命令topw的部分内容。


查看系统内核信息 - uname

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

查看Linux系统的发行版本

lsb_release -a


列出某进程打开或使用文件的文件信息 - lsof

lsof [选项]

  • -c [字符串] : 列出此字符串开头的进程打开的文件

  • -u [用户名] : 列出某个用户的进程打开的文件

  • -p [pid] : 以进程号查看打开的文件


系统定时任务 - crontab

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 : 查看所有用户登录、注销、启动、重启、关机时间
wwhousers : 查看当前已登录的用户信息


日志轮替 - logrotate

在/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日志文件将按月轮循。其它可用值为dailyweekly或者yearly
rotate 5一次将存储5个归档日志,对于第六个归档,时间最久的归档将被删除
compress在轮循任务完成后,已轮循的归档将使用gzip进行压缩
delaycompress总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用
missingok在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误
notifempty如果日志文件为空,轮循不会进行
create 644 root root以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件
postrotate/endscript在所有其它指令完成后,postrotateendscript里面指定的命令将被执行,在这种情况下,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),这些目录里的文件如S75sudoS70dns-clean等,S打头的为启动顺序,K打头的为关闭顺序,不能与S、K后的数字冲突,可以给稍大点的数字;

Ubuntu关闭图形界面 ,使用字符界面的方式:
/etc/default/grub文件中的:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"修改为GRUB_CMDLINE_LINUX_DEFAULT="text"然后执行命令:

update-grub

grub配置文件

/etc/default/grub文件:

名称含义
GRUB_DEFAULT设定默认启动项,一般用于多系统使用
GRUB_HIDDEN_TIMEOUT引导菜单隐藏时间
GRUB_HIDDEN_TIMEOUT_QUIETtrue不显示倒计时。falseGRUB_HIDDEN_TIMEOUT中配置的时间,空白屏幕上会有一个倒数计时器。
GRUB_TIMEOUT设定启动项显示时间,-1表示取消倒计时
GRUB_DISTRIBUTOR获得发行版本的名称
GRUB_CMDLINE_LINUX_DEFAULTquiet的意思是内核启动时候简化提示信息,splash是以图形界面启动
GRUB_CMDLINE_LINUX为空将会导入到每个启动项(包括recovery mode启动项)的’linux’命令行

grub加密

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×480800×6001024×7681280×1024
8位769771773775
15位784787790793
16位785788791794
32位786789792795

系统修复模式

用户密码(可用单用户模式破解) -> grub加密(光盘启动破解) -> BIOS加密(拔除主板电池)

未完成


备份与恢复

备份包含完整备份、增量备份(dumprestore)、差异备份。
备份部分:

dump [选项] [备份之后的文件名] [原文件或目录]

  • -[数字0-9] : 0-9十个备份级别,0完全备份,1第一次增量备份,2、3以此类推

  • -f [文件名] : 指定备份后的文件名

  • -u : 完成备份后,把备份时间记录在/etc/dumpdates文件中

  • -v : 显示备份过程

  • -j : 备份的同时,把备份文件直接压缩成.bz2

  • -W : 查看被dump的分区备份等级及备份时间

注意,Ubuntu没有dumprestore指令,请在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用户ID0表示超级管理员,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组IDGID
4组中附加用户不能看到初始用户

/etc/gshadow组密码文件:

字段顺序字段意义
1组名
2组密码
3组管理员用户名
4组中附加用户

用户管理相关文件

用户邮箱位置:/var/spool/mail/[用户名]/,收到邮件时就会建立该用户的文件夹。
用户模板目录:/etc/skel/,例如每新建一个用户,/home/用户/下就会有.bashrc等文件,都是由此而来。


用户管理命令 - useradd

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默认shellSHELL=/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_MINUID范围,最小值UID_MIN 1000
UID_MAXUID范围,最大值UID_MAX 60000
ENCRYPT_METHOD加密模式ENCRYPT_METHOD SHA512

用户管理命令 - passwd

passwd [选项] [用户名]

  • -S : 查询用户密码的密码状态,仅root可用

  • -l : 暂时锁定用户,仅root可用

  • -u : 解锁用户,仅root可用

  • –stdin : 可通过管道符输出的数据作为用户的密码,一般用于shell编程

  • [用户名] : 可为用户设置密码

通过管道符输出的数据作为用户的密码,例如:

echo "123" | passwd --stdin username

修改用户信息 - usermod

usermod [选项] [用户名]

  • -u : 修改UID

  • -c : 修改说明信息

  • -G : 修改附加组

  • -L : 临时锁定用户

  • -U : 解锁用户锁定


修改用户密码状态 - chage

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

删除用户 - userdel

删除用户,-r为同时删除家目录,例如:

userdel -r username

查看用户的ID,例如:

id username

切换用户身份 - su

su [选项] [用户名]

  • - : 表示用户环境变量一起切换,可用env命令查看环境变量

  • -c : 仅执行一次命令,而不切换用户

例如:

su - root -c "useradd username"

用户组管理 - groupadd、groupmod、groupdel、gpasswd

添加用户组

groupadd [选项] [组名]

  • -g [GID] : 指定组ID

修改用户组

groupmod [选项] [组名]

  • -g [GID] : 修改组ID

  • -n [新组名] : 修改组名,但不建议修改,建议删除重新建立

将group1组名改为group2例如:

groupmod -n group2 group1

删除用户组

groupdel [组名]

含有初始用户的用户组不建议删除。

把用户添加进组,或从组中删除

gpasswd [选项] [组名]

  • -a [用户名] : 把用户加入组

  • -d [用户名] : 把用户从组中删除


权限管理

ACL权限管理

用于添加除文件所有者、所属组、其他人之外的用户或组的权限。
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文件,修改文件中的<options>字段项,其已有的选项后面追加acl,例如:

defaults,acl

查看和设定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/

最大有效权限与删除ACL权限

mask为最大有效权限,分配权限与mask权限相与才能分配准确的权限用户和组。
mask分配读、执行权限:

setfacl -m m:rx /project/

为用户和组删除ACL权限:

setfacl -x u:username /project/
setfacl -x g:groupname /project/

删除该文件的所有ACL权限:

setfacl -b /project/

默认ACL权限和递归ACL权限

递归表示父目录和其中的子目录都遵守相同的设置。
这条命令执行后,新建的目录不会被递归到,例如:

setfacl -m u:username:rx -R [只能为目录名]

默认ACL权限设定,新建目录时,也会遵守权限规定,但之前的老文件还是原来的权限设定,例如:

setfacl -m d:u:username:rx [只能为目录名]

以上两条指令需配合使用。


文件特殊权限SetUID

SUID的限制和功能:
1、只有可执行文件才能设定SUID;
2、命令执行者要对该程序拥有执行权限;
3、命令执行者在执行该程序时获得该程序文件所有者身份
4、SetUID只在程序执行过程中有效
例如:
1、先查看passwd指令的详情:

ll /usr/bin/passwd

获得:

-rwsr-xr-x 1 root root 41284  913  2012 /usr/bin/passwd*

其中所有者的s代表SUID权限,所属组的x代表SGID权限,其他人的x代表SBIT权限。
2、设定SetUID权限,4代表SUID,2代表SGID,1代表SBIT,7代表以上三者(无意义):

chmod 4755 [文件名]

或:

chmod u+s [文件名]

文件特殊权限SetGID

对某些不在该文件所属组的用户对文件进行操作使用,限制和功能:
1、只有可执行文件和目录才能设置SGID;
2、执行者要对该程序有可执行权限;
3、命令执行过程中,用户组身份会变为该文件的所属组;
4、只在程序执行过程中有效;
例如:

ll /usr/bin/locate

注意:有些版本Ubuntu该命令并未存在SGID权限。

对目录的作用:
1、普通用户对此目录拥有读和执行权限,才能进入目录;
2、普通用户在此目录中的有效组就会变为此目录所属组;
3、普通用户对此目录有写权限时,新建文件默认组为目录的所属组;
设定SGID,例如:

chmod 2777 [文件名/目录]

或:

chmod g+s [文件名/目录]

文件特殊权限 - StickyBIT

黏着位权限,限制和功能:
1、只对目录分配;
2、普通用户对该目录有写和执行权限;
3、有黏着位权限时,普通用户只能删除自己的文件,不能删除其他用户的文件;

设定SBIT,例如:

chmod 1777 [目录]

或:

chmod o+t [目录]

文件系统属性chattr权限

可以用来限制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文件系统格式。


sudo权限

操作对象是系统命令,其配置文件于/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是解释执行的脚本语言。shell分类如下:

名称描述家族
Bourne Shell从1979年其Unix开始使用,Bourne Shell主文件名为shsh、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

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

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/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

2、输出重定向:

[命令] [重定向符] [文件名]

其中,重定向符>,表示:把输出结果写入文件中;
其中,重定向符>>,表示:把输出结果追加到文件中;
其中,重定向符2>,表示:把报错结果写入文件中;
其中,重定向符2>>,表示:把报错结果追加到文件中;
其中,重定向符&>,表示:把错误与正确的输出全写入文件中;
其中,重定向符&>>,表示:把错误与正确的输出全追加入文件中;

例如,把输出结果抛弃:

ls &> /dev/null

一种特殊用法,把正确结果追加到文件A中,把错误文件追加到文件B中:

命令 >> 文件A 2>>文件B

3、输入重定向:
一般很少用,主要为源码包打补丁使用。
例如,把文件作为wc命令输入:

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 $ 会输出$符号

用户自定义变量(Bash变量)

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定义系统提示符的变量

位置参数变量

在脚本中使用:

变量描述
$nn为数字,$0代表命令本身,使用10个以上参数是使用${10}
$*代表命令行中所有参数,但把所有参数看成一个整体,for循环只传递一次
$@代表命令行中所有参数,但把每个参数区分对待,可使用for循环递归
$#代表命令行中参数的个数,不包括$0

预定义变量
变量描述
$?最后一次执行的命令所返回的状态,0表示正确,非0表示不正确
$$当前进程的进程号
$!后台运行的最后一个进程的进程号

接收键盘输入 - read

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、exprlet数值运算工具
例如,加法:

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后提示信息,本地和远程登录时都显示;


正则表达式

正则表达式是包含匹配,通配符(*?[])是完全匹配lsfindcp等命令不支持正则表达式。

正则符号作用
*前一个字符匹配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

推荐cutgrep配合使用有较好的效果。

cut [选项] [文件名]

  • -f [列号]: 提取文件的第几列,提取多个列用逗号隔开列号

  • -d [“分隔符”]: 按照指定分隔符将文件分割成列,默认分隔符为Tab

注意:对空格作为分隔符使用时不友好,例如df命令的打印内容(可使用df -h | tr -s " " | cut -d " " -f 1将重复空格合并)。对识别\t:,等使用较好。
例如,查找出所有普通用户:

cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1

字符提取命令 - printf

printf [输出类型输出格式] [输出内容]

  • %ns : 输出字符串,n指定输出几个字符

  • %ni : 输出整数,n指定输出几个字符

  • %m.nf : 浮点输出,m位数中,n个小数

注意:输出内容不能写成文件名,不接受管道符输出。不识别空格,且行末无换行。
若要处理文件中的内容,例如:

printf '%s' `cat file.txt`

输出提示音,和C语言一致,例如:

printf '\a'

字符提取命令 - awk

该命令可接受管道符的输出。

awk ‘条件1{动作1} 条件2{动作2}’ [文件名]

  • 条件 : 一般使用关系表达式,如x>10,常用条件BEGINEND

  • 动作 : 打印、流程控制语句,如print $1 "\t" $3

1、关于print命令:只能在awk命令中使用,不同于printf命令,它识别空格且行末有换行;
2、关于$符号:代表一行,$1代表一行中的第一列;
3、关于常用条件BEGINEND:用于在打印需要的内容前,会执行该条件大括号中的内容;
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是一种轻量级流编辑器,可用于文件、命令结果的选取、替换、删除、新增。

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

shell字符处理命令 - sort、wc

排序命令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逻辑或
! 判断逻辑非

流程控制 - if语句

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

流程控制 - case语句

类似于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循环值中,有几个值就循环几次,每次把不同值赋给变量,靠空格判断,可以是字符串变量。
语法一:

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和unitl语句

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++的cinscanf函数:

read -p "Please input a filename:" file

7、终止if语句,返回错误结果,即可用$?可查看到的结果:

exit 1

本文档不定期更新,若有不当之处,还望指正。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值