Linux 操作命令大全

2021-01-29 10:18:03 浏览数 (1)

Linux 学习笔记

一、 常用命令

LINUX 常用操作命令和命令行编辑快捷键
终端快捷键:
代码语言:javascript复制
Ctrl   a/Home 切换到命令行开始
Ctrl   e/End 切换到命令行末尾
Ctrl   l 清除屏幕内容,效果等同于clear
Ctrl   u 清除剪切光标之前的内容
Ctrl   k 剪切清除光标之后的内容
Ctrl   y 粘贴刚才所删除的字符
Ctrl   r 在历史命令中查找 (这个非常好用,输入关键字就调出以前的命令了)
Ctrl   c 终止命令
ctrl   o 重复执行命令
Ctrl   d 退出shell,logout
Ctrl   z 转入后台运行,但在当前用户退出后就会终止
Ctrl   t 颠倒光标所在处及其之前的字符位置,并将光标移动到下一个字符
Alt   t 交换当前与以前单词的位置
Alt   d 剪切光标之后的词
Ctrl w 剪切光标所在处之前的一个词(以空格、标点等为分隔符)
Ctrl (x u) 按住Ctrl的同时再先后按x和u,撤销刚才的操作
Ctrl s 锁住终端
Ctrl q 解锁终端
!! 重复执行最后一条命令
history 显示你所有执行过的编号 历史命令。这个可以配合!编辑来执行某某命令
!$ 显示系统最近的一条参数
最后这个比较有用,比如我先用cat /etc/sysconfig/network-scripts/ifconfig-eth0,然后我想用vim编辑。
一般的做法是先用↑ 显示最后一条命令,然后用Home移动到命令最前,删除cat,然后再输入vim命
令。其实完全可以用vim !$来代替。
gnome 快捷键
代码语言:javascript复制
Alt   F1 类似Windows下的Win键,在GNOME中打开"应用程序"菜单(Applications)
Alt   F2 类似Windows下的Win   R组合键,在GNOME中运行应用程序
Ctrl   Alt   D 类似Windows下的Win   D组合键,显示桌面
Ctrl   Alt   L 锁定桌面并启动屏幕保护程序
Alt   Tab 同Windows下的Alt   Tab组合键,在不同程序窗口间切换
PrintScreen 全屏抓图
Alt   PrintScreen 当前窗口抓图
Ctrl   Alt   → / ← 在不同工作台间切换
Ctrl   Alt   Shift   → / ← 移动当前窗口到不同工作台
Ctrl Alt Fn 终端N或模拟终端N(n和N为数字 1 -6)
代码语言:javascript复制
Ctrl Alt F7 返回桌面
窗口操作快捷键
代码语言:javascript复制
Alt   F4 关闭窗口
Alt   F5 取消最大化窗口 (恢复窗口原来的大小)
Alt   F7 移动窗口 (注: 在窗口最大化的状态下无效)
Alt   F8 改变窗口大小 (注: 在窗口最大化的状态下无效)
Alt   F9 最小化窗口
Alt   F10 最大化窗口
Alt   空格键 打开窗口的控制菜单 (点击窗口左上角图标出现的菜单)
文件浏览器
代码语言:javascript复制
Ctrl N 新建窗口
Ctrl   Shift   W 关闭所有文件浏览器
Ctrl   1/2 改变文件夹视图查看方式,图标视图/列表视图
Alt   → / ← 后退/前进
Alt   ↑/↓ 移动到父文件夹/选择的文件夹
Alt   Home 直接移动到主文件夹
F9 开关显示隐藏Nautilus侧边栏
Ctrl H 显示隐藏文件(切换键)
Shift Ctrl N 新建文件夹, 很有用
Alt   Enter 查看选择文件/文件夹的属性,代替单击右键选择属性
Ctrl Page Up 上一个标签
Ctrl Page Down 下一个标签
Alt N 切换到第N个标签(N为数字)
关机和重启命令

Shutdown Reboot Halt poweroff

grep 和管道符
代码语言:javascript复制
昨天的时候leader给我出了道问题:
找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。
我对Linux 是个白痴,工作了之后才开始接触的,会用的命令只有那几个常用的。这个问题对我来说就有
点难度,我只是大概知道查找文件用 grep ,其他的就不知道了。不过没关系,用Google ,查找到 grep
的完整用法:
1 、grep -l ‘boss’ * 显示所有包含boss的文件名。
2 、grep -n ‘boss’ file在匹配行之前加行号。
3 、grep -i ‘boss’ file显示匹配行,boss不区分大小写。
4 、grep -v ‘boss’ file显示所有不匹配行。
5 、grep -q ‘boss’ file找到匹配行,但不显示,但可以检查grep的退出状态。( 0 为匹配成功)
6 、grep -c ‘boss’ file只显示匹配行数(包括 0 )。
代码语言:javascript复制
7 、grep “$boss” file扩展变量boss的值再执行命令。
8 、ps -ef|grep “^*user1′′ 搜索user1的命令,即使它前面有零个或多个空格。
9 、ps -e|grep -E ‘grant_server|commsvr|tcpsvr|dainfo’ 查找多个字符串的匹配(grep -E相当于egrep)
(来源:蓝森林)
了解了grep的参数之后,问题就解决了一半了,因为可以搜索出符合条件的文件了。不过光有grep 还是
不行,因为要把搜索出来的文件名作为参数传给 generate 命令。OK,接下来该管道符出场了。
即使是像我这样对Linux只是有一点了解的人也经常用到管道符,比如“|”,示例: ls -a | more 。但是对
于管道符的具体意义和它做了什么我就不知道了,没关系,Google 一下,找到一些资料:
利用 Linux 所提供的管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命
令的输入,依此类推。
所以查找的时候可以这样写:
grep -rl “aaa” * | grep -v “bbb”
这样右边的命令就可以从前面的结果中筛选了。然后还有 generate 命令,因为生成文件的命令格式是这
样的:
generate 文件名
不过如果直接使用 generate grep -rl “aaa” * | grep -v “bbb” 的话会出错,因为命令会从左向右执行,这条
命令就会把grep作为一个文件名来看待。怎么办呢?这个时候就要使用 · (键盘上数字键 1 旁边的那个符
号,和“~”在一个按键上)来做命令替换了,用 · 把后面的 grep 命令包起来就好了,这样:
generate ·grep -rl “aaa” * | grep -v “bbb”·
然后就搞定了。
工作一段时间之后,越来越喜欢Linux的哲学了,它有很多命令,看起来功能都不是那么强劲,但是如果
你开动脑筋把这些命令组合起来的话,就能实现 很多让你意想不到的功能,有时候你忍不住惊呼:实在
是太coooool了! 这对于像我这种被Windows的傻瓜式操作惯坏了的人来说,是个福音,以后要多多开
动生锈了的大脑。如果单纯使用电脑的话,还是Windows好 用 ,但 是对于程序员,最好还是多玩玩 Linux。
BTW,现在也越来越喜欢使用VIM 了,虽然刚开始用的时候就觉得它是个记事本~囧~~ 以前总听说“真正
的牛人编码都是用记事本编写的”,当时就觉得这些人实在太厉害了,代码提示和自动补全都不用,现在
想想,可能是外行看到他们使用灵活 强 大的VIM或者 EMACS 了吧。^_^
我的补充:
查找包含logField又包含open的文件:
用grep "logFileId" *.tbc|grep "open"

二、 磁盘管理

文件系统配置文件

/etc/filesystems:系统指定的测试挂载文件系统类型 /proc/filesystems:Linux系统已经加载的文件系统类型 /lib/modules/2.6.18-274.el5/kernel/fs/ 文件系统类型的驱动所在目录 /etc/fstab /etc/mtab

linux 文件类型的颜色

linux文件颜色的含义:蓝色代表目录绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰 色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件

蓝色文件----------目录
白色文件----------一般性文件,如文本文件,配置文件,源码文件等

浅蓝色文件----------链接文件,主要是使用ln命令建立的文件 绿色文件----------可执行文件,可执行的程序 红色文件-----------压缩文件或者包文件 Linux下用字符表示的文件类型

  • :普通文件 d:目录文件 l:链接文件 b:块设备文件 c:字符设备文件 p:管道文件
文件系统操作命令
df :列出文件系统的整体磁盘使用情况

