显示日期和时间:date
显示日历的命令:cal
简单好用的计算器:bc
热键:
命令求助:
简单文本编辑器: nano(使用非常简单)
Linux关机重启:
将数据同步写入硬盘:sync
常用的关机重启命令:
shutdown - h now(关机)
shutdown - r now(重启)
shutdown -h xx:xx(指定时间关机)
shutdown -h +10(十分钟后关机)
reboot(重启)
halt(系统停止)
poweroff(系统关机)
用户与root信息存放在/etc/passwd
密码存放在/etc/shadow
用户组信息存放在/etc/group
ls -al 查看文件属性
-rwxrwxrwx. 链接数 文件拥有者 文件所属群组 文件大小 最后修改时间 文件名
第一个字符: -代表文件,d代表目录,l代表链接文件,b代表设备文件中的存储设备,c代表设备文件中的输入输出设备
第一组rwx为拥有者u的权限,第二组rwx为群组g的权限,第三组为其它人o的权限
对于文件而言: r:4可读 w:2可以修改(不是新建删除) x:1可执行
对于目录而言: r:4可以查看该目录下的文件或目录详情 w:2可以创建,删除,移动,修改文件或文件名目录等 x:1可以切换到该目录下
chgrp [-R] group filename/dirname 修改文件所属用户组
-R 递归修改
chown [-R] owner filename/dirname 修改文件所属用户或者用户组
chown [-R] owner:group filename/dirname 修改文件所属用户或者用户组
-R 递归修改
chmod [-R] 777 filename/dirname 修改文件权限
chmod [a,u,g,o] [+-=] [rwx] filename/dirname
/根目录
/bin 存放执行文件的目录
/boot 存放启动时会用到的文件的目录
/dev 设备
/etc 配置
/lib 系统函数库
/media 媒体(光盘,软盘,dvd等设备暂时挂载)
/mnt 暂时挂载额外设备
/opt 第三方软件
/run 系统启动后产生的各项信息存放目录
/sbin root命令存放目录
/srv service网络服务使用的数据目录
/tmp 临时文件存放目录
/usr(unix software resource) (第二层FHS设置,不变性数据)
/var (第二层FHS设置,变动性数据)
/lost + found 文件系统发生错误时,遗失片段放置在该目录
/proc 虚拟文件系统,放置的数据都是在内存中。可以查看cpu,内存,等等信息/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/*等
/sys 虚拟文件系统,记录内核和系统硬件相关信息
uname -r 查看linux的内核版本
uname -m 查看linux的架构版本
cd 切换目录
cd ~ 返回家目录
cd - 返回上次目录
cd .. 返回上层目录
pwd 显示当前目录
mkdir [-mp] dirname 建立一个新目录
-p 创建多级目录
-m 指定目录权限 mkdir -m 777 dirname
rmdir [-p] dirname 删除一个新目录
-p 删除多级目录(子目录被删除,父目录变成空,则父目录也被删除)
ls [-ald] filename/dirname 文件与目录查看
-a 显示包括隐藏文件
-l 显示详细信息包括文件属性和权限等
-d 只显示目录
cp [-aipr] 源文件或目录 目标文件或目录 复制
-a 文件属性和权限一同复制
-i 文件存在覆盖前询问
-p 连同文件属性和权限一同复制
-r 递归复制
rm [-rf] filename/dirname 删除
-r 递归删除
-f 强制force,忽略不存在的文件
mv 移动或重命名
mv source destination
basename 获取路径的文件名
basename /etc/sysconfig/network
network
dirname 获取路径的目录
dirname /etc/sysconfig/network
/etc/sysconfig
cat [-n] file 查看文件内容
-n 打印行号
tac 跟cat相反,从最后一行开始显示
nl file 显示的同时输出行号
more file 一页一页显示内容
less file 跟more类似,但是可以向前翻页
head [-n number] file 查看前n行
tail [-n number] file 查看后n行
tail -f file 动态更新文件内容
od 查看非文本文件
touch 修改文件时间或创建文件
touch file 创建文件
touch -d "2 days ago" file 修改文件的atime和mtime(无法修改ctime)
touch -t 201406150202 file 修改文件的atime和mtime (无法修改ctime)
stat filename 查看文件的atime(访问改变时间) mtime(内容修改时间)ctime(状态修改时间)
umask 查看默认权限
umask -S 具体显示
umask 002 设置默认权限
建立文件时的默认权限: -rw-rw-rw - (0022) = -rw-r--r--
建立目录时的默认权限:drwxrwxrwx - (0022) = drwxr-xr-x
chattr [+-= ] [ai] filename/dirname 增加隐藏属性
-a 当设置之后只能增加数据,无法修改,只有root能设置
-i 设置之后文件就不能被增删改查了
lsattr 查看隐藏属性
SUID:4
SUID权限针对二进制程序有效,且执行者必须拥有x权限,那么在执行期间,执行者具有文件拥有者的权限。
-rwsrwxrwx:(如果是S,则表示没有x权限,为空的SUID权限)
SGID:2
1.SGID针对二进制程序,且执行者拥有x权限,那么在执行期间,执行者具有用户组的权限。
2.SGID针对目录,且执行者具有r,x权限,用户在该目录下的有效用户组会变成该目录的用户组,比如w权限新增文件和目录,那么文件的用户组为该目录的用户组
-rwxrwsrwx:(如果是S,则表示没有x权限,为空的SUID权限)
SBIT:1
SBIT针对目录,执行者具有w,x权限,即写入权限,那么执行者在该目录下建立文件或目录后,只有root和自己才有权利删除。
-rwxrwxrwt:(如果是T,则表示没有x权限,为空的SUID权限)
chmod 7777 filename 即可设置特殊权限
file filename 观察文件类型
which [-a] command
-a 根据path找到所有命令而不是第一个
type command
whereis 只找系统中某些指定目录
whereis filename
whereis -l 查看哪些目录
locate则利用数据库来查找文件名
locate keyword
locate -S 查看数据库文件的名字和数据量
updatedb 更新locate数据库
find [PATH] [option] [action]
1. find / -mtime [+-] n 查看n天修改过的文件
2. find / -user xxx 根据用户查找
类似的-group xxx
find / -nouser 或者 find / -nogroup 找到那些不正常的文件
3. find / -name filename 根据文件名查找
find / -name "*keyword*" 根据关键字查找
4. find / -perm /7000 根据文件属性进行查找(/7000指具有SUID,SGID,SBIT特殊权限得到文件)
5 find / -perm /7000 -exec ls -l {} \; find / -perm /7000找到的内容会替代{},然后执行ls
超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量,使用量和剩余量
inode:记录文件的权限和属性,一个文件占用一个inode,同时记录文件的数据所存储的数据区块的号码
数据区块:实际记录文件的内容,文件太大会占用一个区块
ext2,ext3,ext4文件系统由多个存储区群组构成,每个存储区群组又包含超级区块,inode和数据区块。
blkid 显示出目前系统被格式化的设备
dumpe2fs 设备文件名(ext2,ext3,ext4文件系统)查看文件系统详情
xfs_info 挂载点|设备文件名 查看文件系统详情
数据区:由多个存储区群组构成,每个存储区群组又包含超级区块,inode和数据区块。
活动登录区:记录文件系统的变化,类似文件区
实时运行区:xfs会在这个区段找到一个到数个extent区块,将文件放置在这个区块内,等分配完毕后,再写入到数据区的inode和数据区块中。
df [-ih] [目录或文件名] 列出文件系统的整体磁盘使用量
-h 人性化显示
-i 容量以inode数量显示
df -aT 将系统内的所有特殊文件名称和格式都列出来
-a 列出所有文件系统
-T 文件系统的名称也列出
du -[sh] 文件或目录 查看文件系统的磁盘使用量
-h 人性化显示
-s 仅列出总量
硬链接(不能跨文件系统,不能链接目录):在某个目录下新增一条文件名链接到某个inode号码的关联记录,不会占用inode和区块
符号链接:类似windows的快捷键,创建一个新的文件,文件内容是链接的文件的inode,会占用inode和区块
ln 源文件 目标文件 创建硬链接
ln -s 源文件 目标文件 创建符号连接
步骤:
lsblk(list block device) 列出所有的存储设备
blkid 列出设备的UUID等参数
parted 列出磁盘的分区表类型与分区信息
parted /dev/sda1 print
MBR分区使用fdisk,GPT分区使用gdisk
gdisk 设备名称 对磁盘进行分区
gdisk /dev/sda (不能是/dev/sda1)
partprobe [-s] 更新linux的分区表信息
mkfs(make filesystem)
xfs文件系统 mkfs.xfs /dev/sda1
ext4文件系统 mkfs.ext4 /dev/sda1
xfs_repair 设备名称
xfs_repair /dev/sda1
fsck.ext4 设备名称
fsck.ext4 /dev/sda1
mount /dev/sda1 /mnt/test 挂载
mount UUID="" /mnt/test
umount 设备名称或者挂载点 卸载
umount /dev/sda1
umount /mnt/test
mknod 设备文件名 主设备码 次设备码
xfs_admin 修改XFS文件系统的UUID与Lable Name
tune2fs 修改ext4的label name与UUID
启动挂载/tec/fstab及/etc/mtab
cat /etc/fstab 查看启动时挂载文件
特殊设备loop挂载(镜像文件不 刻录就挂载使用)
mount -o loop /tmp/Centos.iso /data/centos_dvd 挂载
umount /data/centos_dvd 卸载
方法1:设置一个内存交换分区
方法2:建立一个虚拟内存文件
物理分区创建内存交换分区
1.分区gdisk或者fdisk分区
2.格式化,mkswap 设备文件名
3.使用 swapon 设备文件名启动swap分区
4.free 或者swapon -s查看内存使用情况
文件创建内存交换文件
1.使用dd在/tmp下面新增一个128M的文件
dd if=/dev/zero of=/tmp/swap bs=1M count=128
2.mkswap将/tmp/swap这个文件格式化为内存交换文件
mkswap /tmp/swap
3.使用swapon将/tmp/swap启动
swapon /tmp/swap
4.使用swapoff关闭swap file 并设置自启动
自启动 vim或者nano /etc/fstab里面设置
*.Z compress程序压缩的文件
*.zip zip程序压缩的文件
*.gz gzip程序压缩的文件
*.bz2 bzip2程序压缩的文件
*.xz xz程序压缩的文件
*.tar tar程序打包的文件,并没有压缩过
*.tar.gz tar程序打包的文件,并经过gzip压缩
*.tar.bz2 tar程序打包的文件,并经过bzip2压缩
*.tar.xz tar程序打包的文件,并经过xz压缩
gzip应用最广泛,可以解开compress,zip与gzip压缩文件
gzip 文件名 压缩
gzip -d 文件名.gz 解压缩
zcat/zmore/zless 文件名.gz 查看内容
zgrep -n ‘http’ 文件名.gz 使用方法同grep 关键字查找文件内容
使用方法同gzip
使用方法同gzip
tar [-cxzjJvfC] 文件名
-c 压缩
-x 解压
-z 通过gzip压缩 文件名.tar.gz
-j 通过bzip2压缩 文件名.tar.bz2
-J通过xz压缩 文件名.tar.xz
-v 显示压缩和解压过程中的文件名
-C解压时,解压到指定目录
常用:
tar -zcvf 文件名 压缩
tar -ztvf 文件名.gz 查看压缩
tar -zxvf 文件名.gz 解压
xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
xfsdump -I 查看备份情况
xfsrestore [-f 备份文件] [-L S_label] [-s] 待恢复目录
xfsrestore -I 查看还原情况
dd不仅可以制作文件还可以用于备份
dd if="input_file" of="output_file" bs="block_size" count="number"
例如 dd if="/etc/passwd" of="/etc/passwd.back"
cpio可以备份任何文件
cpio -ovcB > [file|device] 备份
cpio -ivcdu < [file|device] 还原
cpio -ivct < [file|device] 查看
vi和vim都是文本编辑器,vim是vi的增强版
三种模式:
1.一般命令模式
2.编辑模式
3.命令模式
刚进入vi时为一般命令模式,按a,A,i,I,o,O,r,R,按:,?,/进入命令模式,编辑模式按ESC回到一般命令模式,命令模式按:wq保存并退出编辑器。
一般模式按键说明:
光标移动
hjkl 分别代表左下上右,也可以使用方向键,可以数字加方向,比如30h代表向左移动30个字符
ctrl+f 向下移动一页=page down
ctrl+b向上移动一页=page up
0或者home移动到该行最前处
$或者end移动到该行末尾
G 移动到文件最后一行
gg 移动到文件第一行
查找替换
/word 向下查找字符串
?word 向上查找字符串
n 找到下一个,N找到上一个
:n1,n2s/word1/word2/g n1和n2行之间查找word1,并将其替换成word2
:1,$s/word1/word2/g 从第一行到最后一行,将word1替换成word2
:1,$s/word1/word2/g 从第一行到最后一行,将word1替换成word2,之前需要询问是否替换
删除复制与粘贴
x与X,x向后删除一个字符,X向前删除一个字符
nx 向后连续删除n个字符
dd 删除整行
ndd 删除n行
yy 复制光标的那一行
nyy 复制光标所在的向下n行
p与P p将复制的数据向下粘贴,P将复制的数据向上粘贴
u 恢复前一个操作
ctrl + r 重复上个操作
. 重复前一个操作
进入插入或替换的编辑模式
i与I 插入模式,当前光标处插入
a与A 插入模式,从光标所在行的最后一个字符插入
o与O 插入模式 ,在光标所在行的下一行插入
r与R 替换模式,r替换一次,R一直替换,知道按esc停止
ESC 退出编辑模式
命令行模式的保存,退出等命令
:w 将编辑的数据写入硬盘文件中
: w! 若文件属性为只读,则强制写入
:q退出
:q! 不修改退出
:wq 保存后退出
v 字符选择
V 行选择
ctrl + v 区块选择
y 复制
d 删除
p 粘贴
vim file1 file2 同时编辑多个文件
:n 编辑下一个文件
:N 编辑上一个文件
:files 列出vim开启的所有文件
:sp [filename] 打开一个新窗口,加filename则表示创建一个新文件
ctrl + w + 下 ,ctrl + w + 上 切换窗口
ctrl + w + q 退出窗口
(ctrl + w先按,然后下上q)
type name
长命令使用\+Enter来换行
ctrl + u/ctrl + k 分别向前或向后删除命令串
ctrl + a/ctrl + e 光标分别移动到前面或者后面
echo $PATH 输出变量
echo -e xxxx
-e 可以使得\a \n等转移字符生效
变量的设置规则,
myname=jack 两遍不能有空格,开头字符不能是数字
变量包含空格,可使用单引号或双引号包含
双引号内的特殊字符比如$,可以保持原有特性,单引号内的特殊字符比如$则代表一般字符,特殊字符可以使用转义字符来显示
一串命令的执行中,需要用到其他命令提供的信息时,可以通过`命令`或者$(命令)执行
其他子程序需要用到该变量,则需要export PATH 使其变成环境变量
(系统默认变量为大写字符,自行设置的变量为小写字符)
取消变量的方法:unset 变量名
env 或者export查看环境变量
set 观察所有的变量
export 变量名称 将自定义的变量加入环境变量
read读取来自键盘输入的变量 read variable
read -p "提示信息" variable
-p 输入前打印提示信息
declare或者typeset [-aix] variable
-a variable定义成数组类型
-i variable定义成整数类型
-x variable 跟export一样变成环境变量
var[0] = "small main"
var[1] = "big main"
echo ${var[1]}
echo ${var[2]}
ulimit -a 显示所有限制
ulimit -f 10240 设置文件大小设置
alias lm="ls -al | more" 设置别名
alias 查看别名
unalias lm 将lm命令删除
history 查看历史命令
1.以相对/绝对路径执行命令,例如[/bin/ls]或者[./ls]
2.由alias找到该命令执行
3.bash内置命令
4.通过$PATH变量的顺序找到第一个命令执行
cat /etc/issue 编辑登录信息
cat /etc/motd 编辑欢迎信息
login与non-login shell读取bash环境配置文件不同
login shell:取得bash shell时需要完整的登录流程,即输入用户名和密码。比如tty1~tty6非图形界面登录
non-login shell:1.x-Windows图形界面登录,然后打开终端。2.bash开启一个子进程
login shell只会读取两个配置文件
1./etc/profile:系统整体的设置,最好不要修改该文件
2.~/.bash_profile或者~/.bash_login或者~/.profile:属于个人设置,自己添加的数据写在这个地方(三个文件按顺序读取,且只会读取其中一个)
最终读取~/.bashrc配置文件,即也可以在该文件下配置自定义环境变量
source(或者.) 配置文件名 将配置文件内容读取到shell环境中,因为/etc/profile或者~/bash_profile等都是login时才生效,需要注销登录后才能生效。
non-login shell只会读取~/.bashrc配置文件
stty -a 查看终端环境的参数配置
set [-uvCHhmBx]帮助设置终端的值
ctrl + C终止当前命令
ctrl + D输入结束
ctrl + Z暂停当前命令
通配符
符号 | 意义 |
* | 代表0到无穷个任意字符 |
? | 代表一定有一个任意字符 |
[] | 一定有括号内的一个字符,[abcd],一定有一个字符,可能是abcd其中一个 |
[-] | 代表在编码内的所有字符,[0-9],代表0-9之间的所有数字,[a-z] |
[^] | 表示反向选择,[^abc]一定有一个不是abc的字符 |
特殊符号
符号 | 意义 |
# | 注释符号,视为说明不执行 |
\ |
转义符;将特殊字符或者通配符转换成普通字符 |
| | 管道;分割两个管道命令的符号 |
; | 连续命令执行分隔符 |
~ | 家目录 |
$ | 使用变量前导符 |
& | 任务管理:将命令变成后台任务 |
! | 逻辑运算符非not的意思 |
/ | 目录符号:路径分隔符 |
>,>> | 数据流重定向:输出定向,分别是替换和累加 |
<,<< | 数据流重定向:输入定向 |
'' | 单引号,不具有变量替换功能 |
"" | 双引号,具有变量替换功能 |
`` | 中间为执行命令,也可以使用$() |
() | 在中间为子shell的起止与结束 |
{} | 在中间为命令区块组合 |
执行命令,使得文件读取数据到内存,然后处理后输出到屏幕上
标准输入(stdin):代码为0,使用<或者<<
标准输出(stdout):代码为1,使用>或者>>
标准错误输出(stderr):代码为2,使用2>或者2>>
find /home -name .bashrc > list_right 2> list_error 将正确信息写入list_right, 将错误信息写入list_error
find /home -name .bashrc > list 2>& 1==find /home -name .bashrc &> list 将正确和错误信息写入同一个文件
cat > catfile < ~/.bashrc 将bashrc文件内容复制到catfile文件中
cat > catfile << "eof" eof代表结束符,当键盘敲出eof时结束
cmd;cmd(不考虑命令相关性的连续命令执行)
cmd1 && cmd2 ,如果cmd1错误,则cmd2不会执行
cmd1 || cmd2, 如果cmd1正确,则cmd2不会执行
ls -al /etc | less
|仅能处理经由前面一个命令传来的正确信息,也就是标准输出的信息,对于标准错误并没有直接处理的能力。
管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行
cut用来切割内容
cut -d'分隔符' -f fields, 根据分隔符,选取哪一段
echo $PATH | cut -d':' -f 5 根据:分隔符,选取$PATH里面的第五段
export | cut -c 12- 选取exprot内容的12个字符以后的内容
grep 分析一行信息,有需要的信息,则把该行拿出来
grep 'test' /etc/profile
echo $ PAtH | grep ' root'
sort用来排序
cat /etc/passwd | sort
uniq 重复数据仅显示一条
cat /etc/passwd | sort | uniq
-c 进行计数
wc 统计文件中的字,行和字符数
tee 会同时将数据流分送到文件与屏幕,而输出到屏幕的起始就是stdout,可以继续用下个命令处理
tee [-a] file
-a 追加的方式,将数据加入到文件中
last | tee last.list | cut -d' ' -f 1
tr可以用来删除一段信息中的文字,或进行文字信息转换
tr[-ds] set1...
-d 删除信息中的set1 这个字符
-s:替换掉重复的字符
tr [a-z] [A-Z] 将小写字符替换成大写字符
tr -d':' 删除:字符
col -x 将tab键转换成对应的空格键
join:两个文件当中,有相同数据的那行,才将它加在一起
paste 直接将两行粘在一起,默认用tab分隔开
paste [-d] file1 file2
-d 指定分隔符
expand 就是将tab转成空格键
expand [-t] file
-t 后面跟数字,按照多少个空格键替换,默认8个
split [-bl] file PREFIX
-b: 后面可接欲划分成的文件大小,可加单位b,k,m等
-l 以行数来划分
split -b 300k /etc/services services
xargs就是产生某个命令的参数的意思
很多命令不支持管道命令,可以通过xargs来提供该命令使用标准输入。
关于-号的用途
可以作为stdin与stdout来使用
tar -zcvf - /home | tar -zxvf - -C /tmp/homeback
基础正则表达式
[:alnum:] 代表英文大小写字符以及数字
[:alpha:] 代表大小写字符
[:upper:]代表大写字母
[:lower:]代表小写字母
[:digit:]代表数字
^word 以word为首
word$ 以word结束
.代表任意字符
\转移字符
*0至多个字符
[]含有其中一个字符
[n1-n2] [a-z]
[^list] 反向选择
\{n,m\}n-m个字符
\{n\} n个字符
\{n,\}n个以上字符
sed 可以将数据进行替换,删除,新增,选取待定等功能
sed [-n] [操作]
-n 安静模式
a:下行新增 ,c替换,d删除,i:下行插入,p:打印,s替换
sed '2,5d' 删除
sed '2a drink tea'
sed '2i drink tea'
sed -n '5, 7p'
sed 's/要被替换的字符/新的字符/g'
+ 一个或者一个以上re字符
?0个或者一个re字符
| 或
()群组字符串
()+一个或者多个群组字符串
printf '打印格式' 实际内容(跟c语言的一样)
%ns n个字符
%ni n位整数
%N.nf N位整数,n位小数
printf '%s\t %s\t %s \t %s\t %s\t' $(cat printf.txt)
awk '条件类型1{操作1} 条件类型2{操作2}...' filename
last -n 5 | awk '{print $1 "\t" $3}'
整个awk的处理流程:
1.读入第1行,并将第1行的数据写入$0,$1,$2等变量中
2.根据"条件类型"的限制,判断是否需要进行后续"操作"
3.完成所有操作与条件类型
4.递归处理后续行
awk是以行为一次处理单位,以字段为最小的处理单位
NF:每行拥有的字段数
NR:目前awk处理的是第几行
FS:目前的分隔符,默认是空格键
last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'
条件类型
> ,< ,>=, <=, ==,!=
awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 第一行还是默认以空格键处理
awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'
diff from-file to-file 比较差异
cmp from-file to-file 比较差异
pr filename 打印文件内容
shell脚本编写注意事项:
1.命令是从上而下,从左至右地分析与执行。
2.命令,选项,参数间的多个看空格会被忽视掉。
3.空白行也会被忽视掉。
4.读取到Enter符号就尝试开始执行该行命令。
5.一行内容太多,可以使用\[Enter]来扩展至下一行
6.#可以作为注解
shell执行(直接命令执行,shell.sh文件必须具备r和x权限):
1.绝对路径,使用/home/jackacmlove/shell.sh来执行命令。
2.相对路径,在/home/jackacmlove 工作目录下通过./shell.sh来执行命令。
3.变量[PATH]功能,将shell.sh放在PATH指定的目录内,例如~/bin 然后执行。
4. 以bash程序来执行:通过[bash shell.sh]或[sh shell.sh]来执行。
脚本的文件头处记录好:
1.脚本的功能
2.脚本的版本信息
3.脚本的作者与联络方式
4.脚本的版权声明方式
5.脚本的History(历史记录)
6.脚本内较特殊的命令,使用[绝对路径]的方式来执行
7.脚本运行时需要的环境变量预先声明与设置
1.交互式脚本:变量内容由用户决定
#!/bin/bash
read -p "Please input your first name" firstname
read -p "Please input your last name" lastname
echo -e "\n your full name is : $firstname $lastname"
2.随日期变化:利用date建立文件
echo -e "I will use 'touch' command to create 3 files."
read -p "Please input your filename: " fileuser
filename=${fileuser:-"filename"}
date1=$(date --date="2 days ago" +%Y%m%d)
date2=$(date --date="1 days ago" +%Y%m%d)
date3=$(date +%Y%m%d)
file1=${filename}${date1}
file2=${filename}${date2}
file3=$filename$date3
touch "${file1}"
touch "${file2}"
touch $file3
3.数值运算:简单的加减乘除
#!/bin/bash
echo -e "You SHOULD input 2numbers, I will multiplying them! \n"
read -p "fisrt number:" firstnum
read -p "second number:" secnum
total=$(($firstnum*$secnum))
echo -e "\nThe result of $firstnum * $secnum is ===> $total"
var=$((运算内容))
echo "4*5" | bc
1.利用直接执行的方式来执行脚本,即前面介绍的几种方式
实际是利用子进程来执行的,那么变量或者操作结束后不会传回父进程
2.利用source来执行脚本:在父进程中执行
检测系统,判断文件目录或者相关属性
test -e /jackacmlove 判断文件或目录是否存在(执行不会显示信息)
test -e /jackacmlove && echo "exist" || echo "Not exist"
-f 是否存在且为文件
-d 是否存在且为目录
利用判断符号[]
在中括号内的每个组件都需要有空格来分隔
在中括号内的变量,最好都以双引号括起来
在中括号内的常数,最好都以单或双引号括起来
$0代表文件名,后面还有$1,$2....
可以获取其参数
$#代表参数的个数
$@代表参数组成的集合["$1" "$2" "$3"]
$* 代表参数集合["$1 $2 $3"]
shift:造成参数变量号码偏移。
shift n 向右移动n个参数
单层,简单条件判断式
if [ 条件判断式 ]; then
fi
[(条件1) -o (条件2)] == [(条件1)] || [(条件2)]
多重,复杂条件判断式
if [ 条件判断式 ]; then
else
fi
还有种情况
if [条件判断式];then
elif [条件判断式]; then
else
fi
case $变量名称 in
"第一个变量的内容" )
程序段
;;
"第二个变量的内容" )
程序段
;;
*)
不包含第一个变量和第二个变量内容的代码执行段
exit 1
;;
esac
function fname() {
程序段
}
shell脚本的执行方式是由上而下,由左至右,因此在shell脚本当中的function的设置一定要在程序的最前面
while [condition] 条件成立,循环
do
程序段落
done
until [condition] 条件成立,终止循环
do
程序段落
done
for var in con1 con2 con3 ...
do
程序段落
done
$(seq 1 100) seq连续的意思, 1-100个连续数字
for (( 初始值;限制值;赋值运算))
do
程序段落
done
类似:for(int i = 0; i < 100; i++) {}
sh [-nvx] scripts.sh
-n:不要执行脚本,仅查询语法问题
-v:在执行脚本前,将脚本内容输出到屏幕上
-x:将使用到的脚本内容显示到屏幕上,即将执行过程全部列出来
初始用户组就是/etc/passwd里面的gid对应的用户组
有效用户组就是目前支持的用户组,通过groups查看,第一个就是有效用户组
groups能够查看所有支持的用户组
newgr 用户组 切换有效用户组 切换有效用户组即重新开启一个shell,可以使用exit退出
useradd 用户 创建普通用户即uid通常大于1000
普通用户会创建一个跟用户名相同的用户组,且会在/home目录下创建用户家目录,权限为700
useradd -r 用户 创建系统用户即uid通常小于1000
系统用户会创建一个跟用户名相同的用户组,系统用户不会创建家目录
用户账号与密码参数方面的文件:/etc/passwd,/etc/shadow
用户组相关文件:/etc/group,/etc/gshadow
用户的家目录:/home/账号名称
passwd [--stdin] 账号名称 修改自己的密码
--stdin 通过管道数据作为密码修改
passwd -S 账号名称 查看账号密码参数
chage [-ld] 账号 查看设置账号参数
-l 列出账号详细密码信息
chage -d 0 用户名 登录系统后,立刻修改密码
usermod跟useradd 类似,用来微调用户信息
usermod -G 用户组 username 设置用户的用户组,只会有一个用户组
usermod -a -G 用户组 username 添加用户的用户组
userdel [-r] 用户名 删除用户
-r 连同用户家目录一同删除
完整删除步骤:
1. find / -user username 找到所有文件
2. rm -rf 掉他们
3. userdel -r username
用户功能
id 查看某人或者自己的相关uid/gid
finger 也能查看用户的详细信息,但是需要安装
chfn [用户名] 类似change finger的意思,修改用户信息
chsh [-ls] change shell 的简写
-l: 列出用户所有的shell
-s:设置一个shell
groupadd [-r] groupname 新增用户组
-r:新增系统用户组,uid小于1000
groupmod [-g gid] [-n group_name] groupname
-g:修改用户组的id
-n group_name:修改用户名
groupdel groupname 删除用户组,必须保证用户组不是初始用户组
用户组管理员
gpasswd groupname 给用户组设置密码
gpasswd -r groupname 删除用户组密码
gpasswd -A user1,user2 。。。。 groupname 将user1,user2设置成groupname的管理员
gpasswd -a user3 groupname 添加用户user3到用户组
gpasswd -d user4 groupname 删除用户user4到用户组
该用户组成员就能newgrp了
ACL主要设置用户,用户组以及默认属性的权限
setfacl:设置文件或目录的ACL规范
getfacl:获取文件或目录的ACL设置选项
setfacl [-bkRd] [-m | -x acl参数] 目标文件名
-m: 设置后续acl参数
-x:删除后续acl参数
-b:删除所有acl参数
-k:删除默认acl参数
-R:递归设置acl参数
-d:设置默认acl参数
1.针对使用者的方式[u::rwx]
setfacl -m u:jackacmlove:rwx filename
2.针对用户组的方式[g::rwx]
setfacl -m g:groupname:rwx filename
3.针对有效权限设置[m:rwx]
setfacl -m m:rwx filename
4.针对默认权限的设置方式[d:[ug]:使用者列表:[rwx]]
setfacl -m d:u:user:rwx /home
setfacl -m d:g:user:rwx /home
这样在/home下新建文件或者目录,权限就变成了rwx
getfacl filename 查看filename的acl参数
setfacl -b filename 删除filename的所有acl参数
让一般身份变成root的两种方式:
su - 切换成root身份执行
sudo 命令 不需要切换root身份,以root权限执行
su 切换身份
su [-l]
su - 或者 su -l 即以login-shell的方式登录,会首先读取/etc/profile然后按顺序读取~/.bash_profile,~/.bash_login,~/.profile其中一个,最终其实都会读取~/.bashrc配置文件
su username 则表示以nonlogin-shell的方式登录,读取配置文件不同,只会读取~/.bashrc
切换身份务必使用su -的方式
exit 退出su的环境
sudo
防止root密码泄露,可以把需要使用到root权限的用户通过sudo来执行命令
sudo必须要规范到/etc/sudoers内的用户才能执行
系统默认只有root可以执行sudo命令
visudo 或者vim /etc/sudoers修改文件内容
1.单一用户可以使用root所有命令,与sudoers文件语法
jackacmlove ALL= (ALL) ALL
2.利用wheel用户组以及免密密麻麻的功能处理visudo
visudo
%wheel ALL=(ALL) ALL %后面代表用户组
然后把用户加入到wheel用户组即可
3.有限制的命令操作
jackacmlove ALL=(root) /usr/bin/passwd 命令必须是绝对路径
jackacmlove ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root passwd和passwd root不能用
4.通过别名创建visudo
visudo
User_Alias ADMPW = user1,user2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root passwd和passwd root
ADMPW ALL=(root) ADMPWCOM
w,who,last,lastlog都可以用来查看用户的登录情况
pwck 这个命令hi检查 /etc/passwd这个账号配置文件内的信息,检查实际的家目录是否存在等信息
pwconv 将/etc/passwd内的账号与密码移动到/etc/shadow,早期unix没有/etc/shadow
pwunconv 将/etc/shadow内的密码栏数据写回/etc/passwd中
chpasswd 读取未加密前的密码,并且经过加密后,将加密后的密码写入/etc/shadow中
鸟哥的私房菜P461页
1.例行性任务,每隔一定周期就会执行一次
2.突发性任务,只做一次
at: at是可以处理且仅执行一次的命令
crontab:周期性的执行命令
at命令执行,需要先保证atd服务开启
systemctl restart atd
systemctl enable atd 开机时自动开启
systemctl status atd 查看状态
使用at命令产生所需要运行的任务,并将这个任务以文本文件的方式写入/var/spool/at/目录下,该任务就能够等待atd服务执行了
为了安全性,需要利用/etc/at.allow与/etc/at.deny两个文件实现对at的使用限制。加上这两个文件后,at的工作情况如下:
1.先寻找/etc/at.allow文件,写入这个文件中的用户才能使用at,没有写入这个文件的用户则不能使用at
2.如果/etc/at.allow不存在,就查找/etc/at.deny这个文件,写在这个/etc/at.deny中的用户则不能使用at,而没有在这个at.deny文件中的用户就可以使用at
3.如果两个文件都不存在,那么只有root可以使用at这个命令
at now + 5 minutes
编辑完任务ctrl +d 结束,编辑时所用的命令必须是绝对路径,避免出问题
atq 查看任务
atrm(jobnumber) 删除任务
batch:系统有空时才执行任务,利用at来完成,它在cpu的任务负载小于0.8的时候,才执行你的任务。
uptime 可以查看到1分钟,5分钟,15分钟的平均任务负载量
为了避免安全性,crontab同样使用了两个配置文件:/etc/cron.allow和/etc/cron.deny
当用户使用crontab来建立计划任务后,该项任务会被记录到/var/spool/cron中,而且是以账号来作为判断依据的,比如jackacmlove创建任务后,任务会被记录在
/var/spool/cron/jackacmlove,但是不要用vi直接编辑文件,因为可能由于语法错误,导致cron无法执行。
crontab [-u username] [-l -e -r]
-u username:只有root能够执行这个命令,即给指定的username来建立/删除crontab计划任务
-l 查看crontab任务内容
-e 编辑crontab任务内容
-r 删除crontab任务内容(所有的都删除)
命令有六个字段:
分钟 0~59,小时0~23,日期1~31,月份1~12,周0~7(0和7都表示星期天),命令
* 代表任何时刻
, 代表分隔时段的意思,比如3,6即3和6
- 代表一段时间范围的意思,比如3-6,即3-6的意思
/n 那个n代表数字,即每个n单位间隔执行一次
个人化的操作使用crontab -e
系统维护管理使用 vim /etc/crontab
自己开发软件使用vim /etc/cron.d/newfile
anacron命令
程序:通常是二进制程序,放置在存储媒介中,比如磁盘,光盘等,以物理文件的形式存在
进程:程序运行后,执行者的权限与属性,程序的代码以及数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符PID,
进程即一个运行的程序
父进程内执行命令,则每个命令会以子进程的方式执行,即也会被触发成PID,那么父进程就会有PPID
fork and exec:
进程都会借由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制的子进程再以exec的方式来执行所需要执行的进程,从而成为一个子进程。
任务管理是用在bash环境下的:当我们登录系统获取bash shell后,在单一终端下同时执行多个任务的操作管理
直接将命令丢到后台中[执行]的&
tar -zcvf /emp/etc.tar.gz /etc &
将[目前]的任务丢到后台中[暂停]:ctrl-z
查看目前的后台任务状态:jobs
jobs [-lrs]
-l:列出job number与命令串之外,同时列出pid号码
-r:列出run的后台任务
-s:列出stopped的后台任务
将后台任务拿到前台来处理:fg
fg %jobnumber(默认取出+那个任务,即最近的)
让任务在后台下的状态变成运行中:bg
bg %jobnumber
find / -perm /7000 > /tmp/text.txt
jobs; bg %3; jobs
管理后台当中的任务:kill
kill %jobnumber 正常结束一项任务
kill -9 %jobnumber 强制删除一个不正常的任务
nohup可以在脱机或者注销系统后,还能够让任务继续执行
nohup [命令与参数]
nohup [命令与参数] &
静态ps命令或者动态的top命令,以及pstree来查看进程之间的关系
ps -l 查看自己bash进程
F:代表进程标识,说明进程的权限,4代表root,1为子进程仅执行复制fork没有实际执行exec
S:代表进程状态,R(Running),S(sleep),D(不可以被唤醒的睡眠状态,比如等待I/O操作),T(Stop),Z(zombie):僵尸状态
C:cpu的使用率
PRI/NI 代表了进程被cpu执行的优先级,数值越小,优先级越高
ADDR/SZ/WCHAN : ADDR该线程在内存的哪个部分,如果是running进程,则显示- / SZ表示进程用了多少内存 / WCHAN表示目前进程是否还在运行
TTY:登录着使用的终端
TIME:CPU使用的时间
CMD:commend命令
ps aux 查看系统所有进程
USER:该进程所属用户账号
PID:该进程的id
%CPU:进程使用的cpu资源百分比
%MEM:进程使用的内存百分比
VSZ:进程使用的虚拟内存容量(KB)
RSS:进程使用的固定内存容量(KB)
TTY:进程在哪个终端运行
STAT:进程状态跟S一样
START:进程被触发的时间
TIME:进程实际使用cpu的时间
COMMEND:进程的实际命令
僵尸进程无法管理,而直接交给systemd这个进程负责,它所有进程的父进程。如果产生僵尸进程,而系统过一阵子也没办法通过内核特殊化处理来将其删除时,只能reboot
top:动态查看进程的变化
top [-d 数字] | top [-p]
-d 多少秒更新一次,默认是5秒
-p 指定特定的进程,不然显示全部进程
top默认使用cpu使用率%CPU来排序,如果想要使用内存使用率来排序,则可以按下M,若想要恢复按P,如果退出top按q即可
top显示进程详情后,按r给指定pid的进程设置NI即nice值
linux查看系统负荷
load average代表1分钟,5分钟,15分钟内系统的平均负荷。
单核cpu:
单核cpu每分钟处理100个进程,系统负荷0.2,意味着cpu一分钟处理20个线程,系统负荷1.0代表正好处理完成,系统负荷1.7意味着cpu正在处理的100个进程外,还有70个进程正排队等待着。
多核cpu:
单核cpu系统负荷为1.0时,饱和;多核cpu系统为n * 1.0时饱和。
cat /proc/cpuinfo 命令查看cpu信息
最佳观察时长为15分钟的平均负荷,1分钟的平均负荷只是暂时现象不足以说明问题。
pstree [-A |U] [-up] 显示进程之间的关联关系
-A 各进程树之间以ASCII字符来连接
-U 各进程树之间以Unicode字符来连接
-u 列出进程所属的用户
-p 列出进程的pid
进程之间可以相互控制。通过给予进程一个信号(signal)去告知进程做什么
kill -l 或者 man 7 signal 来查看信号
1 SIGNUP 启动被终止的进程,可以让PID重新读取自己的配置文件,类似重新启动
2 SIGINT 相当于用键盘输入ctrl -c 来中断一个进程的运行
9 SIGKILL 强制中断一个进程的运行,如果进程执行到一半,那么尚未完成的部分可能会有半成品产生
15 SIGTERM 以正常的方式结束进程
19 SIGSTOP 相当于键盘输入ctrl-z 来暂停一个进程的运行
kill或者killall来发送一个信号给某个进程
kill -signal PID
kill 可以帮我们将这个信号传送给某个任务(%jobnumber)或是某个PID,kill后面直接加输入和加上%number的情况是不同的
killall -singal 命令名称(kill通常要配合ps或者pstree来找到对应的进程PID,而killall则可以通过命令名称来给予信号)
Priority与 Nice值决定了进程的优先级
PRI值越低表示越优先,不过PRI值由内核动态调整,用户无法直接调整。
PRI(新) = PRI(old) + nice
所以可以通过设置NI的值来调整
nice值可调范围为-20~19
root可以随意调整自己或者他人进程的nice值,且范围为-20~19
一般用户仅可以调整自己进程的nice值,且范围为0~19(避免一般用户抢占系统资源)
调整nice值的两种方式:
1.一开始执行进程就立刻给予一个特定的nice值:用nice命令
nice [-n 数字] commend
nice -n 5 vim &
ps -l
kill -9 %1
2. 调整某个已经存在的PID的nice值:用renice命令
renice [number] PID
3.top命令,按r来调整进程的nice值
free[-b|-k|-m|-g|-h] [-t] [-s N - c N] 查看内存使用情况
-b:直接free显示的是KBytes,Bytes
对应的k,m,g代表KBytes,MBytes,GBytes
-h人性化的显示
-s 让系统不断刷新, N多少秒刷新一次
-c free列出N次
uname:查看系统与内核相关信息
uname [-ar]
-a:所有系统相关信息
-r:内核版本
uptime:查看系统启动时间与任务负载
uptime输入top命令的最上面一行
netstat:追踪网络或socket文件
netstat -[atunlp]
-a:将目前系统上所有的连接,监听,socket信息都列出来
-t:列出tcp网络封包的信息
-u:列出udp网络封包的信息
-n:不以进程的服务名称,以端口号(port number)显示
-p:列出该网络服务的pid
netstat可以列出两个部分:网络连接以及linux的socket进程
通常查看网络连接:netstat -tulnp
dmesg:分析内核产生的信息
系统启动时,内核回去检测系统的硬件,你的某些硬件到底有没有被识别,就跟这个检测有关
显示的信息比较多,通常可以配合 |more 管道命令使用
vmstat:检测系统资源变化
vmstat可以检测[cpu/内存/磁盘/io状态]等
vmstat [延迟(秒) 总计检测次数] vmstat 3 5 总共检测5次,每次延迟3秒
进程字段的项目分别为:
r:等待运行中的进程数量
b:不可被唤醒的进程数量
这两项越多,代表系统越忙碌
内存字段项目分别为:
swpd:虚拟内存被使用的容量
free:未被使用的内存容量
buff:用于缓冲存储器
cache:用于高速缓存
内存交换分区(swap)的项目分别为:
si:由磁盘中将进程取出的容量
so:由于内存不足而将没用到的进程写入到磁盘的swap的容量
如果si和so数值太大,表示内存中的数据常常在磁盘与内存之间传输,系统性能比较差
磁盘读写(io)的项目分别为:
bi:由磁盘读入的区块数量
bo:写入到磁盘中的区块数量
这部分数值越高,代表系统的I/O越忙碌
系统的项目分别为:
in:每秒被中断的进程次数
cs:每秒执行的事件切换次数
这两个数值越大,代表系统与外接设备的沟通越频繁。这些接口设备包括磁盘,网卡等
CPU的项目分别为:
us:非内核的cpu使用状态
sy:内核层所使用的cpu状态
id:闲置的状态
wa:等待I/O所耗费的CPU状态
st:被虚拟机所使用的CPU状态
系统上所有的磁盘的读写状态
vmstat -d
SUID权限仅针对二进制程序有效。
执行者对程序需要具有x的可执行权限。
SUID权限仅在程序执行过程中有效
执行者将具有该程序拥有者的权限
进程都是在内存中,而内存中的数据又都是写到/proc/*这个目录下的,所以我们可以直接查看/proc这个目录中的文件,目前主机上的个进程的PID都是以目录的形式存在于/proc当中,
比如第一个程序systemd的PID是1,这个PID的所有相关信息都写入/proc/1/*中
/proc/cmdline 加载内核时执行的相关命令与参数
/proc/cpuinfo cpu的相关信息
/proc/devices 系统主要设备的设备号
/proc/ioports 各个设备配置的I/O地址
/proc/meminfo 内存信息,使用free也能看到
fuser:借由文件(或文件系统)找出正在使用该文件的进程(文件找进程)
fuser [-umv] file/dir
-u 除了进程PID外,还会列出该进程的拥有者
-m:后面接的文件名会主动提到该文件系统的最顶层
-v:可以列出每个文件与进程还有命令的完整相关性
lsof:列出被进程所使用的文件名称
lsof [-auU] [+d]
-a:多项数据需要[同时成立]采显示出结果
-u:后面跟username,列出该使用者相关进程所使用的文件
-U:仅列出Unix-like系统的socket文件类型
lsof -u root | grep bash
查看某些进程是否在使用某些文件 (进程找文件)
pidof:找出某个正在执行的进程的PID
pidof systemd rsyslogd 找出systemd跟rsyslogd两个进程的PID
服务(service):内存中的进程且可以提供一些系统或网络功能。
守护神(daemon):完成service的程序
服务的启动,关闭与查看等方式
所有的服务启动脚本放置在/etc/init.d目录
启动:/etc/init.d/daemon start
关闭:/etc/init.d/daemon stop
重启:/etc/init.d/daemon restart
查看状态:/etc/init.d/daemon status
服务启动的分类:
1.独立启动模式:服务独立启动,常驻内存中,反应速度快
2.超级守护进程:由特殊的xinetd或inetd两个总管程序提供socket对应或端口对应的管理
运行级别:0~6 init n
1.单人维护模式。3.纯命令模式。5.图形界面模式
制定运行级别默认要启动的服务
默认要启动:chkconfig daemon on
默认不启动:chkconfig daemon off
查看默认为启动与否 chkconfig --list daemon
运行级别的切换操作
init 数字
system v需要service,chkconfig,setup,init等命令来协同,systemd只有一个systemctl命令而已
service对系统的服务进程管理
service daemon start
service daemon stop
service daemon restart
service daemon status
chkconfig:提供了一个维护/etc/rc[0~6]d文件夹的命令行工具,减轻了系统直接管理这些文件夹的符号链接的负担
chkconfig [--add] [--del] [--list] 系统服务 或 chkconfig [ --level <登录代表>][系统服务][on/off]
--add添加服务
--del删除服务
--list列出所有服务
on开启服务
off 关闭服务
systemctl [command] [unit]
command:
start:启动 stop:关闭 restart:重启 reload:重新加载配置文件 enable:开机自启 disable 关闭开机自启
status:查看状态
systemctl status atd 或者systemctl status atd.service
服务状态:dead,active(running):正有1个或者多个进程在系统中运行,active(exited)仅执行一次就正常结束服务,active(waiting):正在运行中,不过需要等待其他事件发生才能继续执行。
目前的状态:enable:开机自启,disable:开机不自启,static,不可以自启动,但是可以被其他服务唤醒,mask无论如何都不能被启动
systemctl [command] [--type=TYPE] [--all]
command:
列出系统上有启动的unit:
list-units:依据unit显示目前所有启动的unit,加上--all才会显示没启动的
列出系统上已安装的unit:
list-unit-files:依据/usr/lib/systemd/system内的文件,将所有文件列表说明
--type=TYPE:就是之前提高的unit类型,主要有service,socket,target等。
systemctl list-units --type=target --all 查看跟操作界面有关的target
centos默认有26个target unit
graphical.target:图形界面
multi-user:纯命令行模式
emergency.target:紧急处理系统的错误
shutdown.target 关机模式
systemctl get-default 查看默认操作模式
systemctl set-default multi-user.target 默认模式转为命令行模式
在不重新启动的情况下,将操作环境改为纯命令模式,关闭图形界面:
systemctl isolate multi-user.target
取得图形界面:
systemctl isolate graphical.target
正常的切换情况下,使用上述isolate的方式即可,不过也有几个简单的命令来切换模式:
systemctl poweroff 系统关机
systemctl reboot 重新开机
systemctl suspend 挂起模式:将系统的状态保存到内存中,唤醒速度快
systemctl hibernate 休眠模式:将系统的状态保存到磁盘上,唤醒速度慢
systemctl rescue 恢复模式
systemctl emergency 紧急恢复模式
systemctl list-dependencies [unit] [--reverse]
--reverse 反向追踪谁使用了该unit
systemd启动脚本配置文件在/usr/lib/systemd/system
/run/systemd/system 系统执行过程中产生的服务脚本,比/usr/lib/systemd/system的优先级高
/etc/systemd/system管理员依据主机系统的需求所建立的执行脚本,执行优先级比/run/systemd/system
/etc/sysconfig/* 几乎所有的服务都会将初始化的一些选项设置写入到该目录
/var/lib/ 产生数据的服务都会将它的数据写入到该目录
/run/ 放置了好多daemon的缓存,包括lock文件以及PID文件等。
systemd里面有很多的本机会用到的socket服务,这些服务可能会产生很多socket文件,怎么知道socket文件放置在哪里?
systemctl list-sockets
让服务与端口对应在一起:/etc/services
cat /etc/services 查看
第一列为daemon的名称 第二行为daemon使用的端口号与网络数据封包协议,主要有可靠连接的tcp封包和无连接的upd封包
产生一个网络监听端口的进程,就可以成为网络服务。
netstat -tunlp 查看网络端口
systemctl list-units ---all | grep xxxdaemon
systemctl stop xxxxx.service
systemctl stop xxxxx.target
systemctl disable xxxx.service xxxxx.target
netstat -tunlp 查看网络端口
建立系统服务,就得到/etc/init.d/下面建立相对应的bash脚本完成
systemd的环境下面设置相关的服务启动环境,如果设置
cat /usr/lib/systemd/system/sshd.service 默认配置文件位置
cat /etc/systemd/system/sshd.service 管理员修改配置文件位置
配置文件可以分为三大部分:
unit:unit本身说明,以及启动此unit的条件
[Service],[Socket],[Timer],[Mount],[Path]:不同的unit类型就要使用对应的设置项目
[install]:这个项目就是将此unit安装到那个target里面去的意思
linux常见的日志文件文件名
/var/log/boot.log:开机启动的时候系统内核会去检测与启动硬件,接下来启动内核支持的功能等。
/var/log/cron crontab任务执行情况
/var/log/dmesg 开机时内核检测过程所产生的各项信息
/var/log/lastlog 最后一次登录的有关信息
/var/log/mail* 记录邮件的往来信息
/var/log/messages 记录系统发生的错误信息
/var/log/secure 所有需要输入账号密码的软件,登录信息都会记录在此
/var/log/wtmp,/var/log/faillog 正确登录系统的账户信息,错误登录系统的账户信息
时间发生的日期与时间
发生此事件的主机名
启动此事件的服务名称(systemd,crond等)或命令与函数名称(如su,login...)
该信息的实际内容
ps aux | grep rsyslog
systemcl status rsyslog.service
开放源码:程序代码,写给人类看的程序语言
编译程序:将源码编译成机器能看得懂的语言
可执行文件:经过编译变成二进制程序后机器看得懂可以执行的文件
类似子程序的角色,可以被调用来执行的一段功能函数
一套软件不仅仅有一个程序,而是一对程序代码文件,所以除了每个主程序和子程序均需要编译过程的命令外,还需要写上最终的链接程序。使用make命令,可以简化编译过程。
(1)执行make时,会在当前目录查找Makefile文件,该文件记录了如何编译源码
(2)Makefile由检测程序创建,软件开发商都会写一个检测程序检测用户的当前环境,并创建Makefile文件。这个检测程序一般为configure或config
源码体积较大,一般使用gzip等压缩得到的压缩后的源码包就是tarball。tarball一般包括以下文件:(1)源代码文件。(2)检测程序文件。(3)本软件的安装说明。
(1)直接以源码通过编译来安装升级
(2)直接以编译好的二进制程序来安装和升级
编辑源码
#include
int main(void)
{
printf("Hello World\n");
}
编译与执行
[root@localhost ~]# gcc hello.c
[root@localhost ~]# ll hello.c a.out
-rwxr-xr-x. 1 root root 8503 9月 7 14:11 a.out
-rw-r--r--. 1 root root 63 9月 7 14:10 hello.c
[root@localhost ~]# ./a.out
Hello World
[root@localhost ~]# vim thanks.c
#include
int main(void)
{
printf("hello world \n");
thanks_2();
}
[root@localhost ~]# vim thanks_2.c
#include
void thanks_2(void)
{
printf("Thank you \n");
}
[root@localhost ~]# gcc -c thanks.c thanks_2.c
[root@localhost ~]# ll thanks*
-rw-r--r--. 1 root root 67 9月 7 14:26 thanks_2.c
-rw-r--r--. 1 root root 1496 9月 7 14:27 thanks_2.o
-rw-r--r--. 1 root root 77 9月 7 14:25 thanks.c
-rw-r--r--. 1 root root 1560 9月 7 14:27 thanks.o
[root@localhost ~]# gcc -o thanks thanks.o thanks_2.o
[root@localhost ~]# ./thanks
hello world
Thank you
[root@localhost ~]# vim sin.c
#include
int main(void)
{
float value;
value = sin(3.14/2);
printf("%f\n",value);
}
[root@localhost ~]# gcc sin.c -lm -L/lib -L/usr/lib
-l:是加入某个函数库的意思
m:则是libm.so这个函数库,lib和后缀.so不需要写
如果需要手动制定头文件(如stdio.h)的位置,可以加入”-I/usr/include“这样的指令,/usr/inlcude便是所制定的头文件存放路径
注:在我的centos7计算机上,直接使用gcc -sin.c可以编译通过,只是会报出不兼容的警告。在程序内加入#include
[root@localhost ~]# gcc sin.c -lm -L/lib -L/usr/lib
sin.c: 在函数‘main’中:
sin.c:5:10: 警告:隐式声明与内建函数‘sin’不兼容 [默认启用]
value = sin(3.14/2);
假设有以下四个文件:
main.c
#include
#define pi 3.14159
char name[15];
float angle;
int main(void)
{
printf ("\n\nPlease input your name: ");
scanf ("%s", &name );
printf ("\nPlease enter the degree angle (ex> 90): " );
scanf ("%f", &angle );
haha( name );
sin_value( angle );
cos_value( angle );
}
haha.c
#include
int haha(char name[15])
{
printf ("\n\nHi, Dear %s, nice to meet you.", name);
}
cos_value.c
#include
#include
#define pi 3.14159
float angle;
void cos_value(void)
{
float value;
value = cos ( angle / 180. * pi );
printf ("The Cos is: %5.2f\n",value);
}
sin_value.c
#include
#include
#define pi 3.14159
float angle;
void sin_value(void)
{
float value;
value = sin ( angle / 180. * pi );
printf ("\nThe Sin is: %5.2f\n",value);
}
那么整个编译执行过程如下:
[root@localhost c]# gcc -c main.c
[root@localhost c]# gcc -c haha.c
[root@localhost c]# gcc -c sin_value.c
[root@localhost c]# gcc -c cos_value.c
[root@localhost c]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# ./main
Please input your name: wuchao
Please enter the degree angle (ex> 90): 30
Hi, Dear wuchao, nice to meet you.
The Sin is: 0.50
The Cos is: 0.87
[root@localhost c]#
以上编译过程相当麻烦
以下使用make的方式编译
使用make指令编译前,需要创建一个Makefile文件
Makefile文件内容如下: main:main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# vim Makefile
main:main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
#注意,gcc前面是tab键
[root@localhost c]# rm -f main*.o
[root@localhost c]# make
cc -c -o main.o main.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# ./main
Please input your name: wuchao
Please enter the degree angle (ex> 90): 45
Hi, Dear wuchao, nice to meet you.
The Sin is: 0.71
The Cos is: 0.71
当我们修改过源码以后,再执行make时,只会编译那些修改过的源码文件
[root@localhost c]# make
make: “main”是最新的。
makefile文件格式如下:
目标:目标文件1 目标文件2
gcc -o 欲新建的可执行文件 目标文件1 目标文件2
目标就是我们想要建立的信息,而目标文件就是具有相关性的object files,建立可执行的文件的语法就是
如果想要在makefile内执行多个操作,比如执行一个命令后立即清除目标文件和可执行文件,则如下:
main:main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
以上代码包含两个目标main和clean,如果想要清除目标文件,可以执行”make clean“。如果想先清除再编译可执行”make clean main“。
[root@localhost c]# make clean main
rm -f main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]#
使用变量来简化makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
变量的基本语法:
1. 变量与变量内容以”:“隔开,两边可以有空格
2. 变量左边不可以有
3. 变量与变量内容两边不能有”:“
4. 变量名最好使用大写
5. 运用变量时用或或()
6. 在该shell的环境变量是可以被套用的
7. 在命令行模式也可以定义变量
gcc在编译时会主动去读取CFLAGS这个环境变量,因此可以在命令行定义这个变量
[root@localhost c]# CFLAGS="-Wall" make clean main
也可以如下:
CFLAGS = -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
由于环境变量既可以在命令行输入,也可以在Makefile文件内指定,所以需要确定使用规则:
1. make命令行后面加的环境变量第一优先
2. makefile里面指定的环境变量第二优先
3. shell原本具有的环境变量第三优先
$@:代表当前的目标
每个makefile里面都有一个或多个目标名(如上面的main,clean),在每个目标下的指令中使用$@表示获取当前的目标名
CFLAGS = -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
静态函数库
动态函数库
通过文件配置可以将特定的动态函数库加载到内存中,以提高读取性能。
1. 首先,在/etc/ld.so.conf下写入需要的动态函数库所在的目录
2. 利用ldconfig将/etc/ld.so.conf的数据读入缓存
3. 同时也将数据记录一份在/etc/ld.so.cache中
编辑配置文件/etc/ld.so.conf
[root@localhost c]# vim /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/lib/mysql #新添加的
读入缓存
[root@localhost c]# ldconfig
查看二进制文件使用了哪些动态函数库
[root@localhost c]# ldd /usr/bin/passwd
linux-vdso.so.1 => (0x00007ffc3b1b8000)
libuser.so.1 => /lib64/libuser.so.1 (0x00007f48e7a48000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f48e77f8000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f48e74c0000)
libpopt.so.0 => /lib64/libpopt.so.0 (0x00007f48e72b0000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007f48e70a0000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f48e6e98000)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f48e6c70000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f48e6a48000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f48e6828000)
libc.so.6 => /lib64/libc.so.6 (0x00007f48e6460000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f48e6258000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f48e6020000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007f48e5e18000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f48e5c10000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f48e59a8000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f48e5780000)
/lib64/ld-linux-x86-64.so.2 (0x00007f48e7e88000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f48e5578000)
使用md5sum或sha1sum可以查看软件的MD5或SHA1编码
[root@localhost c]# md5sum main
e6adaa0b35ee4daa1cd7e43916e2d693 main
[root@localhost c]# sha1sum main
7735cf8f7ed60ccbad3dcf94fb52be0abe26817b main
Linux最常见的两种安装方式:
dpkg:代表ubuntu
RPM:centos
dpkg,rpm安装软件都或多或少存在软件属性依赖问题,即安装软件A前需要先安装软件B和软件C,为了解决软件属性依赖问题,linux开发商提供了[在线升级]功能,只要有网络,就能够获取开发商提供的任何软件了。
发行版代表 | 软件管理机制 | 使用命令 | 在线升级功能(命令) |
centos | RPM | rpm,rpmbuild | YUM(yum) |
ubuntu | DPKG | dpkg | APT(apt-get) |
一. RPM
RPM 全名是『 RedHat Package Manager 』简称则为 RPM !
xxxxxxxxx.rpm <==RPM 的格式,已经经过编译且包装完成的 rpm 文件;
xxxxx.src.rpm <==SRPM的格式,包含未编译的原始码信息。
那么我们怎么知道这个套件的版本、适用的平台、打包的次数呢?呵呵!只要透过档名就可以知道了!例如 rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:
rp-pppoe - 3.1 - 5 . i386 .rpm
套件名称 套件的版本信息 释出的次数 适合的硬件平台 附文件名
套件名称:
当然就是每一个套件的名称了!上面的范例就是 rp-pppoe 。
版本信息:
每一次更新版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本,以上面为例,主版本为 3 ,在主版本的架构下更动部分原始码内容,而释出一个新的版本,就是次版本啦!以上面为例,就是 1 啰!
释出版本次数:
也就是编译的次数啦!那么为何需要重复的编译呢?这是由于同一版的套件中,可能由于有某些 bug 或者是安全上的顾虑,所以必须要重新设定当初打包时候的设定参数,设定完成之后重新编译并打包成 RPM 档案!因此就有不同的打包数出现了!
操作硬件平台:
由于 RPM 可以适用在不同的操作平台上,但是由于不同的平台设定的参数还是有所差异性!并且,我们可以针对比较高阶的 CPU 来进行最佳化参数的设定,所以就有所谓的 i386, i586, i686 与 noarch 等的文件名称出现了!
1. RPM 安装( install )
[root@test root]# rpm -ivh rp-pppoe-3.1-5.i386.rpm
Preparing... ####################################### [100%]
1:rp-pppoe ####################################### [100%]
# -i :install 的意思
# -v :察看更细部的安装信息画面
# -h :以安装信息列显示安装进度,例如上面的 # 字符号!
# 如果要安装两个以上的套件时,可以这样:
[root@test root]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 后面可以接多个套件!
2. RPM 升级与更新
使用 RPM 来升级真是太简单!就以 -Uvh 或 -Fvh 来升级即可( 注:vh 的功能仍是在于显示细部信息与安装进度而已 )!
-Uvh 后面接的套件即使没有安装过,则系统将予以直接安装;
若后面接的套件有安装过旧版,则系统自动更新至新版;
-Fvh 如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;
亦即只有安装至您 Linux 系统内的套件会被『升级』
3. RPM 查询
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm 这个目录下的数据库文件啦!另外, RPM 也可以查询文件内的信息喔!那如何去查询呢?我们底下以简单的范例来说明:
-q 套件 单纯的查询该套件的版本与是否存在而已,例如:
rpm -q logrotate
-ql 套件 列出该套件的所有相关目录与文件!例如:
rpm -ql logrotate
-qi 套件 列出该套件的 information (信息),里面的信息可多,包括了套件名称、版本、等等!
-qf 文件 这个参数后面接的可是『文件』!这个功能在查询系统的某个文件属于哪一个套件所有的。
举例来说,如果想要知道 /etc/logrotate.conf 是那个套件所提供的,可以这样:
rpm -qf /etc/logrotate.conf
-qc 套件 查询该套件的设定文件放置的完整目录名称,例如:
rpm -qc logrotate
-qd 套件 查询该套件的文件说明数据文件放置的完整路径名称,例如:
rpm -qd logrotate
-qR 套件 列出该套件需要预先安装的文件,亦即有属性相依套件的文件!例如:
rpm -qR logrotate
-qa 后面什么都不必加入,直接输入 rpm -qa 即可得知目前 Linux 系统上面共以 RPM 的方式安装了多少的套件!
-qp[licdR] 文件 上面提到的都与系统的 /var/lib/rpm 内的数据库有关,而这里提到的则是与 RPM 档案本身有关。
举例来说,如果我下载了一个档名为 pkgname.i386.rpm 的文件,我想要知道他里面主要的讯息,则:
rpm -qpi pkgname.i386.rpm
想要知道与他有关的套件,则:
rpm -qpR pkgname.i386.rpm
4. RPM 卸载与重建数据库
要注意的是,『卸载的过程一定要由最上层往下』,以 rp-pppoe 为例,这一个套件主要是依据 ppp 这个套件来安装的,所以当您要删除 ppp 的时候,就必须要先删除 rp-pppoe 才行!否则就会发生结构上的问题啦!
那么重建数据库呢?由于我们会一直在修改一些文件内容,例如 /etc/xinetd.d 里头的参数文件,加上可能自系统操作的过程中新增、移除等等的动作,导致系统的数据库有点乱,这个时候可以使用 --rebuilddb 来重建一下 rpm 的数据库!这两个方法的参数如下啰:
[root@test root]# rpm -e logrotate <==解安装 logrotate 套件
[root@test root]# rpm --rebuilddb <==重建数据库
二. SRPM
是 Source RPM 的意思,也就是这个 RPM 文件里面含有原始码( Source Code )!
1. 利用系统默认值安装 SRPM 文件
假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的原始码与相关的设定值,那么我可以直接编译并安装吗?当然可以!利用rpmbuild 配合参数即可。参数主要有底下两个:
--rebuild 这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,
但是产生的 RPM 文件并没有安装到系统上。
当您使用 --rebuild 的时候,最后通常会发现一行字体:Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 文件!那么这个文件就可以用来安装啦!安装的时候请加绝对路径来安装即可!
--recompile 这个动作会直接的『编译』『打包』并且『安装』!
请注意,recompile 不但进行编译跟打包,还同时进行『安装』了!
2. SRPM 使用的路径与需要的套件
SRPM 既然含有 source code ,那么其中必定有设置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候,会使用到哪些目录呢?这样一来才能够来修改嘛!你可以到你的 /usr/src 这个目录里面去查看一下:
/usr/src/redhat/SPEC
这个目录当中放置的是该套件的设置文件,例如这个套件的信息参数、设定项目等等都放置在这里;
/usr/src/redhat/SOURCE
这个目录当中放置的是该套件的原始档(*.tar.gz的文件)以及 config 这个设定档;
/usr/src/redhat/BUILD
在编译的过程中,有些暂存的数据都会放置在这个目录当中;
/usr/src/redhat/RPMS
经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。
此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误文件,您可以根据该错误文件进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的文件都会被杀掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的文件了!
3. SRPM 的编译指令
修改完成了,自然就是要将他编译成可以安装的RPM文件啦!这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:
[root@test SPECS]# rpmbuild -bb rp-pppoe.spec <==编译成RPM 文件
[root@test SPECS]# rpmbuild -ba rp-pppoe.spec <==打包成SRPM 文件
yum命令是在Fedora和RedHat以及SUSE中基于RPM的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
语法
yum(选项)(参数)
选项
-h:显示帮助信息;
-y:对所有的提问都回答“yes”;
-c:指定配置文件;
-q:安静模式;
-v:详细模式;
-d:设置调试等级(0-10);
-e:设置错误等级(0-10);
-R:设置yum处理一个命令的最大等待时间;
-C:完全从缓存中运行,而不去下载或者更新任何头文件。
参数
install:安装rpm软件包;
update:更新rpm软件包;
check-update:检查是否有可用的更新rpm软件包;
remove:删除指定的rpm软件包;
list:显示软件包的信息;
search:检查软件包的信息;
info:显示指定的rpm软件包的描述信息和概要信息;
clean:清理yum过期的缓存;
shell:进入yum的shell提示符;
resolvedep:显示rpm软件包的依赖关系;
localinstall:安装本地的rpm软件包;
localupdate:显示本地rpm软件包进行更新;
deplist:显示rpm软件包的所有依赖关系。
实例
安装
yum install #全部安装
yum install package1 #安装指定的安装包package1
yum groupinsall group1 #安装程序组group1
更新和升级
yum update #全部更新
yum update package1 #更新指定程序包package1
yum check-update #检查可更新的程序
yum upgrade package1 #升级指定程序包package1
yum groupupdate group1 #升级程序组group1
查找和显示
yum info package1 #显示安装包信息package1
yum list #显示所有已经安装和可以安装的程序包
yum list package1 #显示指定程序包安装情况package1
yum groupinfo group1 #显示程序组group1信息
yum search string 根据关键字string查找安装包
删除程序
yum remove | erase package1 #删除程序包package1
yum groupremove group1 #删除程序组group1
yum deplist package1 #查看程序package1依赖情况
清除缓存
yum clean packages #清除缓存目录下的软件包
yum clean headers #清除缓存目录下的 headers
yum clean oldheaders #清除缓存目录下旧的 headers
1、简介
dpkg - package manager for Debian (debian系统的包管理工具)。
dpkg is a tool to install, build, remove and manage Debian packages,dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。
dpkg这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息,实在非常不错。只要派生于Debian的其它Linux distributions大多使用dpkg这个机制来管理,包括B2D,Ubuntu等。
2、deb软件包名规则
格式为:Package_Version-Build_Architecture.deb
如:nano_1.3.10-2_i386.deb
* 软件包名称(Package Name): nano
* 版本(Version Number):1.3.10
* 修订号(Build Number):2
* 平台(Architecture):i386
3、dpkg软件包相关文件介绍
/etc/dpkg/dpkg.cfg dpkg包管理软件的配置文件【Configuration file with default options】
/var/log/dpkg.log dpkg包管理软件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】
/var/lib/dpkg/available 存放系统所有安装过的软件包信息【List of available packages.】
/var/lib/dpkg/status 存放系统现在所有安装软件的状态信息
/var/lib/dpkg/info 记安装软件包控制目录的控制信息文件
4、dpkg数据库
dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单, 依赖关系, 软件状态, 等等详细的内容,通常在 /var/lib/dpkg 目录下。 通常在 status 文件中存储软件状态和控制信息。 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码。
例:查询dpkg数据库(显示所有已安装的Deb包)。
lzb@lzb:~$ dpkg -l
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称 版本 体系结构: 描述
+++-==============-============-============-=================================
ii a11y-profile-m 0.1.10-0ubun amd64 Accessibility Profile Manager - U
ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
ii accountsservic 0.6.40-2ubun amd64 query and manipulate user account
ii acl 2.2.52-3 amd64 Access control list utilities
ii acpi-support 0.142 amd64 scripts for handling many ACPI ev
ii acpid 1:2.0.26-1ub amd64 Advanced Configuration and Power
ii activity-log-m 0.9.7-0ubunt amd64 blacklist configuration user inte
ii adduser 3.113+nmu3ub all add and remove users and groups
ii adium-theme-ub 0.3.4-0ubunt all Adium message style for Ubuntu
ii gir1.2-pango-1 1.38.1-1 amd64 ..............................
..............................................................................
如上图,每条记录对应一个软件包,注意每条记录的第一、二、三个字符,这就是软件包的状态标识,后边依此是软件包名称、版本号和简单描述。
1)第一字符为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:
u Unknown状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
i Install用户请求安装软件包.
r Remove用户请求卸载软件包.
p Purge用户请求清除软件包.
h Hold用户请求保持软件包版本锁定.
2)第二列,是软件包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)
n Not软件包未安装.
i Inst软件包安装并完成配置.
c Conf-files软件包以前安装过,现在删除了,但是它的配置文件还留在系统中.
u Unpacked软件包被解包,但还未配置.
f halF-conf试图配置软件包,但是失败了.
h Half-inst软件包安装,但是但是没有成功.
w trig-aWait触发器等待
t Trig-pend触发器未决
3)第三列标识错误状态,第一种状态标识没有问题,为空. 其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))
h 软件包被强制保持,因为有其它软件包依赖需求,无法升级.
r Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除).
x 软包件被破坏,并且被强制保持.
案例说明:
ii —— 表示系统正常安装了该软件
pn —— 表示安装了该软件,后来又清除了
un —— 表示从未安装过该软件
iu —— 表示安装了该软件,但是未配置
rc —— 该软件已被删除,但配置文件仍在
5、dpkg子命令
为了方便用户使用,dpkg不仅提供了大量的参数选项, 同时也提供了许多子命令。
比如:
dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon
这里将不会对dpkg的命令作详细说明,如需了解可自行查阅资料。
1、安装
1)安装相关命令
dpkg -i package-name.deb // --install, 安装软件包,必须是deb包的完整名称。(软件的安装可被拆分为两个对立的过程“解包”和“配置”)
dpkg --unpack package-name.deb // “解包”:解开软件包到系统目录但不配置,如果和-R一起使用,参数可以是一个目录
dpkg --configure package-name.deb //“配置”:配置软件包
dpkg -c package-name.deb //列出 deb 包的内容
2)安装相关选项
-R, --recursive Recursively handle all regular files matching pattern *.deb found at specified directories and all of its
subdirectories. This can be used with -i, -A, --install, --unpack and --avail actions(递归地指向特定目录的所有安装包,可以结合-i,
-A, --install, --unpack 与 --avail一起使用)
2、移除软件包
dpkg -r package-name // --remove, 移除软件包,但保留其配置文件
dpkg -P package-name // --purge, 清除软件包的所有文件(removes everything, including conffiles)
3、查询
dpkg -l package-name // --list 查看系统中package-name软件包
dpkg -L package-name //--listfiles 查看package-name对应的软件包安装的文件及目录
dpkg -s package-name //--status 查看package-name对应的软件包信息
dpkg -S filename // --search 查询系统中某个文件属于哪个软件包
dpkg --info package-name.deb //--列出软件包解包后的包名称
例1:列出系统上安装的与dpkg相关的软件包
dpkg -l \*dpkg*
更多dpkg的使用方法可在命令行里使用man dpkg来查阅 或直接使用dpkg --help。
1、apt简介
虽然我们在使用dpkg时,已经解决掉了 软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题,linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg已存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。
2、工作原理
Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源。
然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。
例1:apt-get的更新过程
1)执行apt-get update
2)程序分析/etc/apt/sources.list
3)自动连网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则下载之,存入/var/lib/apt/lists/目录
4)然后 apt-get install 相应的包 ,下载并安装。
即使这样,软件源配置文件只是告知Ubuntu系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。
用户可以使用“apt-get update”命令刷新软件源,建立更新软件包列表。在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。
例2:apt-get install原理图
3、apt相关文件
var/lib/dpkg/available 文件的内容是软件包的描述信息, 该软件包括当前系统所使用的Debian 安装源中的所有软件包,其中包括当前系统中已安装的
和未安装的软件包.
/etc/apt/sources.list 记录软件源的地址(当你执行 sudo apt-get install xxx 时,Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives 已经下载到的软件包都放在这里(用 apt-get install 安装软件时,软件包的临时存放路径)
/var/lib/apt/lists 使用apt-get update命令会从/etc/apt/sources.list中下载软件列表,并保存到该目录。
4、源文件
apt的源文件由配置文件/etc/apt/sources.list指定,想要具体了解请访问上一篇博客:
https://www.cnblogs.com/liuzhenbo/p/11069285.html
1、apt-get
apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(1), aptitude(8), synaptic(8) and wajig(1).
apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。
用法: apt-get [选项] 命令
常用选项:
-h 本帮助文件。
-q 输出到日志 - 无进展指示
-qq 不输出信息,错误除外
-d 仅下载 - 不安装或解压归档文件
-s 不实际安装。模拟执行命令
-y 假定对所有的询问选是,不提示
-f 尝试修正系统依赖损坏处
-m 如果归档无法定位,尝试继续
-u 同时显示更新软件包的列表
-b 获取源码包后编译
-V 显示详细的版本号
-c=? 阅读此配置文件
-o=? 设置自定的配置选项,如 -o dir::cache=/tmp
常用命令:
//查询适合当前系统和CPU架构的相关软件包版本
http://manpages.ubuntu.com/manpages/xenial/man1/apt-show-versions.1p.html //查找官方网站
apt-cache madison package_name //将列出版本
apt-cache policy package_name //详细列出信息
//下载,安装
1)apt-get update 更新源
2)apt-get dist-upgrade 升级系统到相应的发行版(根据 source.list 的配置)
3)apt-get upgrade 更新所有已经安装的软件包
4)apt-get install package_name 安装软件包(加上 --reinstall重新安装)
apt-get install package_name=version 安装指定版本的软件包
5) apt-get -f install //安裝依賴
例子:
sudo dpkg -i bcloud-x.x.x.deb
sudo apt-get -f install
//删除,卸载
1)apt-get remove package_name //删除已安装的软件包(保留配置文件),不会删除依赖软件包,且保留配置文件。
2)apt-get --purge remove package_name //删除已安装包(不保留配置文件);如软件包a依赖软件包b,执行该命令会删除a,而且不保留配置文件。
3)
apt-get autoremove
//删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包),保留配置文件。
//清理缓存
1)apt-get autoclean //定期运行这个命令来清除那些已经卸载的软件包的.deb文件。APT的底层包是dpkg, 而dpkg 安装Package时, 会将 *.deb 放在 /var/cache/apt/archives/中,apt-get autoclean 只会删除 /var/cache/apt/archives/ 已经过期的deb。
2)apt-get clean //使用 apt-get clean 会将 /var/cache/apt/archives/ 的所有 deb 删掉
2、apt-cache
apt-cache是linux下的一个apt软件包管理工具。APT包管理的大多数信息查询功能都可以由apt-cache命令实现,通过apt-cache命令配合不同的子命令和参数的使用,可以实现查找,显示软件包信息及包依赖关系等功能.
1)apt-cache depends packagename 了解使用依赖
2)apt-cache rdepends packagename 是查看该包被哪些包依赖
3)apt-cache search packagename 搜索软件包,可以按关键字查找软件包,通常用于查询的关键字会使用软件包的名字或软件包的一部分
4)apt-cache show packagename 查询指定包的详情,不管是否已经安装。获取包的相关信息,如说明、大小、版本等
5)apt-cache showpkg packagename 显示软件包的大致信息