文章目录
- 磁盘
- 热键
- 知识点
- 基础命令
- 系统命令
- 文件命令
- cd(变换目录)
- pwd(显示目前所在目录)
- mkdir(建立新目录)
- rmdir(删除**空**目录)
- ls (文件与目录检视)
- cp(复制文件或目录)
- scp(远程拷贝)
- rm (移除文件或者目录)
- mv(移动文件与目录,更名)
- basename(取文件名)/dirname(取路径名)
- cat(输出文件内容)
- tac(与cat相反输出)
- head(打印前几行)
- tail(反向输出)
- more/less(输出内容)
- which(显示二进制或脚本全路径)
- whereis(找出二进制文件、源文件和man文档文件)
- whatis(列出给定命令(并非一定是命令)的man文档信息)
- locate(从库中查找)
- find(查找)
- 用户命令
- 其他命令
磁盘
扇区(sector):磁盘的最小物理储存单位,通常为512bytes与4Kbytes;
磁道(track):同一个同心圆的扇区组合成的圆;
磁柱(cylinder):所有磁盘盘上面的同一个磁道组成磁柱;
分区
通常所说的"硬盘分区"就是指修改磁盘分区表,它定义了"第n个磁盘块是从第x个柱面到第y个柱面(分区就是分磁柱)".因此,当系统要读取第n个磁盘块时,就是去读硬盘上第x个柱面到第y个柱面的信息。
两种分区表格式:
-
MSDOS(windos磁盘处理方式的dos)/MBR(Master Boot Record)
主要启动记录区(Master Boot Record):有446个字节,用于存放引导代码,可以安装开机管理程序的地方,即bootloader。
分区表(partition table):有64个字节,用于存放磁盘分区表.其中,每个分区的信息需要用16个字节来记录。因此,一个硬盘最多可以有4个分区,这4个分区称之为主分区和扩展分区(extended)。
结束标志:55AA占2字节,方便校验硬盘正确性,4位(bit)二进制可以表示一个16进制数字,2字节(byte)是16位,正好可以表示4个16进制数字 55AA = 0101 0101 1010 1010 网上对55aa的解释
稍微具体点的windows分区
标准4个分区示意图:
包含扩展分区(重新划分为逻辑分区)示意图:
-
GUID partition table ,GPT磁盘分区表,GPT分区已经没有延伸跟逻辑分区槽的概念,可以想象成全部是主分区;
LBA区块(预设512bytes):逻辑区块地址(Logical Block Address);
LBA0(MBR相容区块):这个兼容区块也分为两部分,一个是跟之前一样的446bytes相似的区块,储存了第一阶段的开机管理程序;而第二部分由原来的分区表记录换成了记录特殊标志的分区,用来表示此磁盘为GPT格式之意;
LBA1(GPT 表头记录):这个部分记录了分区表本身的位置与大小,同时记录了备份用的GPT分区(就是前面谈到的在最后的34个LBA区块)防止的位置,同时放置了分区表的检验机制码(CRC32),操作系统可以根据这个检验码来判断GPT是否正确,若有错误,还可以通过这个记录区来去的备份的GPT(最后的备份区块),来恢复GPT的正常运作;
LBA2-33(实际记录分区信息处):从LBA2区块开始,每个LBA都可以记录4个分区记录,所以默认可以记录4*32=128个分区记录;因为每个LBA有512bytes,所以每个记录用128bytes的空间,除了每个记录所需要的标识符与相关记录之外,GPT在每笔记录中分别提供了64bits来记载开始/结束扇区号码
格式化
每种操作系统所设定的文件属性/权限并不相同,为了存放这些文件所需的数据,需要将分区槽格式化,已成为操作系统能够利用的文件系统格式;
Inode:储存文件元信息的区域,并能通过inode找到具体文件数据存放区域block;
Block:由多个扇区组成的快;
Data block(数据块)
用来放置文件内容数据,支持的有1K,2K,4K;
Inode table(inode表格)
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
为了记录大型文件,每个block需要占inode中的4byte,如果400M的文件每个block4K则需要十万个block记录,这样一个inode的128byte就不够,于是就出现了12个直接,一个间接,一个双间接,一个三间接
Superblock(超级区块)
整个记录filesystem相关信息的地方
Block与inode的总量
未使用与已使用的inode/block数量
Block与inode的大小(bock为1,2,4k,inode为128或者256bytes)
Filesystem的挂在时间、最近一次写入的时间,最近一次校验磁盘时间等;
一般来说superblock的大小为1K
Filesystem Description(文件系统描述说明)
这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段分别介于哪一个block号码之间
block bitmap(区块对照表)
辅助用来判断哪些block是空;
Inode bitmap(inode对照表)
辅助判断哪些inode是空的;
Dumpe2fs:查询ext 家族superblock信息的指令
Xfs_info用来观察xfs文件系统
文件目录
文件系统格式化好了之后就可以创建目录或者文件,文件系统会分配一个inode与至少一个block
由于文件名等是在block中,所以只有inode中判断权限通过之后才能进入block操作;
挂载点
挂载:将文件系统与目录树结合的动作成为挂载;
挂载点:一定是目录,该目录为进入该文件系统的入口;
疑问:三个挂载点,/,/boot,/home,boot跟/是两个挂载点,但是boot又是在/下面,怎么理解?
解答:按照目录树结构,/所在的位置为最高父节点,也是一个文件系统的入口,针对该文件系统来说,/的inode为128(XFS filesystem最顶层目录一般128),然后其中有两个目录boot跟home分别对应另外两个文件系统的入口,/boot跟/home来说针对各自的文件系统的inode也为128;
所以其实如果找/boot目录,实际上是先进入/的文件系统中然后找到boot目录,然后进入boot的文件系统,实现从一个文件系统到另外一个文件系统的访问;
Df:查看磁盘容量情况 du:通常用来评估目录所占容量
常用df -hl:用来显示磁盘空间大小
free(显示内存使用情况)
free -h
热键
tab
- 按tab键的地方如果是命令后面,则是命令补全功能;
- 如果是文件后面,则是文件补全功能;
- 某些特殊指令下面,可能是参数或者选项补齐功能;
- 按两下tab会将以若干字符开头的命令或者文件都显示出来;
Ctrl-c
中断目前程序;
Ctrl-d
快速离开文字接口相当于exit;
知识点
重要的目录
/etc/issue : 欢迎讯息的内容
/usr/share/man/(usr/local/man):man page 显示的内容的文件
目录结构
环境变量
查看环境变量
[root@study tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
注意事项
- 一般命令在任何地方都能使用是因为命令都在环境变量中,因此从环境变量配置的路径中都能找到,因此命令都能使用;
- 假设把ls命令从/bin中移到/root中:
- 不能在任何地方直接使用ls命令;
- 因为ls命令确实存在,可以使用绝对路径或者相对路径来调用/root/ls或者在目录下./ls
- 将/root目录加到PATH中 ${PATH}:/root,这样就可以在任何地方调用ls
- 多个相同的指令,在PATH先找到哪个就执行哪个;
- 不同身份的使用者对应的PATH预设不同,默认能使用的指令也不同;
- “.”目录最好不要加入PATH中;
基础命令
系统命令
Locale(更改语种)
- 由于locale是用来显示影响显示结果的语系变量,并且需要在其他子程序执行使用,因此LC_ALL需要用export放到环境变量中,LANG直接赋值使用即可;
- locale把按照所涉及到的使用习惯的各个方面分成12个大类,这12个大类分别是:
- 语言符号及其分类(LC_CTYPE)
- 数字(LC_NUMERIC)
- 比较和习惯(LC_COLLATE)
- 时间显示格式(LC_TIME)
- 货币单位(LC_MONETARY)
- 信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
- 姓名书写方式(LC_NAME)
- 地址书写方式(LC_ADDRESS)
- 电话号码书写方式(LC_TELEPHONE)
- 度量衡表达方式 (LC_MEASUREMENT)
- 默认纸张尺寸大小(LC_PAPER)
- 对locale自身包含信息的概述(LC_IDENTIFICATION)。
- 设定locale就是设定12大类的locale分类属性,即 12个LC_。除了这12个变量可以设定以外,为了简便起见,还有两个变量: LC_ALL和LANG。它们之间有一个优先级的关系: LC_ALL>LC_>LANG,可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
当LANG设置了值之后,其他LC_*都没有值,但是用locale命令都会以LANG为默认值显示;
当LC_ALL设置了值之后,默认值都会以LC_ALL的这取代;
从上面可以看出,LANG是LC_*的默认值,而LC_ALL比LC_*的优先级别高,设置完LC_ALL之后,会强制重置LC_*各个值,如果不将LC_ALL重新设置为空,则再无法设置LC_*的单个值 。
Date(显示时间)
命令简介
date 根据给定格式显示日期或设置系统日期时间,指令所在路径:/bin/date
命令语法
date [OPTION]… [+FORMAT]
date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]]
参数 | 描述 |
---|---|
-d | 显示字符串描述的时间 |
-f | 显示文件中每行时间 |
-r | 显示文件的最后修改时间 |
-s | 设置当前时间 |
注意事项
- date ‘+%F %T’–>注意这里的格式如果中间有空格需要用引号,不然会报错;
- 生产中使用``反引号或者$()来使用变量
[root@Andy andy]# tar zcvf etc-$(date +%F).tar.gz /etc
[root@Andy andy]# tar zcvf etc-`date +%F`.tar.gz /etc
- 下面两种方式都可以增加或减少日期
[huzd@study ~]$ date -d '+1day' '+%F %T'
2018-06-10 13:44:59
[huzd@study ~]$ date '+%F %T' -d '+3day'
2018-06-12 13:45:44
[huzd@study ~]$
Cal(显示日历指令)
命令简介
显示日历
命令语法
cal [month] [year]
参数 | 描述 |
---|---|
-j | 用天数来显示当前日历 |
-m | 日历以周一为第一天,默认周日 |
Bc (计算器)
1、bc进入计算器
2、Scale可以定义精度;
3、Quit离开计算器环境
Sync(数据同步写入磁盘)
Shutdown(关机)
命令描述
关机命令
命令语法
参数 | 描述 |
---|---|
-k | 不是真关机,只是警告 |
-r | 将系统服务停止掉之后,重新启动 |
-h | 将系统服务停止掉之后,关机 |
-c | 取消已经在进行的shutdown命令内容 |
shutdown -r +时间 | 表示多长时间之后重启,now表示现在 |
注意事项
与poweroff,halt,reboot的区别
- halt 其實跟 shutdown 沒多大分別,只不過 shutdown 在關機時會把系統的服務都關閉之後,才關閉電腦,而 halt 指令則允許不管系統的狀態為何,直接停止電腦的運作
- poweroff 指令也是類似的狀況,它也允許你不管系統的狀況,直接把電腦的電源切斷
- 雖然系統有提供這樣的功能,但是其實這些功能在一般的狀況根本用不到,除非是系統真的當機,不然使用 shutdown 來關機會比較安全
- 這裡的停止運作(halt)與關閉電源(power off)是有差異的,停止運作是指停止電腦上所有 CPU 的運作,這時候螢幕上應該會出現類似「System halted」的字眼,然後就停住了(電源還是開著的),而關閉電源(power off)就是會送出 ACPI 指令通知 PSU 關閉電腦的電源。
文件命令
cd(变换目录)
命令语法
cd [路径]
注意事项
- 如果cd后面什么都没加,也是跟cd ~ 一样回到用户家目录;
pwd(显示目前所在目录)
命令语法
pwd [-P]
参数 | 描述 |
---|---|
-P | 用实际路径显示,而非连接路径 |
mkdir(建立新目录)
命令语法
mkdir [-mp] [xyz] 目录名称
参数 | 描述 |
---|---|
-m | 直接在创建目录的时候设置权限,xyz代表权限 |
-p | 递归建立目录 |
rmdir(删除空目录)
命令语法
rmdir [-p] 目录
参数 | 描述 |
---|---|
-p | 递归删除空目录 |
注意事项
- 如果是需要删除非空目录,需要用 [ \ ]rm -r 目录
ls (文件与目录检视)
命令语法
ls [-选项] 目录或者文件
参数 | 描述 |
---|---|
-a | 将全部文件列出来,包括隐藏档 |
-d | 列出目录的信息,而不是目录内容 |
-i | 列出 inode |
-l | 将文件详细信息列出来 |
-n | 列出UID与GID而非使用者与群组 |
-R | 将目录及子目录的内容全部显示出来 |
-S | 将文件按照容量大小排序 |
-t | 按照时间排序 |
- -color | never:不依据文件特性显示颜色,always: 显示颜色,auto: 让系统自行依据设定来判断是否显示颜色 |
- -full-time | 以完整形式显示时间(年月日时分) |
- -time | atime:输出文件访问时间,ctime:输出文件属性改变时间,而非mtime:文件内容变更时间 |
注意事项:
- 可以直接用 ll 代替 ls -l
[root@study tmp]# alias ll
alias ll='ls -l --color=auto'
cp(复制文件或目录)
命令语法
cp [选项] 来源文件 目标文件
或者 cp [选项] 来源文件1 来源文件2 … 目标目录
参数 | 描述 |
---|---|
-a | 相当于 -dr --preserve=all 的意思 |
-d | 若来源为链接文件,则复制链接文件属性而非文件本身,简单说就是不加-d就是复制链接文件的源文件,加上-d就是复制链接文件 |
-f | 强制,若目标已经存在且无法开启,则删除在尝试复制 |
-i | 若目标已经存在,则先进行询问 |
-l | 建立硬链接,而非复制文件 |
-p | 复制文件连同属性一起复制,而非使用文件默认属性 |
-r | 递归复制,用于目录复制 |
-s | 建立符号链接 |
-u | 目标文件比源文件旧,或者目标文件不存在,才进行更新 |
- -preserve=all | 除了-p的权限相关参数之外,还加入了SELinux,links,xattr等属性; |
注意事项:
- 如果来源文件有两个以上,则目标文件必须是目录;
- 由于一般用户权限不足,不能随意修改文件的所属用户跟群组,所以即使用-a也不能将文件的权限复制;
- 复制时注意:
- 是否需要保留原文件信息?-p,–preserve=all,-d,-a
- 是否是链接文件复制?-d
- 源文件是否为目录? -r
- cp 等价于 cp -i
[root@study tmp]# alias cp
alias cp='cp -i'
scp(远程拷贝)
scp [-12BCpqrv] [-l limit] [-o ssh_option] [-P port] [[user@]host1:]file1 … [[user@]host2:]file2
选项说明:
-1:使用ssh v1版本,这是默认使用协议版本
-2:使用ssh v2版本
-C:拷贝时先压缩,节省带宽
-l limit:限制拷贝速度,Kbit/s.
-o ssh_option:指定ssh连接时的特殊选项,一般用不上。偶尔在连接过程中等待提示输入密码较慢时,可以设置GSSAPIAuthentication为no
-P port:指定目标主机上ssh端口,大写的字母P,默认是22端口
-p:拷贝时保持源文件的mtime,atime,owner,group,privileges
-r:递归拷贝,用于拷贝目录。注意,scp拷贝遇到链接文件时,会拷贝链接的源文件内容填充到目标文件中(scp的本质就是填充而非拷贝)
-v:输出详细信息,可以用来调试或查看scp的详细过程,分析scp的机制
rm (移除文件或者目录)
命令语法
rm [选项] 文件
参数 | 描述 |
---|---|
-f | 强制删除,忽略不存在的文件,不会警告 |
-i | 删除前询问 |
-r | 递归删除 |
注意事项
- 级联删除非空目录:
方法1:
方法2:[root@study tmp]# rm -rf test
这里用\来取消alias指定选项 也就是说,默认rm等价于rm -i,但是用\代表只是rm,不用-i,即去掉了询问,然后加上-r级联删除;[root@study tmp]# \rm -r test
- rm 等价于 rm -i
[root@study tmp]# alias rm
alias rm='rm -i'
- 如果需要删除带“-”的文件
[root@study tmp]# touch -aa
touch: 缺少了文件操作数
Try 'touch --help' for more information.
[root@study tmp]# touch ./-aa
[root@study tmp]# ls
-aa
ssh-ULPOolaEwAab
systemd-private-007886d7579b4ae29b75f1dcbac445db-colord.service-B22JP8
systemd-private-007886d7579b4ae29b75f1dcbac445db-cups.service-yJGQed
systemd-private-007886d7579b4ae29b75f1dcbac445db-rtkit-daemon.service-gg9riA
systemd-private-007886d7579b4ae29b75f1dcbac445db-vgauthd.service-a1bWH2
systemd-private-007886d7579b4ae29b75f1dcbac445db-vmtoolsd.service-SZvYaj
test
tracker-extract-files.1000
[root@study tmp]# rm -aa
rm:无效选项 -- a
Try 'rm ./-aa' to remove the file "-aa".
Try 'rm --help' for more information.
[root@study tmp]# rm ./-aa
rm:是否删除普通空文件 "./-aa"?y
这里创建或者删除 -aa这种文件还有一种方法是touch – -aa或者rm – -aa,其中 - - 代表 终止选项列表
意思就是- -之后接的-aa不当成指令;
mv(移动文件与目录,更名)
命令语法
mv [选项] 源文件 目标文件
或者 mv [选项] 源文件1 源文件2 … 目标目录
参数 | 描述 |
---|---|
-f | 强制覆盖,如果目标文件已经存在,不询问直接覆盖 |
-i | 目标文件存在时,询问是否覆盖 |
-u | 目标文件比源文件旧,才用源文件更新目标文件 |
注意事项
- 与cp不同的地方是,cp指令执行完之后,源文件还在,mv指令执行之后,源文件不在了,因此,可以用来重命名;
basename(取文件名)/dirname(取路径名)
示例
[root@study tmp]# basename ./tmp/test100/test1
test1
[root@study tmp]# dirname ./tmp/test100/test1
./tmp/test100
[root@study tmp]#
注意事项
- 上面示例中test100目录跟test1并不存在,但是还是能用命令取到,这里只是截取命令字面路径而已;
cat(输出文件内容)
命令语法
cat [OPTION]… [FILE]…
选项说明
-n:显示所有行的行号
-b:显示非空行的行号
-E:在每行行尾加上$符号
-T:将TAB符号输出为"^I"
-s:压缩连续空行为单个空行
tac(与cat相反输出)
head(打印前几行)
命令语法
head [-n num] | [-num] [-v] filename
-n:显示前num行;如果num是负数,则显示除了最后|num|(绝对值)行的其余所有行,即显示前"总行数 - |num|"
-v:会显示出文件名
tail(反向输出)
命令语法
tail [OPTION]... [FILE]...
选项说明:
-n:输出最后num行,如果使用-n +num则表示输出从第num行开始的所有行
-f:监控文件变化
--pid=PID:和-f一起使用,在给定PID的进程死亡后,终止文件监控
-v:显示文件名
more/less(输出内容)
按页显示文件内容。使用more时,使用/搜索字符串,按下n或N键表示向下或向上继续搜索。使用less时,还多了一个搜索功能,使用?搜索字符串,同样,使用n或N键可以向上或向下继续搜索。
which(显示二进制或脚本全路径)
whereis(找出二进制文件、源文件和man文档文件)
whatis(列出给定命令(并非一定是命令)的man文档信息)
locate(从库中查找)
默认库/var/lib/mlocate/mlocate.db
find(查找)
命令语法
- find 路径 -name basename:表示从某个路径下查找名称为basename的文件,注意只是basename,不包含dirname,意味着除非名称本身含有/符号,否则匹配不到内容;
- find 路径 -path dirname+basename:想要在指定目录下搜索某目录中的某文件,应该使用-path而不是-name。
- find 路径 -type f/d/l -name ‘a.sh’:-type表示文件类型,一般有三种:f表示文件,d表示目录,l表示链接;
- find 路径 -atime/ctime/mtime -3 -name ‘a.sh’:根据时间戳来查找
- find 路径 -size +100k -name ‘a.sh’:根据文件大小来找
- find 路径 -perm -0700 -name ‘a.sh’:根据文件的权限来找;
用户命令
相关文件信息
/etc/group/:用户组信息,其内容结构为组名:占位符:gid:用户(逗号分隔)
/etc/gshadow/:用户组密码信息
/etc/passwd/:linux系统中用户信息,其内容结构为 用户名:x:uid:gid:用户注释信息:家目录:使用的shell类型
/etc/shadow:存放的是用户的密码信息,其内容结构为:
第一列:用户名。
第二列:加密后的密码。但是这一列是有玄机的,有些特殊的字符表示特殊的意义。
①.该列留空,即"::",表示该用户没有密码。
②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh key的方式,su的方式。
③.该列为"*",即":*:",也表示该用户被锁,和"!"效果是一样的。
④.该列以"!"或"!!"开头,则也表示该用户被锁。
⑤.该列为"!!",即":!!:",表示该用户从来没设置过密码。
⑥.如果格式为"$id$salt$hashed",则表示该用户密码正常。其中$id$的id表示密码的加密算法,$1$表示使用MD5算法,$2a$表示使用Blowfish算法,"$2y$"是另一算法长度的Blowfish,"$5$"表示SHA-256算法,而"$6$"表示SHA-512算法,可见上面的结果中都是使用sha-512算法的。$5$和$6$这两种算法的破解难度远高于MD5。$salt$是加密时使用的salt,$hashed才是真正的密码部分。
第三列:从1970年1月1日到上次密码修改经过的时间(天数)。通过计算现在离1970年1月1日的天数减去这个值,结果就是上次修改密码到现在已经经过了多少天,即现在的密码已经使用了多少天。
第四列:密码最少使用期限(天数)。省略或者0表示不设置期限。例如,刚修改完密码又想修改,可以限制多久才能再次修改
第五列:密码最大使用期限(天数)。超过了它不一定密码就失效,可能下一个字段设置了过期后的宽限天数。设置为空时将永不过期,后面设置的提醒和警告将失效。root等一些用户的已经默认设置为了99999,表示永不过期。如果值设置小于最短使用期限,用户将不能修改密码。
第六列:密码过期前多少天就开始提醒用户密码将要过期。空或0将不提醒。
第七列:密码过期后宽限的天数,在宽限时间内用户无法使用原密码登录,必须改密码或者联系管理员。设置为空表示没有强制的宽限时间,可以过期后的任意时间内修改密码。
第八列:帐号过期时间。从1970年1月1日开始计算天数。设置为空帐号将永不过期,不能设置为0。不同于密码过期,密码过期后账户还有效,改密码后还能登录;帐号过期后帐号失效,修改密码重设密码都无法使用该帐号。
第九列:保留字段。
/etc/skel:骨架目录,骨架目录中的文件是每次新建用户时,都会复制到新用户家目录里的文件。默认只有3个环境配置文件,可以修改这里面的内容,或者添加几个文件在骨架目录中,以后新建用户时就会自动获取到这些环境和文件。
/etc/login.defs:用户账号限制信息,如果跟/etc/shadow中的设置重复,则以shadow中的为准
/etc/default/useradd:创建用户时的默认配置,useradd -D就是修改此文件内容
useradd
useradd [options] login_name
选项说明:
-b:指定家目录的basedir,默认为/home目录
-d:指定用户家目录,不写时默认为/home/user_name
-m:要创建家目录时,若家目录不存在则自动创建,若不指定该项且/etc/login.defs中的CREATE_HOME未启用时将不会创建家目录
-M:显式指明不要创建家目录,会覆盖/etc/login.defs中的CREATE_HOME设置
-g:指定用户主组,要求组已存在
-G:指定用户的辅助组,多个组以逗号分隔
-N:明确指明不要创建和用户名同名的组名
-U:明确指明要创建一个和用户名同名的组,并将用户加入到此组中
-o:允许创建一个重复UID的用户,只有和-u选项同时使用时才生效
-r:创建一个系统用户。useradd命令不会为此选项的系统用户创建家目录,除非明确使用-m选项
-s:指定用户登录的shell,默认留空。此时将选择/etc/default/useradd中的SHELL变量设置
-u:指定用户uid,默认uid必须唯一,除非使用了-o选项
-c:用户的注释信息
-k:指定骨架目录(skeleton)
-K:修改/etc/login.defs文件中有关于用户的配置项,不能修改组相关的配置。设置方式为KEY=VALUE,如-K UID_MIN=100
-D:修改useradd创建用户时的默认选项,就修改/etc/default/useradd文件
-e:帐户过期时间,格式为"YYYY-MM-DD"
-f:密码过期后,该账号还能存活多久才被禁用,设置为0表示密码过期立即禁用帐户,设置为-1表示禁用此功能
-l:不要将用户的信息写入到lastlog和faillog文件中。默认情况下,用户信息会写入到这两个文件中
useradd -D [options]
修改/etc/default/useradd文件
选项说明:不加任何选项时会列出默认属性
-b, --base-dir BASE_DIR
-e, --expiredate EXPIRE_DATE
-f, --inactive INACTIVE
-g, --gid GROUP
-s, --shell SHELL
newusers(批量新增用户)
命令语法
newusers用于批量创建或修改已有用户信息。在创建用户时,它会读取/etc/login.defs文件中的配置项。
newusers [options] [file]
newusers命令从file中或标准输入中读取要创建或修改用户的信息,文件中每行格式都一样,一行代表一个用户。格式如下:
pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
各列的意义如下(跟/etc/passwd格式一致):
pw_name:用户名,若不存在则新创建,否则修改已存在用户的信息
pw_passwd:用户密码,该项使用明文密码,在修改或创建用户时会按照指定的算法自动对其进行加密转换
pw_uid:指定uid,留空则自动选择uid。如果该项为已存在的用户名,则使用该用户的uid,但不建议这么做,uid应尽量保证唯一性
pw_gid:用户主组的gid或组名。若给定组不存在,则自动创建组。若留空,则创建同用户名的组,gid将自动选择
pw_gecos:用户注释信息
pw_dir:指定用户家目录,若不存在则自动创建。留空则不创建。
:注意,newusers命令不会递归创建父目录,父目录不存在时将会给出信息,但newusers命令仍会继续执行
:以完成创建剩下的用户,所以这些错误的用户家目录需要手动去创建。
pw_shell:指定用户的默认shell
newusers [options] [file]
选项说明:
-c:指定加密方法,可选DES,MD5,NONE,SHA256和SHA512
-r:创建一个系统用户
groupadd(增加群组)
命令语法
groupadd [options] group
选项说明:
-f:如果要创建的组已经存在,默认会错误退出,使用该选项则强制创建且以正确状态退出,只不过gid可能会不受控制。
-g:指定gid,默认gid必须唯一,除非使用了-o选项。
-K:修改/etc/login.defs中关于组相关的配置项。配置方式为KEY=VALUE,例如-K GID_MIN=100 -K GID_MAX=499
-o:允许创建一个非唯一gid的组
-r:创建系统组
passwd(修改密码)
命令语法
passwd options [username]
选项说明:
-l:锁定指定用户的密码,在/etc/shadow的密码列加上前缀"!“或”!!"。这种锁定不是完全锁定,使用ssh公钥还是能登录。要完全锁定,使用chage -E 0来设置帐户过期。
-u:解锁-l锁定的密码,解锁的方式是将/etc/shadow的密码列的前缀"!“或”!!“移除掉。但不能移除只有”!“或”!!"的项。
–stdin:从标准输入中读取密码
-d:删除用户密码,将/etc/shadow的密码列设置为空
-f:指定强制操作
-e:强制密码过期,下次登录将强制要求修改密码
-n:密码最小使用天数
-x:最大密码使用天数
-w:过期前几天开始提示用户密码将要过期
-i:设置密码过期后多少天,用户才过期。用户过期将被禁用,修改密码也无法登陆。
chpasswd(批量修改密码)
命令语法
以批处理模式从标准输入中获取提供的用户和密码来修改用户密码,可以一次修改多个用户密码。也就是说不用交互。适用于一次性创建了多个用户时为他们提供密码。
chpasswd [-e -c] “user:passwd”
-c:指定加密算法,可选的算法有DES,MD5,NONE,SHA256和SHA512
user:passwd为用户密码对,其中默认passwd是明文密码,可以指定多对,每行一个用户密码对。前提是用户是已存在的。
-e:passwd默认使用的是明文密码,如果要使用密文,则使用-e选项。参见man chpasswd
示例
shell> cat /tmp/passwdfile
zhangsan:123456
lisi:123456
shell> chapasswd -c SHA512 </tmp/passwdfile
userdel(删除用户)
命令语法
userdel [options] login_name
-r:递归删除家目录,默认不删除家目录。
-f:强制删除用户,即使这个用户正处于登录状态。同时也会强制删除家目录。
usermod (修改用户)
命令语法
usermod [options] login
选项说明:
-l:修改用户名,仅仅只是改用户名,其他的一切都不会改动(uid、家目录等)
-u:新的uid,新的uid必须唯一,除非同时使用了-o选项
-g:修改用户主组,可以是以gid或组名。对于那些以旧组为所属组的文件(除原家目录),需要重新手动修改其所属组
-m:移动家目录内容到新的位置,该选项只在和-d选项一起使用时才生效
-d:修改用户的家目录位置,若不存在则自动创建。默认旧的家目录不会删除
如果同时指定了-m选项,则旧的家目录中的内容会移到新家目录
如果当前用户家目录不存在或没有家目录,则也不会创建新的家目录
-o:允许用户使用非唯一的UID
-s:修改用的shell,留空则选择默认shell
-c:修改用户注释信息
-a:将用户以追加的方式加入到辅助组中,只能和-G选项一起使用
-G:将用户加入指定的辅助组中,若此处未列出某组,而此前该用户又是该组成员,则会删除该组中此成员
-L:锁定用户的密码,将在/etc/shadow的密码列加上前缀"!“或”!!"
-U:解锁用户的密码,解锁的方式是移除shadow文件密码列的前缀"!“或”!!"
-e:帐户过期时间,时间格式为"YYYY-MM-DD",如果给一个空的参数,则立即禁用该帐户
-f:密码过期后多少天,帐户才过期被禁用,0表示密码过期帐户立即禁用,-1表示禁用该功能
groupmod(群组修改)
id(获取uid,gid,groups)
users(查看当前正在登陆的用户名)
last(查看最近登录的用户列表)
其实last查看的是/var/log/wtmp文件
who/w(查看有谁登陆过)
lastlog(查看登录的来源IP)
su(切换用户或以指定用户运行命令)
命令语法
su [options...] [-] [user [args...]]
选项说明:
-c command:使用-c选项传递要指定的命令到shell上执行。使用-c执行命令会为每个su都分配新的会话环境
-, -l, --login:启动shell作为登录的shell,模拟真正的登录环境。它会做下面几件事:
1.清除除了TERM外的所有环境变量
2.初始化HOME,SHELL,USER,LOGNAME,PATH环境变量
3.进入目标用户的家目录
4.设置argv[0]为"-"以便设置shell作为登录的shell
使用--login的su是交互式登录。不使用--login的su是非交互式登录(除不带任何参数的su外
-m, -p, --preserve-environment:保留整个环境变量(不会重新设置HOME,SHELL,USER和LOGNAME),
保留环境的方法是新用户shell上执行原用户的各配置文件,如~/.bashrc。
当设置了--login时,将忽略该选项
-s SHELL:运行指定的shell而非默认shell,选择shell的顺序优先级如下:
1.--shell指定的shell
2.如果使用了--preserve-environment,选择SHELL环境变量的shell
3.选项目标用户在passwd文件中指定的shell
4./bin/sh
chgrp (改变群组)
命令语法
chgrp [-R] group file
参数 | 描述 |
---|---|
-R | 递归更新 |
注意事项
在/tmp中普通用户不能更改群组,一般需要root用户
chown(更改用户)
命令语法
chown [-R] 账号名称 [:群组] file
参数 | 描述 |
---|---|
-R | 递归更新 |
chmod(更改权限)
命令语法
- 方式一:利用数字
chmod [-R] xyz file
参数 | 描述 |
---|---|
xyz | 表示的是r w x:4 2 1,例如7=4+2+1,代表拥有rwx权限 |
-R | 递归更新 |
- 方式二:利用字母
chmod [ugoa] [+ - =] [rwx] file
参数 | 描述 |
---|---|
ugoa | u:user,g:group,o:other,a(all):代表三种文件属性,例如:chmod a=rw text.txt,代表设置text.txt的三种属性为rw; |
示例
注意事项
- 权限对文件的意义:
- r:可读取文件内容
- w:可编辑文件内容
- x:文件具有可执行权限;
- 权限对目录的意义:
- r:可读取目录内的文件列表;
- w:可以更改文件列表的权利
- 建立新文件
- 删除文件
- 更改文件名称
- 调整该目录内的文件位置
- x: 用户是否能进入该目录
- 总的来说
组件 | r | w | x |
---|---|---|---|
文件 | 读取文件内容 | 修改文件内容 | 文件具有执行权利 |
目录 | 读取文件列表 | 修改文件列表 | 用户具有进入目录的权利 |
- 文件属性
- 只有 root才能修改文件权限,普通用户不能修改;
umask(设置权限补码)
文件默认权限:-rw-rw-rw-(666)
目录默认权限:drwxrwxrwx(777)
普通用户umask为:0002
[huzd@localhost ~]$ umask
0002
那么用普通用户创建文件默认权限为0666-0002=0664,同理目录权限为775
系统管理员umask为:0022
[root@localhost ~]# umask
0022
那么用系统管理员创建文件默认权限为0666-0022=0644,同理目录权限为755
suid/sgid/sbit
suid
当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简程SUID。
1、SUID权限仅对二进制程序有效。
2、执行者对于该程序需要具有x的可执行权限。
3、本权限仅在执行该程序的过程中有效。
4、执行者将具有该程序拥有者的权限。
sgid
当s出现在文件的所属用户组x权限位置上时,就是SGID,相对与SUID来说,SGID还是比较少见的。
1、SGID对二进制程序有用;
2、程序执行者对于该程序来说需具备x的权限;
3、SGID主要用在目录上;
sbit
这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。
其他命令
lsblk(显示文件系统信息)
命令语法
常用的是 -f
blkid(显示文件系统的uuid)
du(显示文件大小)
du [OPTION]... [FILE]...
选项说明:
-a, --all:列出目录中所有文件的统计信息,默认只会列出目录中子目录的统计信息,而不列出文件的统计信息
-h, --human-readable:人性化显示大小
-0, --null:以空字符结尾,即"\0"而非换行的"\n"
-S, --separate-dirs:不包含子目录的大小
-s, --summarize:对目录做总的统计,不列出目录内文件的大小信息
-c,--total:对给出的文件或目录做总计。在统计非同一个目录文件大小时非常有用。见下文例子。
-d,--max-depth:指定显示时的目录深度,默认会递归显示所有层次
--max-depth=N:只列出给定层次的目录统计,如果N=0,则等价于"-s"
-x, --one-file-system:忽略不同文件系统上的文件,不对它们进行统计
-X, --exclude-from=FILE:从文件中读取要排除的文件
--exclude=PATTERN:指定要忽略不统计的文件
df(文件系统信息)
mount(挂载)
mount # 将显示当前已挂载信息
mount [-t 欲挂载文件系统类型 ] [-o 特殊选项] 设备名 挂载目录
选项说明:
-a 将/etc/fstab文件里指定的挂载选项重新挂载一遍。
-t 支持ext2/ext3/ext4/vfat/fat/iso9660(光盘默认格式)。 不用-t时默认会调用blkid来获取文件系统类型。
-n 不把挂载记录写在/etc/mtab文件中,一般挂载会在/proc/mounts中记录下挂载信息,然后同步到/etc/mtab,指定-n表示不同步该挂载信息。
-o 指定挂载特殊选项。下面是两个比较常用的:
loop 挂载镜像文件,如iso文件
ro 只读挂载
rw 读写挂载
auto 相当于mount -a
dev 如果挂载的文件系统中有设备访问入口则启用它,使其可以作为设备访问入口
default rw,suid,dev,exec,auto,nouser,async,and relatime
async 异步挂载,只写到内存
sync 同步挂载,通过挂载位置写入对方硬盘
atime 修改访问时间,每次访问都修改atime会导致性能降低,所以默认是noatime
noatime 不修改访问时间,高并发时使用这个选项可以减少磁盘IO
nodiratime 不修改文件夹访问时间,高并发时使用这个选项可以减少磁盘IO
exec/noexec 挂载后的文件系统里的可执行程序是否可执行,默认是可以执行exec, 优先级高于权限的限定
remount 重新挂载,此时可以不用指定挂载点。
suid/nosuid 对挂载的文件系统启用或禁用suid,对于外来设备最好禁用suid
_netdev 需要网络挂载时默认将停留在挂载界面直到加载网络了。使用_netdev可以忽略网络正常挂载。如NFS开机挂载。
user 允许普通用户进行挂载该目录,但只允许挂载者进行卸载该目录
users 允许所有用户挂载和卸载该目录
nouser 禁止普通用户挂载和卸载该目录,这是默认的,默认情况下一个目录不指定user/users时,将只有root能挂载
umount(卸载)
命令语法
umount 设备名或挂载目录
umount -lf 强制卸载
开机自动挂载/etc/fstab
rpm(包管理工具1)
命令语法
rpm工具安装、升级和卸载的功能都很少使用。对于安装来说,它需要人为解决包的依赖关系,这是极其令人恶心的事对于升级来说,基本上都会使用yum工具进行安装和升级,而卸载行为在Linux上很少出现,大不了直接覆盖重装。
rpm -ivhUe --nodeps --test --force --prefix
选项说明:
-i 表示安装,install的意思
-v 显示安装信息,还可以"-vv"、"-vvv",v提供的越多显示信息越多
-h 显示安装进度,以#显示安装的进度
-U 升级或升级包
-F 只升级已安装的包
-e 卸载包,卸载也有依赖性,"--erase"
--nodeps 忽略依赖性强制安装或卸载(no dependencies)
--test 测试是否能够成功安装指定的rpm包
--prefix 新路径 自行指定安装路径而不是使用默认路径,基本上都不支持该功能,功能极其简单的软件估计才支持重定位安装路径
--force 强制动作
--replacepkgs 替换安装,即重新覆盖安装。
rpm工具的安装功能很少使用,毕竟解决依赖关系不是件容易的事。但是rpm的查询功能则非常实用。
-q[p] -q查询已安装的包,-qp查询未安装的包。它们都可接下面的参数
-a 查询所有已安装的包,也可以指定通配符名称进行查询
-i 查询指定包的信息(版本、开发商、安装时间等)。从这里面可以查看到软件包属于哪个包组。
-l 查询包的文件列表和目录(包在生产的时候就指定了文件路径,因此可查未装包)
-R 查询包的依赖性(Required)
-c 查询安装后包生成的配置文件
-d 查询安装后包生成的帮助文档
-f 查询系统文件属于哪个已安装的包(接的是文件而不是包)
--scripts 查询包相关的脚本文档。脚本文档分四类:安装前运行、安装后运行、卸载前运行、卸载后运行
yum(管理包)
Usage: yum [options] COMMAND
List of Commands:
help 命令的帮助信息,用法:yum help command,如yum help install则查看install命令的用法说明
clean 清除缓存数据,如yum clean all
makecache 生成元数据缓存数据,yum makecache
deplist 列出包的依赖关系
erase 卸载包
fs 为当前文件系统创建快照,或者列出或删除当前已有快照。快照是非常有用的,升级或打补丁前拍个快照,就能放心地升级或打补丁了
fssnapshot 同fs一样
groups 操作包组
history 查看yum事务信息,yum是独占模式的进程,所以有时候查看事务信息还是有用的
info 输出包或包组的信息,例如该包是谁制作的,大概是干什么用的,来源于哪个包组等信息
install 包安装命令
list 列出包名,一般会结合grep来搜索包,如yum list all | grep -i zabbix
provides 搜索给定的内容是谁提供的,可用来搜索来源于个包,如CentOS 7上mysql被mariadb替代,搜索Mysql提供者时就能找出包mariadb
reinstall 重新安装包
repolist 列出可用的仓库列表
search 给定字符串搜索相关包,并给出相关包较为详细的信息
update 更新包
Options:
-R [minutes], --randomwait=[minutes]:最多等待时间
-q, --quiet 安静模式
-v, --verbose 详细模式
-y, --assumeyes 对所有问题回答yes
--assumeno 对所有问题回答no
--enablerepo=[repo] 启用一个或多个仓库,可用通配符通配仓库ID
--disablerepo=[repo] 禁用一个或多个仓库,可用通配符通配仓库ID
-x [package], --exclude=[package] 通配要排除的包
--nogpgcheck 禁用gpgcheck
--color=COLOR 带颜色
--downloadonly 仅下载包,不安装或升级。默认下载在yum的缓存目录中,默认为/var/cache/yum/$basearch/$releasever
--downloaddir=DLDIR 指定下载目录
fuser(查看目录id)
命令语法
fuser可以查看文件或目录所属进程的pid,即由此知道该文件或目录被哪个进程使用。例如,umount的时候提示the device busy可以判断出来哪个进程在使用。
fuser [-ki] [-signal] file/dir
-k:找出文件或目录的pid,并试图kill掉该pid。发送的信号是SIGKILL
-i:一般和-k一起使用,指的是在kill掉pid之前询问。
-signal:发送信号,如-1 -15,如果不写,默认-9,即kill -9
不加选项:直接显示出文件或目录的pid
在不加选项时,显示结果中文件或目录的pid后会带上一个修饰符:
c:在当前目录下
e:可被执行的
f:是一个被开启的文件或目录
F:被打开且正在写入的文件或目录
r:代表root directory
lsof(显示进程有哪些文件)
而lsof则反过来,它是通过进程来查看进程打开了哪些文件,但要注意的是,一切皆文件,包括普通文件、目录、链接文件、块设备、字符设备、套接字文件、管道文件,所以lsof出来的结果可能会非常多。
lsof /path/to/somefile:显示打开指定文件的所有进程之列表;建议配合grep使用
lsof -c string:显示其COMMAND列中包含指定字符(string)的进程所有打开的文件;可多次使用该选项
lsof -p PID:查看该进程打开了哪些文件
lsof -U:列出套接字类型的文件。一般和其他条件一起使用。如lsof -u root -a -U
lsof -u uid/name:显示指定用户的进程打开的文件;可使用脱字符"^"取反,如"lsof -u ^root"将显示非root用户打开的所有文件
lsof +d /DIR/:显示指定目录下被进程打开的文件
lsof +D /DIR/:基本功能同上,但lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢
lsof -a:按"与"组合多个条件,如lsof -a -c apache -u apache
lsof -N:列出所有NFS(网络文件系统)文件
lsof -n:不反解IP至HOSTNAME
lsof -i:用以显示符合条件的进程情况
lsof -i[46] [protocol][@host][:service|port]
46:IPv4或IPv6
protocol:TCP or UDP
host:host name或ip地址,表示搜索哪台主机上的进程信息
service:服务名称(可以不只一个)
port:端口号 (可以不只一个)
ps(查看进程)
ps -aux:以用户为导向显示所有进程;
ps -ef | grep java:显示全部进程的全部格式信息;
uptime(显示部分系统信息)
显示当前时间,已开机运行多少时间,当前有多少用户已登录系统,以及3个平均负载值。
top(动态显示进程信息)
-d:指定top刷新的时间间隔,默认是5 秒
-b:批处理模式,每次刷新分批显示
-n:指定top刷新几次就退出,可以配合-b使用
-p:指定监控的pid,指定方式为-pN1 -pN2 …或-pN1, N2 [,…]
-u:指定要监控的用户的进程,可以是uid也可以是user_name
crondtab (配置定时任务)
-l:列出定时任务条目
-r:删除当前任务列表终端所有任务条目
-i:删除条目时提示是否真的要删除
-e:编辑定时任务文件,实际上编辑的是/var/spool/cron/*文件
-u:操作指定用户的定时任务
watch(监控)
watch -n 1 -d 命令
at(一次性定时任务)
at +时间
然后输入要操作的命令
然后ctrl+D
atq:查询任务
atrm:删除任务