[root@centos57 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol 16G 4.2G 11G 28% / /dev/sda1 99M 13M 81M 14% /boot tmpfs 1005M 0 1005M 0% /dev/shm [root@centos57 ~]# df -i 文件系统 Inode (I)已用 (I)可用 (I)已用% 挂载点 /dev/mapper/VolGroup00-LogVol 4186112 154441 4031671 4% / /dev/sda1 26104 36 26068 1% /boot tmpfs 257210 1 257209 1% /dev/shm .host:/ 0 0 0 - /mnt/hgfs

du :列出目录所占空间

du -sh 显示当前目录大小 du –sh / 显示/目录下的所有目录大小

dumpe2fs :显示当前的磁盘状态
ln :连接文件(快捷方式)

ln –sf 源文件 目标文件 不加任何参数就进行连接,就是hard link,加 上 -s就是Symbolic link,hard link不支持目录和跨文件系统。

Fdisk

Fdisk不支持大于2T的磁盘 Fdisk –l 显示系统中的所有分区内容 [root@centos57 ~]# fdisk -l Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders 总扇区数,可以和下面的最后扇区数比较,看剩余

Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 2610 20860402 8e Linux LVM [root@centos57 ~]# fdisk /dev/sda

Parted : 2T 以上磁盘分区工具

支持大于2T的磁盘 ,2T以下的最好还是用Fdisk来分区。 [root@centos57 aixi]# parted /dev/hda print Model: VMware Virtual IDE Hard Drive (ide) Disk /dev/hda: 2147MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system 标志 1 32.3kB 101MB 101MB 主分区 ext 2 101MB 357MB 256MB 主分区 linux-swap

parted /dev/hda rm 2 删除第 2 个分区

# parted /dev/hda mkpart primary ext3 120MB 200MB 创建分区, primary 代表主分区,还可以是 extended 扩展分区, logical 逻辑分区 ;ext3 代表分区类型, 120MB 是开始位置,最好是接上一分区的结束位 置, 200M 是结束位置

partprobe : 更新分区表 / 磁盘

用于重读分区表,当出现删除文件后,出现仍然占用空间。可以partprobe在不重启的情况下重读分区

partprobe

这个命令执行完毕之后不会输出任何返回信息,你可以使用mke2fs命令在新的分区上创建文件系统。

Mkfs: 磁盘格式化

Mkfs –t 文件系统格式 设备文件名(盘符) [root@centos57 ~]# mkfs -t ext3 /dev/hda

e2label :设置磁盘卷标

e2label 设备名称 新label名称,可以用dumpe2fs查看卷标 [root@centos57 ~]# e2label /dev/hda1 aixi

Mount: 挂载磁盘
命令格式:

mount [-t vfstype] [-o options] device dir mount –o remount,rw,auto / 重新挂载 mount –n –o remount,rw / 重新挂载根目录,设置为可读写 其中:

  1. -t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有: 光盘或光盘镜像:iso DOS fat16文件系统:msdos Windows 9x fat32文件系统:vfat Windows NT ntfs文件系统:ntfs Mount Windows文件网络共享:smbfs

UNIX(LINUX) 文件网络共享:nfs

  1. -o options 主要用来描述设备或档案的挂接方式。常用的参数有: loop:用来把一个文件当成硬盘分区挂接上系统 ro:采用只读方式挂接设备 rw:采用读写方式挂接设备 iocharset:指定访问文件系统所用字符集 3.device 要挂接(mount)的设备。 4.dir设备在系统上的挂接点(mount point)。

挂接光盘镜像文件

1 、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。 #cp /dev/cdrom /home/sunky/mydisk.iso 或 #dd if=/dev/cdrom of=/home/sunky/mydisk.iso 注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/sunky/mydisk.iso 2 、将文件和目录制作成光盘镜像文件,执行下面的命令。 #mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir 注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件 /home/sunky/mydisk.iso,光盘卷标为:mydisk 3 、光盘镜像文件的挂接(mount) #mkdir /mnt/vcdrom 注:建立一个目录用来作挂接点(mount point) #mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom 注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。

挂接移动硬盘

对linux系统而言,USB接口的移动硬盘是当作SCSI设备对待的。插入移动硬盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。 [root at pldyrouter /]# fdisk -l Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes 255 heads, 63 sectors/track, 8924 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 4 32098 de Dell Utility /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS /dev/sda3 2555 7904 42973875 83 Linux /dev/sda4 7905 8924 8193150 f Win95 Ext’d (LBA) /dev/sda5 7905 8924 8193118 82 Linux swap 在这里可以清楚地看到系统有一块SCSI硬盘/dev/sda和它的四个磁盘分区/dev/sda1 – /dev/sda4, /dev/sda5是分区/dev/sda4的逻辑分区。接好移动硬盘后,再用fdisk –l 或 more /proc/partitions查看系统 的硬盘和硬盘分区情况 [root at pldyrouter /]# fdisk -l Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes 255 heads, 63 sectors/track, 8924 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/sda1 1 4 32098 de Dell Utility /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS /dev/sda3 2555 7904 42973875 83 Linux /dev/sda4 7905 8924 8193150 f Win95 Ext’d (LBA) /dev/sda5 7905 8924 8193118 82 Linux swap Disk /dev/sdc: 40.0 GB, 40007761920 bytes 255 heads, 63 sectors/track, 4864 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdc1 1 510 4096543 7 HPFS/NTFS /dev/sdc2 511 4864 34973505 f Win95 Ext’d (LBA) /dev/sdc5 511 4864 34973473 b Win95 FAT 大家应该可以发现多了一个SCSI硬盘/dev/sdc和它的两个磁盘分区/dev/sdc1?、/dev/sdc2,其中/dev/sdc 是/dev/sdc2分区的逻辑分区。我们可以使用下面的命令挂接/dev/sdc1和/dev/sdc5。 #mkdir -p /mnt/usbhd #mkdir -p /mnt/usbhd 注:建立目录用来作挂接点(mount point) #mount -t ntfs /dev/sdc1 /mnt/usbhd #mount -t vfat /dev/sdc5 /mnt/usbhd 注:对ntfs格式的磁盘分区应使用-t ntfs 参数,对fat32格式的磁盘分区应使用-t vfat参数。若汉字 文件名显示为乱码或不显示,可以使用下面的命令格式。 #mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd #mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd linux系统下使用fdisk分区命令和mkfs文件系统创建命令可以将移动硬盘的分区制作成linux系统所特 有的ext2、ext3格式。这样,在linux下使用就更方便了。使用下面的命令直接挂接即可。 #mount /dev/sdc1 /mnt/usbhd

挂接 U 盘

和USB接口的移动硬盘一样对linux系统而言U盘也是当作SCSI设备对待的。使用方法和移动硬盘完全 一样。插入U盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。 [root at pldyrouter root]# fdisk -l Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes 255 heads, 63 sectors/track, 8924 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 4 32098 de Dell Utility /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS /dev/sda3 2555 7904 42973875 83 Linux /dev/sda4 7905 8924 8193150 f Win95 Ext’d (LBA) /dev/sda5 7905 8924 8193118 82 Linux swap 插入U盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。 [root at pldyrouter root]# fdisk -l Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes

255 heads, 63 sectors/track, 8924 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 4 32098 de Dell Utility /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS /dev/sda3 2555 7904 42973875 83 Linux /dev/sda4 7905 8924 8193150 f Win95 Ext’d (LBA) /dev/sda5 7905 8924 8193118 82 Linux swap Disk /dev/sdd: 131 MB, 131072000 bytes 9 heads, 32 sectors/track, 888 cylinders Units = cylinders of 288 * 512 = 147456 bytes Device Boot Start End Blocks Id System /dev/sdd1 * 1 889 127983 b Win95 FAT Partition 1 has different physical/logical endings: phys=(1000, 8, 32) logical=(888, 7, 31) 系统多了一个SCSI硬盘/dev/sdd和一个磁盘分区/dev/sdd1,/dev/sdd1就是我们要挂接的U盘。 #mkdir -p /mnt/usb 注:建立一个目录用来作挂接点(mount point) #mount -t vfat /dev/sdd1 /mnt/usb 注:现在可以通过/mnt/usb来访问U盘了, 若汉字文件名显示为乱码或不显示,可以使用下面的命令。 #mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb

挂接 Windows 文件共享

Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使 用samba 软件包。现在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安 装samba请首先安装samba。当然也可以到 http://www.samba.org网站下载…新的版本是3.0.10版。 当windows系统共享设置好以后,就可以在linux客户端挂接(mount)了,具体操作如下:

mkdir –p /mnt/samba

注:建立一个目录用来作挂接点(mount point)

mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba

注:administrator 和 pldy123 是ip地址为10.140.133.23 windows计算机的一个用户名和密码,c$是这 台计算机的一个磁盘共享 如此就可以在linux系统上通过/mnt/samba来访问windows系统磁盘上的文件了。以上操作在redhat as server 3、redflag server 4.1、suse server 9以及windows NT 4.0、windows 2000、windows xp、windows 2003 环境下测试通过。

挂接 UNIX 系统 NFS 文件共享

类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面 我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍一下在linux下如何mount nfs网络共享。 在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。 1 、Solaris系统NFS服务端配置方法如下: (1)修改 /etc/dfs/dfstab, 增加共享目录 share -F nfs -o rw /export/home/sunky (2)启动nfs服务

/etc/init.d/nfs.server start

(3)NFS服务启动以后,也可以使用下面的命令增加新的共享

share /export/home/sunky

share /export/home/sunky

注:/export/home/sunky和/export/home/sunky1是准备共享的目录 2 、linux系统NFS服务端配置方法如下: (1)修改 /etc/exports,增加共享目录 /export/home/sunky 10.140.133.23(rw) /export/home/sunky1 (rw) /export/home/sunky2 linux-client(rw) 注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、、 linux-client 是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机 /etc/hosts文件里增加linux-client主机ip定义。格式如下: 10.140.133.23 linux-client (2)启动与停止NFS服务 /etc/rc.d/init.d/portmap start (在R E D H AT中PORTMAP是默认启动的) /etc/rc.d/init.d/nfs start 启动NFS服务 /etc/rc.d/init.d/nfs stop 停止NFS服务 注:若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享 起作用。使用命令exportfs -rv也可以达到同样的效果。 3 、linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享

mkdir –p /mnt/nfs

注:建立一个目录用来作挂接点(mount point) #mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs 注:这里我们假设10.140.133.9是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须 在本机/etc/hosts文件里增加服务端ip定义。/export/home/sunky为服务端共享的目录。 如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以NFS方式共享出来的文件 了。以上操作在 redhat as server 3、redflag server4.1、suse server 9以及Solaris 7、Solaris 8、Solaris 9 for x86&sparc环境下测试通过。 权限问题: 假设 server 端的使用者 jack, user id 为 1818, gid 为 1818, client 端也有一个使用者 jack,但 是 uid 及 gid 是 1818 。client 端的 jack 希望能完全读写 server 端的 /home/jack 这个目录。server 端的 /etc/exports 是 这样写的: /home/jack *(rw,all_squash,anonuid=1818,anongid=1818) 这个的配置文件的意思是,所有 client 端的使用者存取 server 端 /home/jack 这 目录时,都会 map 成 server 端的 jack (uid,gid=1818)。我 mount 的结果是

  1. client 端的 root 可以完全存取该目录, 包括读、写、杀…等
  2. client 端的 jack (uid,gid=1818) 我可以做: rm -rf server_jack/* cp something server_jack/ mkdir server_jack/a
umount :将文件设备卸载

[root@centos57 ~]# umount /dev/hda1 用设备文件名来卸载 [root@centos57 ~]# umount /aixi 用挂载点来卸载

umount: /aixi: device is busy 如果提示设备忙,不急可以使用如下命令卸载 # umount -l /mnt/hda 1 选项 – l 并不是马上umount,而是在该目录空闲后再umount。 如果比较急,可用如下命令: # umount -f /mnt/hda 1 -f代表强制 卸载 如果还不行,可使用fuser -m –v /dev/hda1来查询是哪些程序在占用,结束这些程序进程即可卸载 [root@centos57 aixi]# sync && fuser -m /dev/hda1 –k 使用这条命令后一定可以卸载

交换分区
交换分区最大容量为64G,最多只能建 32 个,
创建交换分区

#fdisk /dev/hdan 容量pt(修改系统ID)分区号 82 pw #mkswap /dev/hda2(以上划分的分区号) 构建swap格式 #swapon /dev/hda2 加载即完成增加swap #swapon –s 显示目前使用的Swap设备 创建交换文件

dd if=/dev/hda1 of=/aixi/swap bs=1M count=64 创建大文件

#mkswap /aixi/swap #swapon /aixi/swap 完成 取消交换分区或者交换文件 #swapon –s 显示目前使用的Swap设备 #swapoff /aixi/swap #swapoff /dev/hda #free –m查看

三、 用户管理

用户和用户组操作命令
Id
Finger
Pwck

检查/etc/passwd配置文件内的信息与实际主文件夹是否存在,还可比较/etc/passwd和/etc/shadow的信 息是否一致,另外如果/etc/passwd中的数据字段错误也会提示。

Grpck

和pwck功能相近,这是检查用户组的。

Groups
newgrp
useradd
usermod

usermod 不仅能改用户的SHELL类型,所归属的用户组,也能改用户密码的有效期,还能改登录名。usermod 如此看来就 是能做到用户帐号大转移;比如我把用户A改为新用户B;

usermod [-u uid [-o]] [-g group] [-G group,…] [-d 主目录 [-m]] [-s shell] [-c 注释] [-l 新名称] [-f 失效日] [-e 过期日] [- p 密码] [- L|-U] 用户名 usermod 命令会参照你命令列上指定的部份修改系统帐号档。下列为usermod可选用的参数。 -c comment 更新用户帐号password档中的注解栏,一般是使用chfn(1)来修改。 -d home_dir 更新用户新的登入目录。如果给定-m选项,用户旧目录会搬到新的目录去,如旧目录不存在则建个新的。 -e expire_date 加上用户帐号停止日期。日期格式为MM/DD/YY. -f inactive_days 帐号过期几日后永久停权。当值为 0 时帐号则立刻被停权。而当值为- 1 时则关闭此功能。预设值为- 1 。 -g initial_group 更新用户新的起始登入用户组。用户组名须已存在。用户组ID必须参照既有的的用户组。用户组ID预设 值为 1 。 -G group,[…] 定义用户为一堆groups的成员。每个用户组使用","区格开来,不可以夹杂空白字元。用户组名同-g选项的 限制。如果用户现在的用户组不再此列,则将用户由该用户组中移除。 -l login_name 变更用户login时的名称为login_name。其它不变。特别是,用户目录名应该也会跟着更动成新的登入名。 -s shell 指定新登入shell。如此栏留白,系统将选用系统预设shell。 -u uid用户ID值。必须为唯一的ID值,除非用-o选项。数字不可为负值。预设为最小不得小于/etc/login.defs中定义的 UID_MIN值。 0 到UID_MIN值之间是传统上保留给系统帐号使用。用户目录树下所有的档案目录其userID会自动改变。放在 用户目录外的档案则要自行手动更动。 警告:usermod不允许你改变正在线上的用户帐号名称。当usermod用来改变userID,必须确认这名user没在电脑上执行任何 程序。你需手动更改用户的crontab档。也需手动更改用户的at工作档。采用NISserver须在server上更动相关的NIS设 定。 举个简单的例子,我们在前面说了关于useradd的工具,而usermod 工具和useradd的参数差不多;两者不同之处在于 useradd是添加,usermod 是修改;

[root@localhost ~]# usermod -d /opt/linuxfish -m -l fishlinux -U linuxfish 注:把linuxfish 用户名改为fishlinux ,并且把其家目录转移到 /opt/linuxfish ; [root@localhost ~]# ls -la /opt/linuxfish/ 注:查看用户fishlinux的家目录下的文件及属主; 总用量 48 drwxr-xr-x 3 fishlinux linuxfish 4096 11月 5 16:. drwxrwxrwx 29 root root 4096 11月 5 16: … -rw-r–r-- 1 fishlinux linuxfish 24 11月 5 16:46 .bash_logout -rw-r–r-- 1 fishlinux linuxfish 191 11月 5 16:46 .bash_profile -rw-r–r-- 1 fishlinux linuxfish 124 11月 5 16:46 .bashrc -rw-r–r-- 1 fishlinux linuxfish 5619 11月 5 16:46 .canna -rw-r–r-- 1 fishlinux linuxfish 438 11月 5 16:46 .emacs

-rw-r–r-- 1 fishlinux linuxfish 120 11月 5 16:46 .gtkrc drwxr-xr-x 3 fishlinux linuxfish 4096 11月 5 16:46 .kde -rw-r–r-- 1 fishlinux linuxfish 0 11月 5 16:46 mydoc.txt -rw-r–r-- 1 fishlinux linuxfish 658 11月 5 16:46 .zshrc [root@localhost ~]# more /etc/passwd |grep fishlinux 注:查看有关fishlinux的记录; fishlinux❌512:512::/opt/linuxfish:/bin/bash 通过上面的例子,我们发现文件的用户组还没有变,如果您想改变为fishlinux用户组,如果想用通过 usermod来修改,就要 先添加fishlinux用户组;然后用usermod -g 来修改 ,也可以用chown -R fishlinux:fishlinux /opt/finshlinux 来改;

警告: usermod 最好不要用它来改用户的密码,因为他在/etc/shadow中显示的是明口令;修改用户的口令最好用passwd ;

[root@localhost ~]# usermod -p 123456 fishlinux 注:修改fishlinux的口令是 123456 ; [root@localhost ~]# more /etc/shadow |grep fishlinux 注:查询/etc/shadow文件中fishlinux的口令;我们看到明显 是没有加密; fishlinux:123456:13092:0:99999:7:::

userdel

userdel很简单,只有一个参数可选 -r ;如果加参数-r ,表示在删除用户的同时,一并把用户的家目录及本地邮件存储的目 录或文件也一同删除;比如我们现在有两个用户bnnb和lanhaitun,其家目录都位于/home目录中,现在我们来删除这两个 用户;

[root@localhost ~]# userdel bnnb 注:删除用户bnnb,但不删除其家目录及文件; [root@localhost ~]# ls -ld /home/bnnb 注:查看其家目录是否存在; drwxr-xr-x 14 501 501 4096 8 月 29 16:33 /home/bnnb 注:存在; [root@localhost ~]# ls -ld /home/lanhaitun 注:查看lanhaitun家目录是否存在; drwx------ 4 lanhaitun lanhaitun 4096 11月 5 14:50 /home/lanhaitun 注:存在; [root@localhost ~]# userdel -r lanhaitun 注:删除用户lanhaitun,其家目录及文件一并删除; [root@localhost ~]# ls -ld /home/lanhaitun 注:查看是否在删除lanhaitun 用户的同时,也一并把其家目录和文件一 同删除; ls: /home/lanhaitun: 没有那个文件或目录 注:已经删除; 警告: 请不要轻易用-r参数;他会删除用户的同时删除用户所有的文件和目录,切记;如果用户目录下有重要的文件,在删 除前请备份;

其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样 做,/etc/passwd 是极为重要的文件,可能您一不小心会操作失误;

Groupadd
groupmod
groupdel 是用来删除用户组的;

语法格式:groupdel 用户组

比如:

[root@localhost ~]# groupdel lanhaitun

passwd

passwd 作为普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被root用户锁 定;如果root用户运行passwd ,可以设置或修改任何用户的密码;

passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码;请看下面的例子;

[root@localhost ~]# passwd 注:没有加任何用户,我是用root用户来执行的passwd 表示修改root用户的密码;下面 也有提示; Changing password for user root. New UNIX password: 注:请输入新密码; Retype new UNIX password: 注:验证新密码; passwd: all authentication tokens updated successfully. 注:修改root密码成功; 如果是普通用户执行passwd 只能修改自己的密码;

如果新建用户后,要为新用户创建密码,则用 passwd 用户名 ,注意要以root用户的权限来创建;

[root@localhost ~]# passwd beinan 注:更改或创建beinan用户的密码; Changing password for user beinan. New UNIX password: 注:请输入新密码; Retype new UNIX password: 注:再输入一次; passwd: all authentication tokens updated successfully. 注:成功; 普通用户如果想更改自己的密码,直接运行passwd即可;比如当前操作的用户是beinan;

[beinan@localhost ~]$ passwd Changing password for user beinan. 注:更改beinan用户的密码; (current) UNIX password: 注:请输入当前密码; New UNIX password: 注:请输入新密码; Retype new UNIX password: 注:确认新密码; passwd: all authentication tokens updated successfully. 注:更改成功;

passwd 几个比较重要的参数;

[root@localhost beinan]# passwd --help Usage: passwd [OPTION…] -k, --keep -tokens keep non-expired authentication tokens 注:保留即将过期的用户在期满后能仍能使用; -d, --delete delete the password for the named account (root only) 注:删除用户密码,仅能以root权限操作; -l, --lock lock the named account (root only) 注:锁住用户无权更改其密码,仅能通过root权限操作; -u, --unlock unlock the named account (root only) 注:解除锁定; -f, --force force operation 注:强制操作;仅root权限才能操作; -x, --maximum=DAYS maximum password lifetime (root only) 注:两次密码修正的最大天数,后面接数字;仅能 root权限操作; -n, --minimum=DAYS minimum password lifetime (root only) 注:两次密码修改的最小天数,后面接数字,仅能 root权限操作;

-w, --warning=DAYS number of days warning users receives before 注:在距多少天提醒用户修改密码;仅能 root权限操作; password expiration (root only) -i, --inactive=DAYS number of days after password expiration when an 注:在密码过期后多少天,用户被禁 掉,仅能以root操作; account becomes disabled (root only) -S, --status report password status on the named account (root 注:查询用户的密码状态,仅能root 用户操作; only) –stdin read new tokens from stdin (root only) 比如我们让某个用户不能修改密码,可以用-l 参数来锁定:

[root@localhost ~]# passwd -l beinan 注:锁定用户beinan不能更改密码; Locking password for user beinan. passwd: Success 注:锁定成功; [beinan@localhost ~]# su beinan 注:通过su切换到beinan用户; [beinan@localhost ~]$ passwd 注:beinan来更改密码; Changing password for user beinan. Changing password for beinan (current) UNIX password: 注:输入beinan的当前密码; passwd: Authentication token manipulation error 注:失败,不能更改密码; 再来一例:

[root@localhost ~]# passwd -d beinan 注:清除beinan用户密码; Removing password for user beinan. passwd: Success 注:清除成功; [root@localhost ~]# passwd -S beinan 注:查询beinan用户密码状态; Empty password. 注:空密码,也就是没有密码; 注意: 当我们清除一个用户的密码时,登录时就无需密码;这一点要加以注意;

chage 修改用户密码有效期限的命令;

chage 用语法格式:

chage [-l] [ -m 最小天数] [- M 最大天数] [-W 警告] [-I 失效日] [-E 过期日] [-d 最后日] 用户 前面已经说的好多了,这个只是一笔带过吧,知道有这个命令就行,自己实践实践再说,大体和psswd有些参数的用法差不 多;

id 工具 : 查询用户所对应的 UID 和 GID 及 GID 所对应的用户组;

id 工具是用来查询用户信息,比如用户所归属的用户组,UID 和GID等;id 用法极为简单;我们举个例子说明一下; 语法格式: id [参数] [用户名] 至于有哪些参数,自己查一下 id --help 或man id ;如 果id后面不接任何参数和任何用户,默认显示当前操作用户的用户名、 所归属的用户组、UID和GID等;

实例一:不加任何参数和用户名;

[beinan@localhost ~]$ id

uid=500(beinan) gid=500(beinan) groups=500(beinan) 注解:在没有加任何参数的情况下,查询的是当前操作用户的用户名、UID 、GID 和所处的主用户组和附属用户组;在本例 中,用户名是beinan,UID是500,所归属的主用户组是beinan,GID是 500 ; 实例二: id 后面接用户名; 如果我们想查询系统中用户的UID和GID 相应的内容,可以直接接用户名,但用户名必须是真实的 ,能在/etc/passwd中查 到的; [beinan@localhost ~]$ id linuxsir uid=505(linuxsir) gid=502(linuxsir) groups=502(linuxsir),0(root),500(beinan) 注解:查询用户linuxsir 的信息,用户linuxsir ,UID 为 505 ,所归属的主用户组是linuxsir,主用户组的GID是 502 ;同时 linuxsir用户也是GID为 0 的root用户组成员,也是GID为 500 用户组beinan的成员; 这个例子和实例一在用户组方面有所不同,我们在 《Linux 用户(user)和用户组(group)管理概述》 中有提到;用户和 用户组的对应关系,可以是一对一、一对多、多对一、或多对多的交叉关系,请参考之;另外您还需要掌握《用户(user) 和用户组(group)配置文件详解》一文;

2 、finger 工具:用来查询用户信息,侧重用户家目录、登录SHELL等;

finger 工具侧重于用户信息的查询;查询的内容包括用户名(也被称为登录名Login),家目录,用户真实的名字(Name)… … 办公地址、办公电话;也包括登录终端、写状态、空闭时间等; 我们最常用finger 来查询用户家目录、用户真实名、所用SHELL 类型、以及办公地址和电话,这是以参数 -l 长格式输出的; 而修改用户的家目录、真实名字、办公地址及办公电话,我们一般要能过chfn命令进行; 语法格式: finger [参数选项] [用户名] -l 采用长格式(默认),显示由-s选项所包含的所有信息,以及主目录、办公地址、办公电话、登录SHELL、邮件状 态、.plan、.project和.forward; -m 禁止对用户真实名字进行匹配; -p 把.plan和.project文件中的内容省略; -s 显示短格式,用户名(也被称为登录名Login)、真实名字(NAME)、在哪个终端登录(Tty)、写状态、空闲时间(Idle)、 登录时间(Login Time)、办公地点、办公电话等; 至于finger 有哪些参数,您可以通过 finger --help 或man finger 来获取,我们在本文中以实例讲述最常用的参数; 实例一:不接任何参数,也不指定查询用户名;默认为加了-s参数;

[beinan@localhost ~] finger Login Name Tty Idle Login Time Office Office Phone beinan beinan sun tty1 1:39 Nov 2 08: linuxsir linuxsir open tty2 2 Nov 2 10:03 linuxsir o 1-389- 866- 771 等价命令 [beinan@localhost ~] finger -s 注解:不加任何参数,也没有指定查询哪个用户,finger 会以默认以短格-s 来输出登录本机的所有用户的用户名(也被称为 登录名Login)、真实名字(NAME)、在哪个终端登录(Tty)、写状态、空闲时间(Idle)、登录时间(Login Time)、办公地 点、办公电话等; 在这个例子中,有beinan用户登录,真实名字是beinan sun (这个名字是用户的真实名字,如果在添加用户时没有设置, 是不会显示的),在tty1终端登录,空闭时间是 1 分 39 秒,登录时间是Nov /2/08:27 ,没有办公室名称,没有办公电话; 请对照本例中beinan用户记录的解说,我们来看看本例中的 linuxsir用户信息;应该不难。 关于写状态,如果在Tty 后面 没有任何输出,表示正在写入,如果有出现,表示没有写入或被禁止,比如下面的例子,ftp 用户没有通过终端登录系统,因为Tty是,同时Tty后面还有一个* ,表示禁止写入或没有写入状态(当用户没有登录时); [beinan@localhost ~]

Login Name Tty Idle Login Time Office Office Phone ftp FTP User * * No logins 我们可以以短格式的来查询某个用户信息以短格式输出,比如下面的例子; [beinan@localhost ~] finger -s beinan 实例二:关于长格式的用户信息的输出 -l 参数的实例; finger -l 如果不加用户名的情况下,可以列出所有通过tty登录的用户信息;如果您想查询某个用户,就直接指定用户,可以 指定一个或多个;什么是tty登录?如果您在全屏文本界面操作的话,您可以通过按CTRL F2或CTRL F3 或CTRL F4等, 以几个不同的用户登录到主机上,您就会看到,每个用户都有不同的tty; [beinan@localhost ~] finger -l [beinan@localhost ~] finger -l beinan linuxsir 注:可以同时查询几个用户信息,以长格式输出; [beinan@localhost ~] finger beinan Login: beinan Name: beinan sun Directory: /home/beinan Shell: /bin/bash On since Wed Nov 2 08:27 (CST) on tty1 2 hours 29 minutes idle On since Wed Nov 2 10:50 (CST) on pts/0 from :0. No mail. No Plan. 在本例中,所查询的用户是beinan,真实名字是beinan sun ,家目录位于 /home/beinan ,所用SHELL类型是bash ;然 后就是通过哪个终端登录的,登录时间,是不是有mail ,有Plan 等; 实例三:参数组合的例子; [beinan@localhost ~] finger -lp beinan Login: beinan Name: beinan sun Directory: /home/beinan Shell: /bin/bash On since Wed Nov 2 08:27 (CST) on tty1 2 hours 36 minutes idle On since Wed Nov 2 10:50 (CST) on pts/0 from :0. No mail. 注解:查询beinan用户信息,以长格式输出,并且不输出.Plan和.Project的内容; 实例四: finger -s 和w 及who的比较; 对于finger 就说这么多吧,极为简单的工具,当用到-s 参数时,您最好和w和who工具对照,看看finger -s 和w 及who 的输出有什么异同,w和who是查询哪些用户登录主机的;而finger -s 呢,无论是登录还是不登录的用户都可以查;但所查 到的内容侧重有所不同;自己看看例子; [beinan@localhost ~] finger -s Login Name Tty Idle Login Time Office Office Phone beinan beinan sun tty1 3:03 Nov 2 08: beinan beinan sun pts/0 Nov 2 10:50 (:0.0) linuxsir linuxsir open tty2 1:26 Nov 2 10:03 linuxsir o 1-389- 866- 771 [beinan@localhost ~] w 11:30:36 up 3:04, 3 users, load average: 0.30, 0.15, 0. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT beinan tty1 - 08:27 3:03m 2:52 0.00s /bin/sh /usr/X11R6/bin/startx linuxsir tty2 - 10:03 1:26m 0.01s 0.01s -bash beinan pts/0 :0.0 10:50 0.00s 0.16s 0.00s w [beinan@localhost ~] who beinan tty1 Nov 2 08:

linuxsir tty2 Nov 2 10: beinan pts/0 Nov 2 10:50 (:0.0)

3 、查询登录主机的用户工具:w 、who 、users

w、who和users工具,是查询已登录当前主机的用户;另外finger -s 也同样能查询;侧重点不一样;请自己对比着看;毕 竟简单,这里只是介绍 ; [beinan@localhost ~] w 12:09:56 up 3:43, 7 users, load average: 0.16, 0.10, 0. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT beinan tty1 - 08:27 3:42m 3:09 0.00s /bin/sh /usr/X11R6/bin/startx linuxsir tty2 - 10:03 2:06m 0.01s 0.01s -bash beinan pts/0 :0.0 11:36 1:09 0.15s 0.15s bash beinan pts/1 :0.0 11:37 1:12 0.21s 0.21s bash beinan pts/2 :0.0 12:02 6:52 0.09s 0.09s bash beinan pts/3 :0.0 12:05 12.00s 0.11s 0.06s ssh xmbnnbdl@linuxsir.org -p 17007 beinan pts/4 :0.0 12:06 0.00s 0.21s 0.00s w [beinan@localhost ~] who beinan tty1 Nov 2 08: linuxsir tty2 Nov 2 10: beinan pts/0 Nov 2 11:36 (:0.0) beinan pts/1 Nov 2 11:37 (:0.0) beinan pts/2 Nov 2 12:02 (:0.0) beinan pts/3 Nov 2 12:05 (:0.0) beinan pts/4 Nov 2 12:06 (:0.0) [beinan@localhost ~]

4 、groups 用户所归属的用户组查询;

groups 用法很简单,就是查询用户所归属哪个或哪些用户组; 语法格式: groups 用户名 实例: [beinan@localhost ~] groups beinan 注:查询beinan所归属的用户组; beinan : beinan 注:beinan 是beinan用户组下的成员; [beinan@localhost ~] groups linuxsir 注:查询linuxsir用户所归属的用户组; linuxsir : linuxsir root beinan 注:linuxsir用户是linuxsir用户组、beinan用户组、root用户组成员; groups 主要是查询用户所归属的用户组名,最好和id命令相对比;这样对这两个工具都有所了解

相关配置文件

/etc/passwd /etc/shadow /etc/gshadow /etc/group

Linux 用户密码策略

Linux用户密码的有效期,是否可以修改密码可以通过login.defs文件控制.对login.defs文件修只影响后续 建立的用户,如果要改变以前建立的用户的有效期等可以使用chage命令.

Linux用户密码的复杂度可以通过pam pam_cracklib module或pam_passwdqc module控制,两者不能同时 使用. 个人感觉pam_passwdqc更好用. /etc/login.defs密码策略 PASS_MAX_DAYS 99999 #密码的最大有效期, 99999:永久有期 PASS_MIN_DAYS 0 #是否可修改密码,0可修改,非 0 多少天后可修改 PASS_MIN_LEN 5 #密码最小长度,使用pam_cracklib module,该参数不再有效 PASS_WARN_AGE 7 #密码失效前多少天在用户登录时通知用户修改密码 pam_cracklib主要参数说明: tretry=N:重试多少次后返回密码修改错误 difok=N:新密码必需与旧密码不同的位数 dcredit=N: N >= 0:密码中最多有多少个数字;N < 0密码中最少有多少个数字. lcredit=N:小宝字母的个数 ucredit=N大宝字母的个数 credit=N:特殊字母的个数 minclass=N:密码组成(大/小字母,数字,特殊字符) pam_passwdqc主要参数说明: mix:设置口令字最小长度,默认值是mix=disabled。 max:设置口令字的最大长度,默认值是max=40。 passphrase:设置口令短语中单词的最少个数,默认值是passphrase=3,如果为 0 则禁用口令短语。 atch:设置密码串的常见程序,默认值是match=4。 similar:设置当我们重设口令时,重新设置的新口令能否与旧口令相似,它可以是similar=permit允 许相似或similar=deny不允许相似。 random:设置随机生成口令字的默认长度。默认值是random=42。设为 0 则禁止该功能。 enforce:设置约束范围,enforce=none表示只警告弱口令字,但不禁止它们使用;enforce=users将 对系统上的全体非根用户实行这一限制;enforce=everyone将对包括根用户在内的全体用户实行这 一限制。 non-unix:它告诉这个模块不要使用传统的getpwnam函数调用获得用户信息, retry:设置用户输入口令字时允许重试的次数,默认值是retry=

密码复杂度通过/etc/pam.d/system-auth实施 如: 要使用pam_cracklib将注释去掉,把pam_passwdqc.so注释掉即可. #password requisite /lib/security/ I S A / p a m c r a c k l i b . s o r e t r y = 3 d i f o k = p a s s w o r d r e q u i s i t e / l i b / s e c u r i t y / ISA/pam_cracklib.so retry=3 difok= password requisite /lib/security/ ISA/pamc​racklib.soretry=3difok=passwordrequisite/lib/security/ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase= password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow

#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok= 新密码至少有一位与原来的不同 PASS_MIN_DAYS参数则设定了在本次密码修改后,下次允许更改密码之前所需的最少天数。 PASS_WARN_AGE的设定则指明了在口令失效前多少天开始通知用户更改密码(一般在用户刚刚登陆系统时 就会收到警告通知)。 你也会编辑/etc/default/useradd文件,寻找INACTIVE和EXPIRE两个关键词: INACTIVE= EXPIRE=

这会指明在口令失效后多久时间内,如果口令没有进行更改,则将账户更改为失效状态。在本例中,
这个时间是 14 天。而EXPIRE的设置则用于为所有新用户设定一个密码失效的明确时间(具体格式为“年份-
月份-日期”)。
显然,上述这些设定更改之后,只能影响到新建立的用户。要想修改目前已存在的用户具体设置,

需要使用chage工具。

chage -M 60 joe

这条命令将设置用户joe的PASS_MAX_DAYS为 60 ,并修改对应的shadow文件。 你可以使用chage -l的选项,列出当前的账户时效情况,而使用-m选项是设置PASS_MIN_DAYS,用-W 则是设置PASS_WARN_AGE,等等。chage工具可以让你修改特定账户的所有密码时效状态。 注意,chage仅仅适用于本地系统的账户,如果你在使用一个类似LDAP这样的认证系统时,该工具 会失效。如果你在使用LDAP作为认证,而你又打算使用chage,那么,哪怕仅仅是试图列出用户密码的时 效信息,你也会发现chage根本不起作用。 制定一项策略,定义多长时间一个密码必须进行更改,然后强制执行该策略,是非常不错的一个做 法。在解雇了某个雇员后,口令时效策略会保证该雇员不可能在被解雇 3 个月后发现他的口令依然可用。即 使系统管理员忽略了删除他的帐号,该帐号也会因密码时效策略而被自动锁定。当然,这一点并不能成为不 及时删除该雇员帐号的理由,但是这个策略的确提供了一层额外的安全防护,尤其是在过去常常忽视及时清 理帐号的情况下。

ACL 权限设置

ACL是Access Control List 的缩写,主要用于在提供传统的owner、group、others的read、write、execute 权限之外进行细部权限设置。

启动 ACL
让 / 目录支持 ACL :
代码语言:javascript复制
#mount –o remount ,acl /
#mount |grep / //查看是否有挂载
开机启动 ACL :
将要启动ACL的分区写入/etc/fstab中:
#vi /etc/fstab
/dev/hda5 / ext3 default,acl 1 2
ACL 相关命令

Getfacl : 取得某个文件 / 目录的 ACL 权限; Setfacl : 设置某个文件 / 目录的 ACL 权限; setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file … setfacl --restore=file 描述 setfacl用来在命令行里设置ACL。在命令行里,一系列的命令跟随以一系列的文件名。 选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取 acl规则。 选项–set和–set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。 选项-m(–modify)和-M(–modify-file)选项修改文件或目录的acl规则。 选项-x(–remove)和-X(–remove-file)选项删除acl规则。 当使用-M,-X选项从文件中读取规则时,setfacl接受getfacl命令输出的格式。每行至少一条规则,以# 开始的行将被视为注释。

当在不支持ACLs的文件系统上使用setfacl命令时,setfacl将修改文件权限位。如果acl规则并不完全匹 配文件权限位,setfacl将会修改文件权限位使其尽可能的反应acl规则,并会向standard error发送错误消息, 以大于 0 的状态返回。 权限 文件的所有者以及有CAP_FOWNER的用户进程可以设置一个文件的acl。(在目前的linux系统上,root 用户是唯一有CAP_FOWNER能力的用户) 选项 -b, --remove-all 删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。 -k,–remove-default 删除缺省的acl规则。如果没有缺省规则,将不提示。 -n,–no-mask 不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。 –mask 重新计算有效权限,即使ACL mask被明确指定。 -d,–default 设定默认的acl规则。 –restore=file 从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl 规则。此参数不能和除–test以外的任何参数一同执行。 –test 测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。 -R,–recursive 递归的对所有文件及目录进行操作。 -L,–logical 跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。 -P,–physical 跳过所有符号链接,包括符号链接文件。 –version 输出setfacl的版本号并退出。 –help 输出帮助信息。

标识命令行参数结束,其后的所有参数都将被认为是文件名

如果文件名是-,则setfacl将从标准输入读取文件名。 ACL规则 setfacl命令可以识别以下的规则格式。 [d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。 [d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定) [d[efault]:] m[ask][:] [:perms] 有效权限掩码

[d[efault]:] o[ther] [:perms] 其他的权限 恰当的acl规则被用在修改和设定的操作中。 对于uid和gid,可以指定一个数字,也可指定一个名字。 perms域是一个代表各种权限的字母的组合:读-r 写-w 执行-x,执行只适合目录和一些可执行的文件。 pers域也可设置为八进制格式。 自动创建的规则 最初的,文件目录仅包含 3 个基本的acl规则。为了使规则能正常执行,需要满足以下规则。 *3个基本规则不能被删除。 *任何一条包含指定的用户名或群组名的规则必须包含有效的权限组合。 *任何一条包含缺省规则的规则在使用时,缺省规则必须存在。 用法举例如下: acl 全称 Access Control Lists 翻译成中文叫"访问控制列表", 传统的 Linux 文件系统的权限控制是通过 user、group、other 与 r(读)、w(写)、x(执行) 的不同组合来 实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。 例如,目录 /data 的权限为:drwxr-x—,所有者与所属组均为 root,在不改变所有者的前提下,要求用户 tom 对该目录有完 全访问权限 (rwx).考虑以下 2 种办法 (这里假设 tom 不属于 root group) (1) 给 /data 的 other 类别增加 rwx permission,这样由于 tom 会被归为 other 类别,那么他也将拥 有 rwx 权限。 (2) 将 tom 加入到 root group,为 root group 分配 rwx 权限,那么他也将拥有 rwx 权限。 以上 2 种方法其实都不合适,所以传统的权限管理设置起来就力不从心了。 为了解决这些问题,Linux 开发出了一套新的文件系统权限管理方法,叫文件访问控制列表 (Access Control Lists, ACL)。简单地来说,ACL 就是可以设置特定用户或者用户组对于一个文件的操作权限。 ACL 有两种,一种是存取 ACL (access ACLs),针对文件和目录设置访问控制列表。一种是默认 ACL (default ACLs),只能针对目录设置。如果目录中的文件没有设置 ACL,它就会使用该目录的默认 ACL. 首先我来讲一下getfacl ( 显示文件或目录的 ACL) 在我的电脑里首先有一个用户叫NEU.我们学校的简称.同时还有一个用户,software,我的专业名称. 我以neu用户进行操作,在其目录下建立一个文件fileofneu. 可以看到它的初始权限为-rw-rw-r–然后我把这个文件权限进行下修改.使用的命令为chmod,修改后的文 件权限为-rw-rw----现在这个文件的权限就不允许其它用户访问了. 然后切换到sofeware用户,来证实这个文件的不可访问性. 下面我们就通过getfacl命令来查看.这时候得进入neu用户下操作了.其命令格式很简单:getfacl fileofneu 权限一目了然.不多介绍了,下面就要用Setfacl来进行修改了.使其在对于其它用户的权限里,只对 software用户只读只写. setfacl -m u:softeware:rw- fileofneu setfacl -R -m u:softeware:rw- fileofneu (-R 一定要在 -m 前面,表示目录下所有文件) setfacl -x u:softeware fileofneu (去掉单个权限) setfacl -b (去掉所有 acl 权限) 如果我们希望在一个目录中新建的文件和目录都使用同一个预定的ACL,那么我们可以使用默认(Default) ACL。在对一个目录设置了默认的ACL以后,每个在目录中创建的文件都会自动继承目录的默认ACL作为自 己的ACL。用setfacl的-d选项就可以做到这一点: [root@FC3-vm mnt]# setfacl -d --set g:testg1:rwx dir1 [root@FC3-vm mnt]# getfacl dir1

然后用getfacl命令来进行查看.我们就可以看到多了一行user:software:rw- 这说明其对用户software开 放了读写的权限. 为了证实其可用性,再切换到software用户下访问这个文件,发现与前面不同的是,这回可以读写了. 今天就讲这一个吧,讲多了,大家也记不住. 对了,刚才我进行了一下这个操作,发现进不去,原来是我没有给software用户授与访问/home/neu这个目 录的进入的权力,所以,我们还得应用 setfacl命令来使得software用户拥有进入这个目录的权力.其操作与上 面基本一致。

用户身份切换
Su
命令作用
代码语言:javascript复制
su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
使用方式
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
参数说明
-f , – fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
-l , – login:加了这个参数之后,就好像是重新登陆一样,大部分环境变量(例如HOME、SHELL
和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定USER,缺省情况是root。
-m, -p ,–preserve-environment:执行su时不改变环境变数。
-c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
  • help 显示说明文件
  • version 显示版本资讯 USER:欲变更的使用者账号, ARG: 传入新的Shell参数。 例子 su -c ls root 变更帐号为 root 并在执行 ls 指令后退出变回原使用者。 [user1@centos6 ~]$ su - root -c “head -n 3 /etc/passwd” 对于命令参数要加上引号 su [用户名] a>在root用户下, 输入 su 普通用户. 则切换至普通用户, 从root切换到变通用户不需要密码 b>在普通用户下, 输入 su [用户名] 提示 password: 输入用户的PASSWORD, 则切换至该用户
Sudo

/etc/sudoers 谁能作什么的一个列表,Sudo能用需要在这个文件中定义 #visudo 增加如下,加%代表用户组,ALL=(ALL)表示登录者的来源主机名,最后的ALL代表可执行 的命令。NOPASSWD代表不需要密码直接可运行Sudo,限制多命令一定要写绝对路径,用逗号分开,多行用 ‘’,用!代表不能执行 %aixi ALL=(ALL) NOPASSWD: ALL %aixi ALL=(ALL) NOPASSWD: /bin/ls,/bin/mkdir,/bin/rmdir, /usr/bin/who,!/usr/bin/passwd root

查询用户命令
W
可显示开机多久,当前登录的所有用户,平均负载
Who
显示当前登录的所有用户
Last
显示每个用户最后的登录时间
Lastlog
显示每个用户最后的登录时间

四、 文件权限

1 、文件类型
代码语言:javascript复制
Linux广泛的被很多用户所接受,它强大的功能受到很多人喜欢,Linux文件一般是用一些相关的应
用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。Linux文件的删除方式是用rm 命
令。
Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的
比如file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大
多是常规文件(也被称为普通文件)。
Linux文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等;现在我们
进行一个简要的说明;
1 普通文件
  1. [root@localhost ~]# ls -lh install.log
  2. -rw-r–r-- 1 root root 53K 03 -16 08:54 install.log 我 们用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r–r-- ,值得注意的是第一个符号是 - , 这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文 档工具、归档工具… … 或 cp工具等。这类文件的删除方式是用rm 命令; 2 目录
  3. [root@localhost ~]# ls -lh
  4. 总计 14M
  5. -rw-r–r-- 1 root root 2 03-27 02:00 fonts.scale
  6. -rw-r–r-- 1 root root 53K 03- 16 08:54 install.log
  7. -rw-r–r-- 1 root root 14M 03 -16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
  8. drwxr-xr-x 2 1000 users 4.0K 04 -04 23:30 mkuml-2004.07.17
  9. drwxr-xr-x 2 root root 4.0K 04 -19 10:53 mydir
  10. drwxr-xr-x 2 root root 4.0K 03 -17 04:25 Public 当 我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较 特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一 个目录复制为另一个目录。删除用rm 或rmdir命令。 3 字符设备或块设备文件

如时您进入/dev目录,列一下文件,会看到类似如下的;

  1. [root@localhost ~]# ls -la /dev/tty
  2. crw-rw-rw- 1 root tty 5, 0 04- 19 08:29 /dev/tty
  3. [root@localhost ~]# ls -la /dev/hda1
  4. brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1 我们看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等 串口设备 我们看到 /dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光 驱等设备; 这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,我们一般不 用自己来创建设备文件。因为这些文件是和内核相关联的。 4 套接口文件 当我们启动MySQL服务器时,会产生一个mysql.sock的文件。
  5. [root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
  6. srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock 注意这个文件的属性的第一个字符是 s。我们了解一下就行了。 5 符号链接文件
  7. [root@localhost ~]# ls -lh setup.log
  8. lrwxrwxrwx 1 root root 11 04 -19 11:18 setup.log - > install.log 当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过 ln -s 源文件名 新文件名。上面是一个例子,表示setup.log是install.log的软链接文件。怎么理解呢? 这和Windows操作系统中的快捷方式有点相似。 符号链接文件的创建方法举例;
  9. [root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm
  10. -rw-r–r-- 1 root root 14M 03- 16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
  11. [root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm
  12. [root@localhost ~]# ls -lh kernel*
  13. -rw-r–r-- 1 root root 14M 03- 16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
  14. lrwxrwxrwx 1 root root 33 04 -19 11:27 kernel.rpm - > kernel-6.15-1.2025_FC5
2 、文件权限

Linux系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性,Linux 系统对不同用户访问同一文件的权限做了不同的规定。 对于一个Linux系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限, 分别用r、w和x表示。不同的用户具有不同的读、写和执行的权限。 对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在 Linux系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文 件所有者的同组用户和其它用户。因此,Linux系统按文件所有者、文件所有者同组用户和其它用户三 类规定不同的文件访问权限。 权限的概念 Linux文件系统安全模型是通过给系统中的文件赋予两个属性来起作用的,这两个赋予每个文件的 属性称为所有者(ownership)和访问权限(access rights)。Linux下的每一个文件必须严格地属于一个用户和 一个组。 下图是在我机器上的/root目录下运行ls -l命令的情况。

代码语言:javascript复制
-rw-r--r--
这些符号用来描述文件的访问权限类别,也就是常说的文件权限。这些访问权限指导Linux根据文
件的用户和组所有权来处理所有访问文件的用户请求。总共有 10 种权限属性,因此一个权限列表总是
10 个字符的长度。它的格式遵循下列规则:
◆ 第 1 个字符表示一种特殊的文件类型。其中字符可为d(表示该文件是一个目录)、b(表示该文件
是一个系统设备,使用块输入/输出与外界交互,通常为一个磁盘)、c(表示该文件是一个系统设备,使
用连续的字符输入/输出与外界交互,如串口和声音设备),“.”表示该文件是一个普通文件,没有特殊
属性。
◆ 2 ~ 4 个字符用来确定文件的用户(user)权限, 5 ~ 7 个字符用来确定文件的组(group)权限, 8 ~ 10
个字符用来确定文件的其它用户(other user,既不是文件所有者,也不是组成员的用户)的权限。其中,
2 、 5 、 8 个字符是用来控制文件的读权限的,该位字符为r表示允许用户、组成员或其它人可从该文件
中读取数据。短线“-”则表示不允许该成员读取数据。与此类似, 3 、 6 、 9 位的字符控制文件的写权
限,该位若为w表示允许写,若为“-”表示不允许写。 4 、 7 、 10 位的字符用来控制文件的制造权限,
该位若为x表示允许执行,若为“-”表示不允许执行。
任何列在/etc/passwd文件中的用户都可以是一个文件的所有者,也称为该文件的用户。同样任何
列在/etc/group文件中的组都可以是文件组的所有者,也简称为文件的组。
drwxrwxr-- 2 root root 4096 2月 11 10:36 guo
因为guo的第 1 个位置的字符是d,所以由此知道guo是一个目录。第 2 至 4 位置上的属性是rwx,
表示用户root拥有权限列表显示guo中所有的文件、创建新文件或者删除guo中现有的文件,或者将
guo作为当前工作目录。第 5 至 7 个位置上的权限是rwx,表示root组的成员拥有和root一样的权限。
第 8 至 10 位上的权限仅是r--,表示不是root的用户及不属于root组的成员只有对guo目录列表的权
限。这些用户不能创建或者删除guo中的文件、执行junk中的可执行文件,或者将junk作为他们的当
前工作目录。
代码语言:javascript复制
-rwxr-xr-- 1 user admin 20480 11月 11 09:23 Readme.txt
在该项中,第 1 个位置是短线“-”,表示该文件是一个普通文件,没有特殊属性。该文件对任何人
都可读,只对user可写,user和admin的组成员可以执行该文件。
另外需要注意的是,当用户访问一个文件时,权限检查是从左到右的。假设上述的readme.txt文件
具有以下权限:
-r--rw-r--
那么即使user是属于admin组的一个成员,也不能对该文件进行写操作,因为已经被左边的写权
限设置拒绝了。

一般文件权限读(R), 写 (W),执行(X)权限比较简单。一般材料上面都

有介绍。这里介绍一下一些特殊的文件权限——SUID,SGID,Stick bit。

如果你检查一下/usr/bin/passwd和/tmp/的文件权限你就会发现和普

通的文件权限有少许不同,如下图所示:

这里就涉及到SUID和Stick bit。

SUID和SGID

我们首先来谈一下passwd程序特殊的地方。大家都知道,Linux把用户的密码信息存放 在/etc/shadow里面,该文件属性如下:

可以看到Shadow 的只有所有者可读写,所有者是root,所以该文件对普通用户是不可读写的。但是普通用户调 用passwd程序是可以修改自己的密码的,这又是为什么呢?难道普通用户可以读写shadow 文件?难道Linux有漏洞?当然不是啦。password可以修改shadow文件的原因是他设置了 SUID文件权限。

SUID文件权限作用于可执行文件。一般的可执行文件在执行期的所有者是当前用户,比 如当前系统用户是simon,simon运行程序 a.out,a.out执行期的所有者应该是simon。但是 如果我们给可执行文件设置了SUID权限,则该程序的执行期所有者,就是该文件所有者。还 以 前面的a.out为例,假如a.out设置了SUID,并且其所有者是root,系统当前用户是simon, 当simon运行a.out的时 候,a.out在运行期的所有者就是root,这 时 a.out可以存取只有root 权限才能存取的资源,比如读写shadow文件。当a.out执行结束 的时候当前用户的权限又回 到了simon的权限了。

passwd就是设置了SUID权限,并且passwd的所有者是root,所以所有的用户都可以 执行他,在passwd运行期,程序获得临时的root权限,这时其可以存取shadow文件。当passwd 运行完成,当前用户又回到普通权限。

同理,设置程序的SGID,可以使程序运行期可以临时获得所有者组的权限。在团队开发 的时候,这个文件权限比较有用,一般系统用SUID比较多。

SGID可以用于目录,当目录设置了SGID之后,在该目录下面建立的所有文件和目录都 具有和该目录相同的用户组。

Stick bit(粘贴位)

对程序,该权限告诉系统在程序完成后在内存中保存一份运行程序的备份,如该程序常 用,可为系统节省点时间,不用每次从磁盘加载到内存。Linux当前对文件没有实现这个功能, 一些其他的UNIX系统实现了这个功能。

Stick bit可以作用于目录,在设置了粘贴位的目录下面的文件和目录,只有所有者和root 可以删除他。现在我们可以回头去看看/tmp/目录的情况,这个目录 设置了粘贴位。所以说, 并且所有人都可以对该目录读写执行( 777 ),这样意味着所有人都可以在/tmp/下面创建临时

目录。因为设置Stick bit只有所有者和root才能删除目录。这样普通用户只能删除属于自己 的文件,而不能删除其他人的文件。如下图所示:

设置SUID,SGID,Stick bit

前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的 权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字 更改权限的方式为“ 3 个数 字”的组合,那么,如果在这 3 个数字之前再加上一个数字,最前面的数字就表示这几个属性 了(注:通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有 SUID、SGID及Sticky bit)。 4 为SUID 2 为SGID 1 为Sticky bit 假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在 原先的 755 之前还要加上 4 ,也就是使用“chmod 4755 filename”来设置。

SUID也可以用“chmod u s filename”来设置,“chmod u-s filename”来取消SUID设 置;同样,SGID可以用“chmod g s filename”,“chmod g-s filename”来取消SGID设置。

一般来说,使用过Linux的同学都知道,Linux文件的权限有rwx,所有者、所有组、其它用户的rwx权限 是彼此独立的。为此,经常会听到如果某个web文件需要被修改的话,需要加上 777 的权限,这就是让所有 用户可写。

但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例如/tmp目录默认权限是 777 , 而且有些文件也是允许所有用户访问修改的,那么是不 是任何一个用户都可以将这些删除呢?再如 /etc/shadow保存的是用户密码文件,默认情况下它的权限是 640 ,那么只有shadow的 owner(root)才能修 改它,按照常规理解,这是不可理解的,因为每个用户都可能修改密码,也就是会修改这个文件。

为了把这些情况解释清楚,需要引入Linux特殊文件权限的概念。Linux特殊文件权限有三个玩意: sticky bit、SGID、SUID,以下一一道来。

sticky bit

sticky bit只对目录有效,使目录下的文件,只有文件拥有者才能删除(如果他不属于owner,仅属于 group或者other,就算他有w权限,也不能删除文件)。

加sticky bit的方法:

chmod o t /tmp或者

chmod 1777 /tmp

查看是否加了sticky bit,用ls -l,可以看到有类似这样的权限:“-rwxrwxrwt”,t就代表已经加 上了sticky bit,而且生效了,如果显示的是“-rwxrwxrwT”,说明也已经加上了sticky bit,但没有生 效(因为本来other就没有写的权限)。

看看/tmp目录的权限,就是drwxrwxrwt吧

SGID(The Set GroupID )

加上SGID的文件,表示运行这个程序时,是临时以这个文件的拥有组的身份运行的;加上SGID的文件 夹,表示在这个目录下创建的文件属于目录所有的组,而不是创建人所在的组,在这个目录下创建的目录继 承本目录的SGID。

加SGID的方法:

chmod g s /tmp或

chmod 2777 /tmp

查看是否加了SGID,用ls -l,可以看到类似这样的权限“drwxrwsrwx”,s就代表已经加上了SGID, 而且生效,如果显示“drwxrwSrwx”,说明已经加上了SGID,但没有生效(因为本来group就没有执行的 权限)。

SUID(The Set UserID)

SUID与SGID是一样的,惟一不同的是,运行时是以这个文件的拥有者身份来运行。

加SUID的方法:

chmod o s /tmp或

chmod 4777 /tmp

同样的,加了SUID的文件权限有这类似这两种: “drwsrwxrwx”、“drwSrwxrwx”。

看看passwd命令的权限:ll /usr/bin/passwd,是"-rwsr-x-rx",终于知道为什么执行passwd时,可 以修改/etc/shadow文件了吧

SUID:置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S. SGID:置于 g 的 x 位,原位置有执行权限,就置为 s,没有了为 S. STICKY:粘滞位,置于 o 的 x 位,原位置有执行权限,就置为 t ,否则为T.

3 、超级权限控制
在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root用户都能完

成,所以也被称之为超级管理用户。 在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。root 用户的特权性还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内); 对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系 统管理的需要(因为root是系统中权限最高的特权用户);

3.1 、对超级用户和普通用户的理解
3.1.1、什么是超级用户;

在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为 0 的用户被系统约定为是具有超级权限。超级用 户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理的所有工具;我们可以通过/etc/passwd 来查得 UID为 0 的用户是root,而且只有root对应的UID为 0 ,从这一点来看,root用户在系统中是无可替代的至高地位和无限制 权限。root用户在系统中就是超级用户;

3.1. 2 、理解 UID 和用户的对应关系

当系统默认安装时,系统用户和UID 是一对一的对关系,也就是说一个UID 对应一个用户。我们知道用户身份是通过UID 来 确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的UID 的解说中有谈到“UID 是确认用户权限的标识, 用户登录系统所处的角色是通过UID 来实现的,而非用户名;把几个用户共用一个UID 是危险的,比如我们把普通用户的 UID 改为 0 ,和root共用一个UID ,这事实上就造成了系统管理权限的混乱。如果我们想用root权限,可以通过su或sudo 来实现;切不可随意让一个用户和root分享同一个UID ;”

在系统中,能不能让UID 和用户是一对多的关系?是可以的,比如我们可以把一个UID为 0 这个值分配给几个用户共同使用, 这就是UID 和用户的一对多的关系。但这样做的确有点危险;相同UID的用户具有相同的身份和权限。比如我们在系统中把 beinan这个普通用户的UID改为 0 后,事实上这个普通用户就具有了超级权限,他的能力和权限和root用户一样;用户beinan 所有的操作都将被标识为root的操作,因为beinan的UID为0,而UID为 0 的用户是root ,是不是有点扰口?也可以理解为 UID为 0 的用户就是root ,root用户的UID就是 0 ;

UID和用户的一对一的对应关系 ,只是要求管理员进行系统管理时,所要坚守的准则,因为系统安全还是第一位的。所以我 们还是把超级权限保留给root这唯一的用户是最好的选择;

如果我们不把UID的 0 值的分享给其它用户使用,只有root用户是唯一拥有UID=0的话,root用户就是唯一的超级权限用户;

3.1. 3 、普通用户和伪装用户

与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户;但为了完成特定的任务,普 通用户和伪装用户也是必须的;Linux是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用 户所分配的权限也不同;这也是Linux系统比Windows系统更为安全的本质所在,即使是现在最新版本的Windows 2003 , 也无法抹去其单用户系统的烙印;

3.2. 超级用户(权限)在系统管理中的作用

超级权限用户(UID为 0 的用户)到底在系统管理中起什么作用呢?主要表现在以下两点;

3.2. 1 、对任何文件、目录或进程进行操作;

但值得注意的是这种操作是在系统最高许可范围内的操作;有些操作就是具有超级权限的root也无法完成;

比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是root也无能为力;它的权限如下

[root@localhost ~]# pwd /root [root@localhost ~]# cd / [root@localhost /]# ls -ld /proc/ dr- xr-xr-x 134 root root 0 2005-10-27 /proc/ 就是这个目录,只能是读和执行权限,但绝对没有写权限的;就是我们把/proc 目录的写权限打开给root,root用户也是不能 进行写操作;

[root@localhost ~]# chmod 755 /proc [root@localhost /]# ls -ld /proc/ drwxr-xr-x 134 root root 0 2005-10-27 /proc/ [root@localhost /]# cd /proc/ [root@localhost proc]# mkdir testdir mkdir: 无法创建目录‘testdir’: 没有那个文件或目录

3.2. 2 、对于涉及系统全局的系统管理;

硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等…如果您执行某个命令或工具时,提示您无权限,大多 是需要超级权限来完成;

比如用adduser来添加用户,这个只能用通过超级权限的用户来完成;

3.2. 3 、超级权限的不可替代性;

由于超级权限在系统管理中的不可缺少的重要作用,为了完成系统管理任务,我们必须用到超级权限;在一般情况下,为了 系统安全,对于一般常规级别的应用,不需要root用户来操作完成,root用户只是被用来管理和维护系统之用;比如系统日 志的查看、清理,用户的添加和删除…

在不涉及系统管理的工作的环境下,普通用户足可以完成,比如编写一个文件,听听音乐;用gimp 处理一个图片等… 基 于普通应用程序的调用,大多普通用户就可以完成;

当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,比如对系统日志的管理,添加 和删除用户。而如何才能不直接以root登录,却能从普通用户切换到root用户下才能进行操作系统管理需要的工作,这就涉 及到超级权限管理的问题;

获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过su和sudo 来解决;

3.3 、使用 su 命令临时切换用户身份;
3.3. 1 、su 的适用条件和威力

su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan 用户没有这个权限,而这个权限恰恰由root所拥有。解决办法无法有两个,一是退出beinan用户,重新以root用户登录, 但这种办法并不是最好的;二是我们没有必要退出beinan用户,可以用su来切换到root下进行添加用户的工作,等任务完 成后再退出root。我们可以看到当然通过su 切换是一种比较好的办法;

通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户 切换到其它任何用户都需要密码验证;

3.3. 2 、su 的用法:

su [OPTION选项参数] [用户] -, -l, --login 登录并改变到所切换的用户环境;

-c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境; 至于更详细的,请参看man su ;

3.3. 3 、su 的范例:

su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但 并没有改变root登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL定义等;

[beinan@localhost ~]$ su Password: [root@localhost beinan]# pwd /home/beinan su 加参数 - ,表示默认切换到root用户,并且改变到root用户的环境;

[beinan@localhost ~] pwd /home/beinan [beinan@localhost ~] su - Password: [root@localhost ~]# pwd /root su 参数 - 用户名

[beinan@localhost ~] su - root 注:这个和su - 是一样的功能; Password: [root@localhost ~]# pwd /root [beinan@localhost ~] su - linuxsir 注:这是切换到 linuxsir用户 Password: 注:在这里输入密码; [linuxsir@localhost ~] pwd 注:查看用户当前所处的位置; /home/linuxsir [linuxsir@localhost ~] id 注:查看用户的UID和GID信息,主要是看是否切换过来了; uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir) [linuxsir@localhost ~] [beinan@localhost ~] su - -c ls 注:这是su的参数组合,表示切换到root用户,并且改变到root环境,然后列出 root家目录的文件,然后退出root用户; Password: 注:在这里输入root的密码; anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot [beinan@localhost ~] pwd 注:查看当前用户所处的位置; /home/beinan [beinan@localhost ~] id 注:查看当前用户信息; uid=500(beinan) gid=500(beinan) groups=500(beinan)

3.3. 4 、su的优缺点;

su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都 能切换到root来完成所有的系统管理工作;

但通过su切换到root后,也有不安全因素;比如系统有 10 个用户,而且都参与管理。如果这 10 个用户都涉及到超级权限 的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这 10 个用户;如果这

10 个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想Windows吧,简 直就是恶梦;

“没有不安全的系统,只有不安全的人”,我们绝对不能保证这 10 个用户都能按正常操作流程来管理系统,其中任何一人对系 统操作的重大失误,都可能导致系统崩溃或数据损失;

所以su 工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用 户受限的使用;

超级用户root密码应该掌握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;

3.4 、 sudo 授权许可使用的 su ,也是受限制的 su
3.4.1. sudo 的适用条件;

由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su 来切换 到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最 好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作, 这时我们就有必要用到 sudo。

通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的 su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的 su;

sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份 执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;

3.4. 2 、从编写 sudo 配置文件/etc/sudoers开始;

sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退 出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;

/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以 用号来续行,这样看来一个规则也可以拥有多个行;

/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;

3.4. 3 、/etc/sudoers 配置文件中别名规则

别名规则定义格式如下:

Alias_Type NAME = item1, item2, … 或

Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 别名类型(Alias_Type):别名类型包括如下四种

Host_Alias 定义主机别名;

User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)

Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;

Cmnd_Alias 定义命令别名;

NAME 就是别名了,NMAE的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如SYNADM、SYN_ADM 或SYNAD0是合法的,sYNAMDA或1SYNAD是不合法的;

item 按中文翻译是项目,在这里我们可以译成成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员 在必须是有效并事实存在的。什么是有效的呢?比如主机名,可以通过w查看用户的主机名(或ip地址),如果您只是本地 机操作,只通过hostname 命令就能查看;用户名当然是在系统中存在的,在/etc/paswd中必须存在;对于定义命令别名, 成员也必须在系统中事实存在的文件名(需要绝对路径);

item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的 成员相配。我们用Host_Alias定义主机别名时,成员必须是与主机相关相关联,比如是主机名(包括远程登录的主机名)、 ip地址(单个或整段)、掩码等;当用户登录时,可以通过w命令来查看登录用户主机信息;用User_Alias和Runas_Alias 定义时,必须要用系统用户做为成员;用Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名可以用通配 符表示,配置Cmnd_Alias时命令需要绝对路径;

其中 Runas_Alias 和User_Alias 有点相似,但与User_Alias 绝对不是同一个概念,Runas_Alias 定义的是某个系统用户 可以sudo 切换身份到Runas_Alias 下的成员;我们在授权规则中以实例进行解说;

别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过来续行;同一类型别名的定义,一次也可以定义几 个别名,他们中间用:号分隔,

Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24 注:定义主机别名HT01,通过=号列 出成员 Host_Alias HT02=st09,st10 注:主机别名HT02,有两个成员; Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st 10 注:上面的两条对 主机的定义,可以通过一条来实现,别名之间用:号分割; 注:我们通过Host_Alias 定义主机别名时,项目可以是主机名、可以是单个ip(整段ip地址也可以),也可以是网络掩码; 如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。那什么才算是通过主机名相 互通信或访问呢?比如 ping 主机名,或通过远程访问主机名来访问。在我们局域网中,如果让计算机通过主机名访问通信, 必须设置/etc/hosts,/etc/resolv.conf ,还要有DNS做解析,否则相互之间无法通过主机名访问;在设置主机别名时,如果 项目是中某个项目是主机名的话,可以通过hostname 命令来查看本地主机的主机名,通过w命令查来看登录主机是来源, 通过来源来确认其它客户机的主机名或ip地址;对于主机别名的定义,看上去有点复杂,其实是很简单。

如果您不明白Host_Alias 是怎么回事,也可以不用设置主机别名,在定义授权规则时通过ALL来匹配所有可能出现的主机情 况。如果您把主机方面的知识弄的更明白,的确需要多多学习。

User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注:定义用户别名,下有四个成员;要在系统中确实在存在的; User_Alias NETAD=beinan,bnnb 注:定义用户别名NETAD ,我想让这个别名下的用户来管理网络,所以取了NETAD的 别名; User_Alias WEBMASTER=linuxsir 注:定义用户别名WEBMASTER,我想用这个别名下的用户来管理网站; User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注:上面三行的别名 定义,可以通过这一行来实现,请看前面的说明,是不是符合? Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod 注意:命令别名下的成员必须是文件或目录的绝对路径; Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/network Cmnd_Alias KILL = /usr/bin/kill Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, /usr/local/bin/tcsh, /usr/bin/rsh, /usr/local/bin/zsh 注:这行定义命令别名有点长,可以通过 号断行;

Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin 在上面的例子中,有KILL和PWMAG的命令别名定义,我们可以合并为一行来写,也就是等价行;

Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注:这一行就代表了KILL和PWMAG 命令别名,把KILL和PWMAG的别名定义合并在一行写也是可以的; Runas_Alias OP = root, operator Runas_Alias DBADM=mysql:OP = root, operator 注:这行是上面两行的等价行;至于怎么理解Runas_Alias ,我们必须 得通过授权规则的实例来理解;

3.4. 4 、/etc/sudoers中的授权规则:

授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户, 其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的;

授权规则并不是无章可寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看man sudoers

授权用户 主机=命令动作 这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密 码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略;举例说明;

实例一:

beinan ALL=/bin/chown,/bin/chmod 如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;

值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root 用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码。

为了更详细的说明这些,我们可以构造一个更复杂一点的公式;

授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]…

注解:

凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有 空格;

在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的 目的用户必须用()号括起来,比如(ALL)、(beinan)

实例二:

beinan ALL=(root) /bin/chown, /bin/chmod 如果我们把第一个实例中的那行去掉,换成这行;表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root 下执行 /bin/chown ,可以切换到任何用户招执行/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运 行的命令;

实例三:

beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod

如果换成这个例子呢?表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown ,不需 要输入beinan用户的密码;并且可以切换到任何用户下执行/bin/chmod 命令,但执行chmod时需要beinan输入自己的密 码;通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;

关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要 输入自己密码,所以要在执行动作之前加入NOPASSWD: 参数;

有可能有的弟兄对系统管理的命令不太懂,不知道其用法,这样就影响了他对 sudoers定义的理解,下面我们再举一个最简 单,最有说服务力的例子;

实例四:

比如我们想用beinan普通用户通过more /etc/shadow文件的内容时,可能会出现下面的情况;

[beinan@localhost ~]$ more /etc/shadow /etc/shadow: 权限不够 这时我们可以用sudo more /etc/shadow 来读取文件的内容;就就需要在/etc/soduers中给beinan授权;

于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ;(比如我们是以beinan用户登录系统的)

[beinan@localhost ~]$ su Password: 注:在这里输入root密码 下面运行visodu; [root@localhost beinan]# visudo 注:运行visudo 来改 /etc/sudoers 加入如下一行,退出保存;退出保存,在这里要会用vi,visudo也是用的vi编辑器;至于vi的用法不多说了;

beinan ALL=/bin/more 表示beinan可以切换到root下执行more 来查看文件; 退回到beinan用户下,用exit命令;

[root@localhost beinan]# exit exit [beinan@localhost ~]$ 查看beinan的通过sudo能执行哪些命令?

[beinan@localhost ~]$ sudo -l Password: 注:在这里输入beinan用户的密码 User beinan may run the following commands on this host: 注:在这里清晰的说明在本台主机上,beinan用户可以以 root权限运行more ;在root权限下的more ,可以查看任何文本文件的内容的; (root) /bin/more 最后,我们看看是不是beinan用户有能力看到/etc/shadow文件的内容;

[beinan@localhost ~]$ sudo more /etc/shadow beinan 不但能看到 /etc/shadow文件的内容,还能看到只有root权限下才能看到的其它文件的内容,比如;

[beinan@localhost ~]$ sudo more /etc/gshadow 对于beinan用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;

beinan ALL=/bin/more /etc/shadow 题外话:有的弟兄会说,我通过su 切换到root用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述sudo 的用法吗?如果主机上有多个用户并且不知道root用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权 了;这就是sudo的好处;

实例五:练习用户组在/etc/sudoers中写法;

如果用户组出现在/etc/sudoers 中,前面要加%号,比如�inan ,中间不能有空格;

�inan ALL=/usr/sbin/,/sbin/ 如果我们在 /etc/sudoers 中加上如上一行,表示beinan用户组下的所有成员,在所有可能的出现的主机名下,都能切换到 root用户下运行 /usr/sbin和/sbin目录下的所有命令;

实例六:练习取消某类程序的执行;

取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;

beinan ALL=/usr/sbin/,/sbin/,!/usr/sbin/fdisk 注:把这行规则加入到/etc/sudoers中;但您得有beinan这个用 户组,并且beinan也是这个组中的才行; 本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外;

[beinan@localhost ~]$ sudo -l

Password: 注:在这里输入beinan用户的密码;

User beinan may run the following commands on this host:

(root) /usr/sbin/*

(root) /sbin/*

(root) !/sbin/fdisk

[beinan@localhost ~]$ sudo /sbin/fdisk -l

Sorry, user beinan is not allowed to execute ‘/sbin/fdisk -l’ as root on localhost.

注:不能切换到root用户下运行fdisk 程序;

实例七:别名的运用的实践;

假如我们就一台主机localhost,能通过hostname 来查看,我们在这里就不定义主机别名了,用ALL来匹配所有可能出现的 主机名;并且有beinan、linuxsir、lanhaitun 用户;主要是通过小例子能更好理解;sudo虽然简单好用,但能把说的明白的 确是件难事;最好的办法是多看例子和man soduers ;

User_Alias SYSADER=beinan,linuxsir,�inan User_Alias DISKADER=lanhaitun Runas_Alias OP=root Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za- z]*,!/usr/bin/passwd root Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk ; SYSADER ALL= SYDCMD,DSKCMD DISKADER ALL=(OP) DSKCMD 注解:

第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;

第二行:定义用户别名 DISKADER ,成员有lanhaitun

第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root

第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密 码;

第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;

第六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义 的命令。更为明确遥说,beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd, 但不能更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;

beinan,linuxsir,�inan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A- Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk 第七行:表示授权DISKADER 下的所有成员,能以OP的身份,来运行 DSKCMD ,不需要密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:

lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk 可能有的弟兄会说我想不输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令,那应该把把NOPASSWD: 加在哪里为好?理解下面的例子吧,能明白的;

SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD

3.4. 5 、/etc/sudoers中其它的未尽事项;

在授权规则中,还有 NOEXEC:和EXEC的用法,自己查man sudoers 了解;还有关于在规则中通配符的用法,也是需要了 解的。这些内容不多说了,毕竟只是一个入门性的文档。soduers配置文件要多简单就有多简单,要多难就有多难,就看自己 的应用了。

3.4. 6 、sudo的用法;

我们在前面讲的/etc/sudoers 的规则写法,最终的目的是让用户通过sudo读取配置文件中的规则来实现匹配和授权,以便替 换身份来进行命令操作,进而完成在其权限下不可完成的任务;

我们只说最简单的用法;更为详细的请参考man sudo

sudo [参数选项] 命令

-l 列出用户在主机上可用的和被禁止的命令;一般配置好/etc/sudoers后,要用这个命令来查看和测试是不是配置正确的;

-v 验证用户的时间戳;如果用户运行sudo 后,输入用户的密码后,在短时间内可以不用输入口令来直接进行sudo 操作; 用-v 可以跟踪最新的时间戳;

-u 指定以以某个用户执行特定操作;

-k 删除时间戳,下一个sudo 命令要求用求提供密码;

举列:

首先我们通过visudo 来改/etc/sudoers 文件,加入下面一行;

beinan,linuxsir,�inan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A- Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk 然后列出beinan用户在主机上通过sudo 可以切换用户所能用的命令或被禁止用的命令;

[beinan@localhost ~]$ sudo -l 注:列出用户在主机上能通过切换用户的可用的或被禁止的命令; Password: 注:在这里输入您的用户密码; User beinan may run the following commands on this host: (root) /bin/chown 注:可以切换到root下用chown命令; (root) /bin/chmod 注:可以切换到root下用chmod命令; (root) /usr/sbin/adduser 注:可以切换到root下用adduser命令; (root) /usr/bin/passwd [A-Za-z]* 注:可以切换到root下用 passwd 命令;

(root) !/usr/bin/passwd root 注:可以切换到root下,但不能执行passwd root 来更改root密码; (root) /sbin/parted 注:可以切换到 root下执行parted ; (root) /sbin/fdisk 注:可以切换到root下执行 fdisk ; 通过上面的sudo -l 列出可用命令后,我想通过chown 命令来改变/opt目录的属主为beinan ;

[beinan@localhost ~] ls -ld /opt 注:查看/opt的属主; drwxr-xr-x 26 root root 4096 10月 27 10:09 /opt 注:得到的答案是归属root用户和root用户组; [beinan@localhost ~] sudo chown beinan:beinan /opt 注:通过chown 来改变属主为beinan用户和beinan用户组; [beinan@localhost ~]

对于一个普通用户来说,除了更改自身的口令以外,他不能更改其它用户的口令。但如果换到root身份执行命令,则可以更 改其它用户的口令;

比如在系统中有linuxsir这个用户, 我们想尝试更改这个用户的口令,

[beinan@localhost ~] passwd linuxsir 注:不通过sudo 直接运行passwd 来更改linuxsir用户的口令; passwd: Only root can specify a user name. 注:失败,提示仅能通过 root来更改; [beinan@localhost ~] sudo passwd linuxsir 注:我们通过/etc/sudoers 的定义,让beinan切换到root下执行 passwd 命令来改变linuxsir的口令; Changing password for user linuxsir. New UNIX password: 注:输入新口令; Retype new UNIX password: 注:再输入一次; passwd: all authentication tokens updated successfully. 注:改变成功;

后记:

本文是用户管理的文档的重要组成部份,我计划在明天开始写用户管理控制工具,比如 useradd、userdel、usermod ,也就 是管理用户的工具介绍;当然我还会写用户查询工具等与用户管理相关的

4 、权限命令
4.1 、 chmod

文件或者目录的用户能够使用chmod命令修改文件的权限。Chmod命令有两种方式:一种是字符方 式,使用字符来修改文件的权限;另外一种是数字方式,使用 3 个数字的组合来修改文件的权限。 使用方式 : chmod [-cfvR] [–help] [–version] mode file… 说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以借以控制档 案如何被他人所调用。 参数 : mode : 权限设定字串,格式如下 : [ugoa…][[±=][rwxX]…][,…],其中 u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表 示这三者皆是。

  • 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定 过为可执行。 -c : 若该档案权限确实已经更改,才显示其更改动作

-f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) –help : 显示辅助说明 –version : 显示版本 范例 : 将档案 file1.txt 设为所有人皆可读取 : chmod ugo r file1.txt 将档案 file1.txt 设为所有人皆可读取 : chmod a r file1.txt 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不 可写入 : chmod ug w,o-w file1.txt file2.txt 将 ex1.py 设定为只有该档案拥有者可以执行 : chmod u x ex1.py 将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a r * 数字方式的基本语法是:chmod nnn 文件 其中第 1 、 2 、 3 个n分别表示用户、组成员和所有其它用户。各个位置上的n要么是一个 0 ,或者是一 个由赋予权限的相关值相加得到的单个阿拉伯数字之和。这些数字的意义如表 1 所示。 值 表示的意义 4 表示文件或者目录的读权限 2 表示文件或者目录的写权限 1 表示文件或者目录的执行权限 很显然,当使用数字方式时,这 3 个数字必须为 0 至 7 中的一个。 若要rwx属性则4 2 1=7; 若要rw-属性则4 2=6; 若要r-x属性则4 1=7。 范例: chmod a=rwx file 和 chmod 777 file 效果相同 chmod ug=rwx,o=x file 和 chmod 771 file 效果相同 若用chmod 4755 filename可使此程序具有root的权限

4.2 、 umask
很显然,系统中各种文件的权限设置对特定用户的数据安全有很大影响。但是要求用户逐一明确设

置系统中每个文件的权限也是不现实的,为此,需要使用umask命令,该命令可以为用户账号中新文 件的创建进行缺省设置。系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的文件具有 所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。具体来说,umask是用来设置权限掩 码的,权限掩码由 3 个数字组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时默认的权限。 语 法:umask [-S][权限掩码] 补充说明:umask可用来设定[权限掩码]。[权限掩码]是由 3 个八进制的数字所组成,将现有的存 取权限减掉权限掩码后,即可产生建立文件时预设的权限。 参 数: -S 以文字的方式来表示权限掩码。 登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应的改变直到退 出该s h e l l或使用另外的u m a s k命令之前一直有效。一般来说,u m a s k命令是在/ e t c / p r o f i l e 文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的u m a s k,可以在 该文件中加入相应的条目。如果希望永久性地设置自己的u m a s k值,那么就把它放在自己$ H O M E 目录下的. p r o f i l e或. b a s h _ p r o f i l e文件中。 如何计算umask值

u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用 户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是 6 。系统不允许你 在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限。目录则允许 设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到 7 。该命令的一般形式为: umask nnn 其中n n n为u m a s k置0 0 0 - 7 7 7。 计算u m a s k值:可以有几种计算u m a s k值的方法,通过设置u m a s k值,可以为新创建的文 件和目录设置缺省权限。 例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢? 第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。 第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。 第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。稍加练习 就能够记住这种方法。 第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。 这就是上面的例子,其中u m a s k值为0 0 2:

  1. 文件的最大权限rwx rwx rwx (777)
  2. umask值为0 0 2 - - - - - - -w-
  3. 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
  4. 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限 系统默认的umask码是 0022 也就是:目录 755(rwx,rx,rx) ,文件:644(rw,r,r) 。 umask码的换算 0022 0755 = 0777 对应默认目录权限 反之 0777 - 0755 = 0022 0022 0644 0111 = 0777 对应默认文件权限 反之 0777 - 0111 - 0644 = 0022 哈哈~~ 简单吧!假如我们要将默认目录权限设置为 744 那么对应的umask 是 0777 - 0744 = 0033 ,然后执行umask 0033命令就将umask码改成 0033 了。 下面是另外一个例子,假设这次u m a s k值为0 2 2:
  5. 文件的最大权限rwx rwx rwx (777) 2 ) u m a s k值为0 2 2 - - - -w- -w-
  6. 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
  7. 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限 下面是常用的u m a s k值及对应的文件和目录权限 umask值 目录 文件 0 2 2 7 5 5 6 4 4 0 2 7 7 5 0 6 4 0 0 0 2 7 7 5 6 6 4 0 0 6 7 7 1 6 6 0 0 0 7 7 7 0 6 6 0 如果想知道当前的umask 值,可以使用u m a s k命令:如果想要改变u m a s k值,只要使用u m a s k命令设置一个新的值即可: $ umask 002 确认一下系统是否已经接受了新的u m a s k值:在使用u m a s k命令之前一定要弄清楚到底希望 具有什么样的文件/目录创建缺省权限。否则可能会得到一些非常奇怪的结果;例如,如果将u m a s k 值设置为6 0 0,那么所创建的文件/目录的缺省权限就是0 6 6!除非你有特殊需要,否则没有必要去管 他,系统默认的值“ 022 ”umask是用的掩码,至于掩码的概念,从基础学吧,这里不说了。
代码语言:javascript复制
linux中的文件/目录许可是用 4 位八进制数表示的。其中第一个八进制数用来表示特殊许可设置,
第二个数字用来设置文件所有者的许可,第三个数字用来设置组许可,第四个数字用来设置所有人的许
可。
例如,root的权限为 777 ,若权限掩码设为 022 ,那么两都相减后可得 755 。下面是在我的系统更
改umask的一些情况:
[root@linuxserver root]# umask
022
上述命令显示表示我的系统的umask值为 022 。
[root@linuxserver root]# umask -S
u=rwx,g=rx,o=rx
当umask值为 022 时,默认情况下各用户的权限。注意这里的参数“S”是大写。
[root@linuxserver root]# umask 177
[root@linuxserver root]# umask -S
u=rw,g=,o=
上述两行命令把umask值改为 177 ,结果只有文件所有者具有读写文件的权限,其它用户不能访问
该文件。这显然是一种非常安全的状态。
4.3 、 chown

chown 命令用途更改与文件关联的所有者或组。 语法chown[ -f ] [ -h] [ -R ] Owner [ :Group ] { File … | Directory … } 描述chown命令将 File 参数指定的文件的所有者更改为 Owner 参数指定的用户。Owner 参数的值可 以是可在 /etc/passwd 文件中找到的用户标识或登录名。还可以选择性地指定组。Group 参数的值可以是可 在 /etc/group 文件中找到的组标识或组名。 只有 root 用户可以更改文件的所有者。只在您是 root 用户或拥有该文件的情况下才可以更改文件的 组。如果拥有文件但不是 root 用户,则只可以将组更改为您是其成员的组。 虽然 -H、-L 和 -P 标志是互斥的,指定不止一个也不认为是错误。指定的最后一个标志确定命令拟稿 将演示的操作。 参数: -f 禁止除用法消息之外的所有错误消息。 -h 更改遇到的符号链接的所有权,而非符号链接指向的文件或目录的所有权。 当遇到符号链接而您未 指定 -h 标志时,chown 命令更改链接指向的文件或目录的所有权,而非链接本身的所有权。如果指定 -R 标志,chown 命令递归地降序指定的目录。-H 如果指定了 -R 选项,并且引用类型目录的文件的符 号链接在命令行上指定,chown 变量会更改由符号引用的目录的用户标识(和组标识,如果已指定) 和所有在该目录下的文件层次结构中的所有文件。 -L 如果指定了 -R 选项,并且引用类型目录的文件的符号在命令行上指定或在遍历文件层次结构期间遇 到,chown 命令会更改由符号链接引用的目录的用户标识(和组标识,如果已指定)和在该目录之下 的文件层次结构中的所有文件。 -P 如果指定了 -R 选项并且符号链接在命令行上指定或者在遍历文件层次结构期间遇到,则如果系统 支持该操作,则 chown 命令会更改符号链接的所有者标识(和组标识,如果已指定)。chown 命令不 会执行至文件层次结构的任何其它部分的符号链接。 -R 递归地降序目录,更改每个文件的所有权。当遇到符号链接并且链接指向目录时,更改该目录的所 有权,但不进一步遍历目录。不过 -h、-H、-L or -P 标志也未指定,则当遇到符号链接并且该链接指向 到目录时,该目录的组所有权更改但不会进一步遍历目录。 安全性访问控制:此程序应该作为“可信计 算基”中的正常用户程序安装。退出状态该命令返回以下出口值: 0 命令执行成功并已执行所有请求的 更改。 >0 发生错误。

示例:

要更改文件 program.c 的所有者: chown jim program.cprogram.c的用户访问权限现在应用到 jim。作 为所有者,jim 可以使用 chmod命令允许或拒绝其他用户访问 program.c。 要将目录 /tmp/src 中所有文件的所有者和组更改为用户 john 和组 build: chown -R john:build /tmp/src文件 将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie : chown jessie:users file1.txt 将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport : chmod -R lamport:users *

4.4 、 chgrp
功能说明:变更文件或目录的所属群组。

语 法:chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–reference=<参 考文件或目录>][–version][文件或目录…] 补充说明:在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指 令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。 参 数: -c或–changes 效果类似"-v"参数,但仅回报更改的部分。 -f或–quiet或–silent 不显示错误信息。 -h或–no-dereference 只对符号连接的文件作修改,而不更动其他任何相关文件。 -R或–recursive 递归处理,将指定目录下的所有文件及子目录一并处理。 -v或–verbose 显示指令执行过程。 –help 在线帮助。 –reference=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相 同。 –version 显示版本信息。 范例: [root@linux ~]# chgrp users install.log [root@linux ~]#ls –l -rw-r–r-- 1 root users 28490 Jun 25 08:53 install.log [root@linux ~]#chgrp testing install.log chgrp:invalid group name ‘testing’ <==出现错误信息~找不到这个用户组名~ 发现了吗?文件的用户组被改成了users了,但要改成testing的时候,就会发生错误。注意,出现错误信 息后,要检查错误信息的内容。

五、 目录结构

目录结构及主要内容“/”根目录部分有以下子目录:
代码语言:javascript复制
◆/usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个
目录也包含你的Linux发行版本的主要的应用程序,譬如,Netscape。
◆/var 目录包含在正常操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式
化文件等。这个目录中存放着那些不断在扩充着的东西,为了保持/usr的相对稳定,那些经常被修改的
目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在
/var/log目录中。

◆/home 目录包含用户的文件:参数设置文件、个性化文件、文档、数据、EMAIL、缓存数据等。这个 目录在系统省级时应该保留。 ◆/proc 目录整个包含虚幻的文件。它们实际上并不存在磁盘上,也不占用任何空间。(用ls –l 可以 显示它们的大小)当查看这些文件时,实际上是在访问存在内存中的信息,这些信息用于访问系统 ◆/bin 系统启动时需要的执行文件(二进制),这些文件可以被普通用户使用。 ◆/sbin 系统执行文件(二进制),这些文件不打算被普通用户使用。(普通用户仍然可以使用它们,但 要指定目录。) ◆/etc 操作系统的配置文件目录。 ◆/root 系统管理员(也叫超级用户或根用户)的Home目录。 ◆/dev 设备文件目录。LINUX下设备被当成文件,这样一来硬件被抽象化,便于读写、网络共享以及 需要临时装载到文件系统中。正常情况下,设备会有一个独立的子目 录。这些设备的内容会出现在独 立的子目录下。LINUX没有所谓的驱动符。 ◆/lib 根文件系统目录下程序和核心模块的共享库。 ◆/boot 用于自举加载程序(LILO或GRUB)的文件。当计算机启动时(如果有多个操作系统,有可能 允许你选择启动哪一个操作系统),这些文件首先被装载。这个目录也会包含LINUX核(压缩文件vmlinuz), 但LINUX核也可以存在别处,只要配置LILO并且LILO知道LINUX核在哪儿。 ◆/opt 可选的应用程序,譬如,REDHAT 5.2下的KDE (REDHAT 6 .0下,KDE放在其它的XWINDOWS应 用程序中,主执行程序在/usr/bin目录下) ◆/tmp 临时文件。该目录会被自动清理干净。 ◆/lost found 在文件系统修复时恢复的文件 ◆/usr目录下比较重要的部分有: ◆/usr/X11R6 X-WINDOWS系统(version 11, release 6) ◆/usr/X11 同/usr/X11R6 (/usr/X11R6的符号连接) ◆/usr/X11R6/bin 大量的小X-WINDOWS应用程序(也可能是一些在其它子目录下大执行文件的符号连 接 )。 ◆/usr/doc LINUX的文档资料(在更新的系统中,这个目录移到/usr/share/doc)。 ◆/usr/share 独立与你计算机结构的数据,譬如,字典中的词。 ◆/usr/bin和/usr/sbin 类似与“/”根目录下对应的目录(/bin和/sbin),但不用于基本的启动(譬如, 在紧急维护中)。大多数命令在这个目录下。 ◆/usr/local 本地管理员安装的应用程序(也可能每个应用程序有单独的子目录)。在“main”安装后, 这个目录可能是空的。这个目录下的内容在重安装或升级操作系统后应该存在。 ◆/usr/local/bin 可能是用户安装的小的应用程序,和一些在/usr/local目录下大应用程序的符号连接。 ◆/proc目录的内容: ◆/proc/cpuinfo 关于处理器的信息,如类型、厂家、型号和性能等。 ◆/proc/devices 当前运行内核所配置的所有设备清单。 ◆/proc/dma 当前正在使用的DMA通道。/proc/filesystems 当前运行内核所配置的文件系统。 ◆/proc/interrupts 正在使用的中断,和曾经有多少个中断。 ◆/proc/ioports 当前正在使用的I/O端口。 举例,使用下面的命令能读出系统的CPU信息。 cat /proc/cpuinfo

代码语言:javascript复制
/bin bin是binary的缩写。这个目录沿袭了UNIX系统的结构,存放着使用者最经常使
用的命令。例如cp、ls、cat,等等。
/boot 这里存放的是启动Linux时使用的一些核心文件。
代码语言:javascript复制
/dev dev是device(设备)的缩写。这个目录下是所有Linux的外部设备,其功能类似
DOS下的.sys和Win下的.vxd。在 Linux中设备和文件是用同种方法访问的。例如:
/dev/hda代表第一个物理IDE硬盘。
/etc 这个目录用来存放系统管理所需要的配置文件和子目录。
/home 用户的主目录,比如说有个用户叫wang,那他的主目录就是/home/wang也可以
用~wang表示。
/lib 这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll
文件。几乎所有的应用程序都须要用到这些共享库。
/lost found 这个目录平时是空的,当系统不正常关机后,这里就成了一些无家可归的文件的
避难所。对了,有点类似于DOS下的.chk文件。
/mnt 这个目录是空的,系统提供这个目录是让用户临时挂载别的文件系统。
/proc 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个
目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里。
/root 系统管理员(也叫超级用户)的主目录。作为系统的拥有者,总要有些特权啊!
比如单独拥有一个目录。
/sbin s就是Super User的意思,也就是说这里存放的是系统管理员使用的管理程序。
/tmp 这个目录不用说,一定是用来存放一些临时文件的地方了。

/usr (^) 这是最庞大的目录,我们要用到的应用程序和文件几乎都存放在这个目录下。其 中包含以下子目录; /usr/X11R6 存放X-Window的目录; /usr/bin 存放着许多应用程序; /usr/sbin 给超级用户使用的一些管理程序就放在这里; /usr/doc 这是Linux文档的大本营; /usr/include (^) Linux下开发和编译应用程序需要的头文件,在这里查找; /usr/lib 存放一些常用的动态链接共享库和静态档案库; /usr/local 这是提供给一般用户的/usr目录,在这里安装软件最适合; /usr/man (^) man在Linux中是帮助的同义词,这里就是帮助文档的存放目录; /usr/src Linux开放的源代码就存在这个目录,爱好者们别放过哦! /var 这个目录中存放着那些不断在扩充着的东西,为了保持/usr的相对稳定,那些经 常被修改的目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺 带说一下系统的日志文件就在/var/log目录中。

总结来说:

◆用户应该将文件存在/home/user_login_name目录下(及其子目录下)。 ◆本地管理员大多数情况下将额外的软件安装在/usr/local目录下并符号连接在/usr/local/bin下的主执 行程序。 ◆系统的所有设置在/etc目录下。 ◆不要修改根目录(“/”) 或/usr目录下的任何内容,除非真的清楚要做什么。这些目录最好和LINUX 发布时保持一致。

代码语言:javascript复制
◆大多数工具和应用程序安装在目录:/bin, /usr/sbin, /sbin, /usr/x11/bin,/usr/local/bin。
◆所有的文件在单一的目录树下。没有所谓的“驱动符”。

六、 软件安装

RPM

RPM软件的安装、删除、更新只有root权限才能使用;对于查询功能任何用户都可以操作;如果普通 用户拥有安装目录的权限,也可以进行安装。 初始化rpm 数据库 通过rpm 命令查询一个rpm 包是否安装了,也是要通过rpm 数据库来完成的;所以我们要经常用下面 的两个命令来初始化rpm 数据库; [root@localhost beinan]# rpm --initdb [root@localhost beinan]# rpm --rebuilddb 注:这个要花好长时间; 注:这两个参数是极为有用,有时rpm系统出了问题,不能安装和查询,大多是这里出了问题; /var/lib/rpm目录下的数据库记录所有软件的升级需求,记录已经安装的所有软件,数字证书记录等,这 个目录下的文件非常重要。

RPM 软件包管理的查询功能:
命令格式
代码语言:javascript复制
rpm {-q|-- query} [select-options] [query-options]
RPM的查询功能是极为强大,是极为重要的功能之一;举几个常用的例子,更为详细的具体的,请参考
#man rpm

1 、查询系统已安装的软件;

代码语言:javascript复制
语法:rpm -q 软件名
举例:
[root@localhost beinan]# rpm –q gaim
gaim-1.3.0-1.fc4
-q就是 -- query ,中文意思是“问”,此命令表示的是,是不是系统安装了gaim ;如果已安装会有
信息输出;如果没有安装,会输出gaim 没有安装的信息;查看系统中所有已经安装的包,要加 -a 参
数;
[root@localhost RPMS]# rpm -qa
如果分页查看,再加一个管道 |和more命令;
[root@localhost RPMS]# rpm -qa |more
在所有已经安装的软件包中查找某个软件,比如说 gaim ;可以用 grep 抽取出来;
[root@localhost RPMS]# rpm -qa |grep gaim
上面这条的功能和 rpm -q gaim 输出的结果是一样的;
等 37448

2 、查询一个已经安装的文件属于哪个软件包;

代码语言:javascript复制
语法 rpm -qf 文件名 注:文件名所在的绝对路径要指出举例:
[root@localhost RPMS]# rpm -qf /usr/lib/libacl.la
libacl-devel-2.2.23-8

3 、查询已安装软件包都安装到何处;

代码语言:javascript复制
语法:rpm -ql 软件名 或 rpm rpmquery -ql 软件名
举例:
代码语言:javascript复制
[root@localhost RPMS]# rpm -ql lynx
[root@localhost RPMS]# rpmquery -ql lynx

4 、查询一个已安装软件包的信息

代码语言:javascript复制
语法格式: rpm -qi 软件名
举例:
[root@localhost RPMS]# rpm -qi lynx

5 、查看一下已安装软件的配置文件;

代码语言:javascript复制
语法格式:rpm -qc 软件名
举例:
[root@localhost RPMS]# rpm -qc lynx

6 、查看一个已经安装软件的文档安装位置:

代码语言:javascript复制
语法格式: rpm -qd 软件名
举例:
[root@localhost RPMS]# rpm -qd lynx

7 、查看一下已安装软件所依赖的软件包及文件;

代码语言:javascript复制
语法格式: rpm -qR 软件名
举例:
[root@localhost beinan]# rpm -qR rpm -python
查询已安装软件的总结:对于一个软件包已经安装,我们可以把一系列的参数组合起来用;比如 rpm
-qil ;比如:
[root@localhost RPMS]# rpm -qil lynx
对已安装软件包查询的一点补充;
代码语言:javascript复制
[root@localhost RPMS]# updatedb
[root@localhost RPMS]# locate 软件名或文件名
通过updatedb,我们可以用 locate 来查询一些软件安装到哪里了;系统初次安装时要执行updatedb ,
每隔一段时间也要执行一次;以保持已安装软件库最新;updatedb 是slocate软件包所有;如果您没
有这个命令,就得安装slocate ;举例:
[root@localhost RPMS]# locate gaim
对于未安装的软件包的查看:

查看的前提是您有一个.rpm 的文件,也就是说对既有软件file.rpm的查看等;

1 、查看一个软件包的用途、版本等信息;

代码语言:javascript复制
语法: rpm -qpi file.rpm
举例:
[root@localhost RPMS]# rpm -qpi lynx-2.8.5-23.i386.rpm

2 、查看一件软件包所包含的文件;

代码语言:javascript复制
语法: rpm -qpl file.rpm
举例:
[root@localhost RPMS]# rpm -qpl lynx-2.8.5-23.i386.rpm
3 、查看软件包的文档所在的位置;
代码语言:javascript复制
语法: rpm -qpd file.rpm
举例:
[root@localhost RPMS]# rpm -qpd lynx-2.8.5-23.i386.rpm

4 、查看一个软件包的配置文件;

代码语言:javascript复制
语法: rpm -qpc file.rpm
举例:
[root@localhost RPMS]# rpm -qpc lynx-2.8.5-23.i386.rpm

5 、查看一个软件包的依赖关系

代码语言:javascript复制
语法: rpm -qpR file.rpm
举例:
[root@localhost archives]# rpm -qpR yumex_0.42-3.0.fc4_noarch.rpm
/bin/bash
/usr/bin/python
config(yumex) = 0.42-3.0.fc4
pygtk2
pygtk2-libglade
rpmlib(CompressedFileNames) <= 3.0.4- 1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
usermode
yum >= 2.3.2
软件包的安装、升级、删除等;

1 、安装和升级一个 rpm 包;

[root@localhost beinan]#rpm -vih file.rpm 注:这个是用来安装一个新的rpm 包; [root@localhost beinan]#rpm -Uvh file.rpm 注:这是用来升级一个rpm 包; 如果有依赖关系的,请解决依赖关系,其实软件包管理器能很好的解决依赖关系,请看前面的软件包管理器 的介绍;如果您在软件包管理器中也找不到依赖关系的包;那只能通过编译他所依赖的包来解决依赖关系, 或者强制安装;语法结构: [root@localhost beinan]# rpm -ivh file.rpm --nodeps --force [root@localhost beinan]# rpm -Uvh file.rpm --nodeps --force 更多的参数,请查看 man rpm 举例应用: [root@localhost RPMS]# rpm -ivh lynx-2.8.5-23.i386.rpm Preparing… ########################################### [100%] 1:lynx ########################################### [100%] [root@localhost RPMS]# rpm -ivh --replacepkgs lynx-2.8.5-23.i386.rpm Preparing… ########################################### [100%] 1:lynx ########################################### [100%] 注: --replacepkgs 参数是以已安装的软件再安装一次;有时没有太大的必要;测试安装参数 --test , 用来检查依赖关系;并不是真正的安装; [root@localhost RPMS]# rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm Preparing… ########################################### [100%]

由新版本降级为旧版本,要加 --oldpackage 参数; [root@localhost RPMS]# rpm -qa gaim gaim-1.5.0-1.fc4 [root@localhost RPMS]# rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm Preparing… ########################################### [100%] 1:gaim ########################################### [100%] [root@localhost RPMS]# rpm -qa gaim gaim-1.3.0-1.fc4 为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中; [root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm Preparing… ########################################### [100%] 1:gaim ########################################### [100%] [root@localhost RPMS]# ls /opt/ gaim 为软件包指定安装目录:要加 -relocate 参数;下面的举例是把lynx-2.8.5-23.i386.rpm 指定安装在 /opt/lynx 目录中; [root@localhost RPMS]# rpm -ivh --relocate /=/opt/lynx --badreloc lynx-2.8.5-23.i386.rpm Preparing… ########################################### [100%] 1:lynx ########################################### [100%] 我们安装在指定目录中的程序如何调用呢?一般执行程序,都放在安装目录的bin或者sbin目录中;看下 面的例子;如果有错误输出,就做相应的链接,用 ln -s ; [root@localhost RPMS]# /opt/lynx/usr/bin/lynx Configuration file /etc/lynx.cfg is not available. [root@localhost RPMS]# ln -s /opt/lynx/etc/lynx.cfg /etc/lynx.cfg [root@localhost RPMS]# /opt/lynx/usr/bin/lynx http://www.linuxsir.org RPM管理包管理器支持网络安装和查询; 比如我们想通过 Fedora Core 4.0 的一个镜像查询、安装软件包;地址: http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/ 举例:命令格式: rpm 参数 rpm包文件的http或者ftp的地址

rpm -qpi http://mirrors.kernel.org/fedora/core/4/i386/os/

Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm

rpm -ivh http://mirrors.kernel.org/fedora/core/4/i386/os/

Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm

2 、删除一个 rpm 包;

首先您要学会查询rpm 包 ;请看前面的说明; [root@localhost beinan]#rpm -e 软件包名 举例:我想 移除lynx 包,完整的操作应该是: [root@localhost RPMS]# rpm -e lynx 如果有依赖关系,您也可以用–nodeps 忽略依赖的检查来删除。但尽可能不要这么做,最好用软件包管理 器 systerm-config-packages 来删除或者添加软件; [root@localhost beinan]# rpm -e lynx --nodeps

RPM 验证与数字证书:
导入签名:

[root@localhost RPMS]# rpm --import 签名文件 举例: [root@localhost fc40]# rpm --import RPM-GPG-KEY [root@localhost fc40]# rpm --import RPM-GPG-KEY -fedora RPM验证作用是使用/var/lib/rpm下面的数据库内容来比较目前linux系统的环境下的所有软件文件,也就 是说当你有数据不小心丢失,或者不小心修改到某个软件的文件内容,就用这个简单的方法验证一下原本的 文件系统 #rpm –Va 列出目前系统上面所有可能被改动过的文件

从 rpm 软件包抽取文件;

命令格式: rpm2cpio file.rpm |cpio -div 举例: [root@localhost RPMS]# rpm2cpio gaim-1.3.0-1.fc4.i386.rpm |cpio -div 抽取出来的文件就在当用操作目录中的 usr 和etc中;其实这样抽到文件不如指定安装目录来安装软件来 的方便;也一样可以抽出文件;为软件包指定安装目录:要加 -relocate 参数;下面的举例是把 gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中; [root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm Preparing… ########################################### [100%] 1:gaim ########################################### [100%] [root@localhost RPMS]# ls /opt/ gaim 这样也能一目了然;gaim的所有文件都是安装在 /opt/gaim 中,我们只是把gaim 目录备份一下,然后卸 掉gaim;这样其实也算提取文件的一点用法;

RPM 的配置文件;

RPM包管理,的配置文件是 rpmrc ,我们可以在自己的系统中找到;比如Fedora Core 4.0中的rpmrc 文 件位于; [root@localhost RPMS]# locate rpmrc /usr/lib/rpm/rpmrc /usr/lib/rpm/redhat/rpmrc 我们可以通过 rpm --showrc 查看;具体的还得我们自己来学习。呵。。。不要问我,我也不懂;只要您 看了这篇文章,认为对您有用,您的水平就和我差不多;咱们水平是一样的,所以我不能帮助您了;请 理解。

YUM
YUM 配置文件

创建容器,位置在 /etc/yum.repos.d ,扩展名必须是 .repo

代码语言:javascript复制
#cd /etc/yum.repos.d
#vim yum.repo 新建一个仓库文件,名字可以随便定义,在文件中写如下内容
[base] #代表容器名称,中括号一定要存在,里面的名字可随便取
name=base #说明这个容器的意义,随便写都可以
baseurl=ftp://192.168.0.6/pub/Server #192. 168. 0. 6是你的YUM源地址,这个很重要。
enabled=1 #是否启动,=0则不启动,不启动就无法使用该源
gpgcheck=0 #是否验证. 可不要
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release #验证的密钥. 可不要

命令 :#yum repolist all 显示目前所使用的容器有哪些 如果查询出来的容器,status为disabled,要将配置文件,如上enabled=1

/etc/yum.conf

yum.conf 这个配置文件主要是 yum 客户端使用,里面主要规定了要去用的 rpm 包的 yum 服务器的信 息。 [main] #main开头的块用于对客户端进行配置,在main后也可以指定yum源(不推荐这样做),与 /etc/yum.repo.d中指定yum源相同 cachedir=/var/cache/yum #cachedir:yum缓存的目录,yum在此存储下载的rpm包和数据库,一般是/var/cache/yum。 keepcache=0 #0表示不保存下载的文件, 1 表示保存下载的文件,默认为不保存 debuglevel=2 #debuglevel:除错级别, 0 ──10,默认是 2 貌似只记录安装和删除记录 logfile=/var/log/yum.log #指定yum的日志文件 pkgpolicy=newest #包的策略,如果配置多了yum源,同一软件在不同的yum源中有不同版本, newest则安装最新版本,该值为lastest,则yum会将服务器上ID按照字母序排列,选择最后那个服务器上 的软件安装 distroverpkg=centos-release #指定一个软件包,yum会根据这个包判断你的发行版本,默认是redhat-release,也可以是安装的任何 针对自己发行版的rpm包。 tolerant=1 #tolerent,也有 1 和 0 两个选项,表示yum是否容忍命令行发生与软件包有关的错误,比如你要安装 1,2,3三个包,而其中 3 此前已经 安装了,如果你设为1,则yum不会出现错误信息。默认是 0 。 exactarch=1 #exactarch,有两个选项 1 和0,代表是否只升级和你安装软件包cpu体系一致的包,如果设为 1 ,则如 你安装了一个i386的rpm,则yum不会用i686的包来升级。 retries=20 #retries,网络连接发生错误后的重试次数,如果设为 0 ,则会无限重试。 obsoletes=1 gpgcheck=1 #gpgchkeck= 有 1 和 0 两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认是检查的。 pl ugins = 1 #是否启用插件,默认 1 为允许, 0 表示不允许 reposdir=/etc/yy.rm #默认是 /etc/yum.repos.d/ 低下的 xx.repo后缀文件 #默认都会被include 进来 也就是说 /etc/yum.repos.d/xx.repo 无论配置文件有多少个 每个里面有多少 个[name]最后其实都被整合到 一个里面看就是了 重复的[name]应该是前面覆盖后面的–还是后面的覆盖前 面的呢?enabled 测试是后面覆盖前面 exclude=xxx #exclude 排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安 装了诸如美化包,中文补丁的朋友特别有用。 keepcache=[1 or 0] #设置 keepcache=1,yum 在成功安装软件包之后保留缓存的头文件 (headers) 和软件包。默认值为 keepcache=0 不保存 reposdir=[包含 .repo 文件的目录的绝对路径] #该选项用户指定 .repo 文件的绝对路径。.repo 文件包含软件仓库的信息 (作用与 /etc/yum.conf 文件 中的 [repository] 片段相同)。中

YUM 命令

用YUM安装删除软件yum install xxx,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲 突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或 删除冲突的包,你可以自己作出判断。 删除的命令是,yum remove xxx,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。

YUM 安装软件包

命令:yum install

YUM 删除软件包

命令:yum remove 用YUM查询软件信息,我们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又 不能确切知道它的名字。这时yum的查询功能就起作用了。你可以用yum search keyword这样的命令来进 行搜索,比如我们要则安装一个Instant Messenger,但又不知到底有哪些,这时不妨用yum search messenger 这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于是 我们可能得到gaim,kopete等等,并从中选择。有时我们还会碰到安装了一个包,但又不知道其用途,我 们可以用yum info packagename这个指令来获取信息。 1.使用YUM查找软件包 命令:yum search 2.列出所有可安装的软件包 命令:yum list 3.列出所有可更新的软件包 命令:yum list updates 4.列出所有已安装的软件包 命令:yum list installed 5.列出所有已安装但不在 Yum Repository 內的软件包 命令:yum list extras 6.列出所指定的软件包 命令:yum list 7.使用YUM获取软件包信息 命令:yum info 8.列出所有软件包的信息 命令:yum info 9.列出所有可更新的软件包信息 命令:yum info updates 10.列出所有已安裝的软件包信息 命令:yum info installed 11.列出所有已安裝但不在 Yum Repository 內的软件包信息 命令:yum info extras 12.列出软件包提供哪些文件 命令:yum provides

清除 YUM 缓存

yum会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间, 可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清 除下载的rpm包,yum clean all一股脑儿端 1.清除缓存目录(/var/cache/yum)下的软件包 命令:yum clean packages 2.清除缓存目录(/var/cache/yum)下的 headers 命令:yum clean headers 3.清除缓存目录(/var/cache/yum)下旧的 headers 命令:yum clean Oldheaders 4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers 命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)

七、 时间管理

1 、 Linux 时间介绍:
代码语言:javascript复制
Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟
是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在
BIOS中进行设置。当Linux启动时,硬件时钟会去读取系统时钟的 设置,然后系统时钟就会独立
于硬件运作。
Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和
设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一个就行,只不
过clock命令除了支持x86硬 件体系外,还支持Alpha硬件体系。
2 、 Linux 时间设置命令
2.1 、 date:
代码语言:javascript复制
语法格式:date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help]
[--version] [ FORMAT] [MMDDhhmm[[CC]YY][.ss]]
说明: 可用来设置系统日期与时间。只有管理员才有设置日期与时间的权限,一般用户只能用
date命令显示时间。若不加任何参数,data会显示目前的日期与时间。
例 1 :显示当前系统时间
[root@Test2 ~]# date
2010 年 06 月 17 日 星期四 00:00:04 CST
例 2 :设置日期和时间为 2010 年 6 月 18 号12:00
[root@Test2 ~]# date -s "20100618 12:00:00"
2010 年 06 月 18 日 星期五 12:00:00 CST
例 3 :设置日期为 2010 年年 6 月 18 号
[root@Test2 ~]# date -s 20100618
2010 年 06 月 18 日 星期五 00:00:00 CST
例 4 :设置时间为12:00:00

[root@Test2 ~]# date 12:00:00 date: invalid date “12:00:00” 例 5 :显示时区 [root@Test2 ~]# date -R Thu, 17 Jun 2010 00:01:36 0800 或者: [root@Test2 ~]# cat /etc/sysconfig/clock

The ZONE parameter is only evaluated by system-config-date.

The timezone of the system is defined by the contents of /etc/localtime.

ZONE=“Asia/Shanghai” UTC=true ARC=false

2.2 、 hwclock/clock

语法格式:hwclock [–adjust][–debug][–directisa][–hctosys][–show][–systohc][–test] [–utc][–version][–set --date=<日期与时间>] 参数: –adjust hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用–adjust参数,可使hwclock 根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。 –debug 显示hwclock执行时详细的信息。 –directisa hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令 来存取硬件时钟。 –hctosys 将系统时钟调整为与目前的硬件时钟一致。 –set --date=<日期与时间> 设定硬件时钟。 –show 显示硬件时钟的时间与日期。 –systohc 将硬件时钟调整为与目前的系统时钟一致。 –test 仅测试程序,而不会实际更改硬件时钟。 –utc 若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。 –version 显示版本信息。 例 1 :查看硬件时间

hwclock --show

或者

clock --show

2 :设置硬件时间

hwclock --set --date=“07/07/06 10:19” (月/日/年 时:分:秒)

或者

clock --set --date=“07/07/06 10:19” (月/日/年 时:分:秒)

3 :硬件时间和系统时间的同步 按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,但是在不重新启动的时候,需 要用hwclock或clock命令实现同步。 硬件时钟与系统时钟同步:

hwclock --hctosys(hc代表硬件时间,sys代表系统时间)

或者

clock –hctosys

4 :系统时钟和硬件时钟同步:

代码语言:javascript复制
# hwclock --systohc
或者
# clock –systohc
例 5 :强制将系统时间写入 CMOS ,使之永久生效,避免系统重启后恢复成原时间
# clock –w
或者
# hwclock -w
2.3 、时区的设置

tzselect

Please identify a location so that time zone rules can be set correctly. Please select a continent or ocean.

  1. Africa
  2. Americas
  3. Antarctica
  4. Arctic Ocean
  5. Asia
  6. Atlantic Ocean
  7. Australia
  8. Europe
  9. Indian Ocean
  10. Pacific Ocean
  11. none - I want to specify the time zone using the Posix TZ format. #? 输入 5 ,亚洲 Please select a country.
  12. Afghanistan 18) Israel 35) Palestine
  13. Armenia 19) Japan 36) Philippines
  14. Azerbaijan 20) Jordan 37) Qatar
  15. Bahrain 21) Kazakhstan 38) Russia
  16. Bangladesh 22) Korea (North) 39) Saudi Arabia
  17. Bhutan 23) Korea (South) 40) Singapore
  18. Brunei 24) Kuwait 41) Sri Lanka
  19. Cambodia 25) Kyrgyzstan 42) Syria
  20. China 26) Laos 43) Taiwan
  21. Cyprus 27) Lebanon 44) Tajikistan
  22. East Timor 28) Macau 45) Thailand
  23. Georgia 29) Malaysia 46) Turkmenistan
  24. Hong Kong 30) Mongolia 47) United Arab Emirates
  25. India 31) Myanmar (Burma) 48) Uzbekistan
  26. Indonesia 32) Nepal 49) Vietnam
  27. Iran 33) Oman 50 ) Yeme n
  28. Iraq 34) Pakistan #? 输入 9 ,中国 Please select one of the following time zone regions.
  29. east China - Beijing, Guangdong, Shanghai, etc.
  30. Heilongjiang
  31. central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
  32. Tibet & most of Xinjiang Uyghur
  33. southwest Xinjiang Uyghur #? 输入 1 ,北京时间 The following information has been given: China east China - Beijing, Guangdong, Shanghai, etc. Therefore TZ=‘Asia/Shanghai’ will be used. Local time is now: Fri Jul 7 10:32:18 CST 2006. Universal Time is now: Fri Jul 7 02:32:18 UTC 2006. Is the above information OK? 1 ) Ye s
  34. No #? 输入 1 ,确认 如果不用tzselect命令,可以修改文件变更时区。

vi /etc/sysconfig/clock

Z/Shanghai(查/usr/share/zoneinfo下面的文件) UTC=false ARC=false

rm /etc/localtime

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重新启动即可。

2.4 、图形界面设置时区命令 timeconfig
2.5 、时间同步
例 1 :同步时间

ntpdate 210.72.145.44 (210.72.145.44是中国国家授时中心的官方服务器)

2 :定时同步时间

crontab –e添加脚本例子如下:

/20 * * * * /usr/sbin/ntpdate 210.72.145.44 //每 20 分钟执行一次 30 5 * * * /usr/sbin/ntpdate 210.72.145.44 //每天早晨 5 点半执行 ※ 前面五个号代表五个数字,数字的取值范围和含义如下:分钟(0-59) 小 時(0-23) 日 期(1-31) 月份(1-12) 星期( 0 -6)//0代表星期天设定完毕后,可使用# crontab –l 查看上面的设定。

八、 启动引导

1 、 Linux 的启动流程
1) BIOS 自检
2) 启动 GRUB/LILO
代码语言:javascript复制
3) 运行 Linux kernel 并检测硬件
4) 挂载根文件系统
5) 运行 Linux 系统的第一个进程 init(其 PID 永远为 1 ,是所有其它进程的父进程)
6) init 读取系统引导配置文件 /etc/inittab 中的信息进行初始化
代码语言:javascript复制
7) 执行系统初始化脚本- /etc/rc.d/rc.sysinit,执行系统初始化(包括很多内容)
8) 根据指定的运行级别(runlevel)来运行服务器脚本程序,再执行脚本 /etc/rc.d/rc.local
9) 运行一些其他的特别服务,一般为 /sbin/mingetty 和 /etc/X11/prefdm
10) Linux 控制台(console)提示用户输入用户名、密码进行登陆。
总结:BIOS初始化检查外围设备检查启动设备读区MBR
2 、在 Linux 中常用的启动引导工具: grub 和 lilo

在Linux和WINDOWS两系统并存时就需要安装GRUB(Grand Unified Bootloader),GRUB被广泛地 用于替代lilo,GRUB支持在启动时使用命令行模式,支持md5加密保护 还可以从ext2/ext3、ReiseFS、JFS、 FAT、minix及FFS文件系统上启动其配置文件为/boot/grub/grub.conf,更改grub.conf即可立时生效如果 硬盘上的MBR被更动过,可以用/sbin/grub-install /dev/hda来重安装grub现在我们打开 /boot/grub/grub.conf查看一下

vim /boot/grub/grub.conf

内容如下:

grub.conf generated by anaconda

Note that you do not have to rerun grub after making changes to this file

NOTICE: You have a /boot partition. This means that

all kernel and initrd paths are relative to /boot/, eg.

root (hd0,0)

kernel /vmlinuz-ve rsion ro root=/dev/sda2

initrd /initrd-version.img

#boot=/dev/sda default=0 #default=0表示默认启动第一个系统,如果系统有两个系统是用什么做为分隔符的呢?title就是系统的分 隔符,第一个title后面就是第一个系统,用 0 表示。 timeout=5 #timout=5,就是默认在启动选择界面停留的时间,单位是秒。等待 5 秒自动进入默认操作系统 splashimage=(hd0,0)/grub/splash.xpm.gz #splashimage是grub启动背景画面,如果是自己写grub.conf文件,这个可以不用写。 hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-53.el5) #title后面就是系统在启动时候显示的名字 root (hd0,0) #root 启动文件所在位置 kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet #kernel 内核所在位置和名字 initrd /initrd-2.6.18-53.el5.img #initrd内核镜象的名字 grub.conf的范例: timeout=10 #等待 10 秒自动进入默认操作系统 splashimage=(hd0,0)/grub/splash.xpm.gz #grub启动背景画面 default=0 #默认进入第一个标题 title Red Hat Linux (2.4.20-18) #Red Hat Linux标题 root (hd0,0) #根文件系统位置 kernel /vmlinuz-2.4.20-18 ro root=LABEL=/ #核心位置与核心加载参数 initrd /initrd-2.4.20-18.img #启动initrd ram盘 title windows #另一个操作系统的标题 rootnoverify (hd0,1) #操作系统存放在hd0,1上,不要在grub里mount chainloader 1 #从hd0,1的第一个扇面启动

0 人点赞