Linux学习笔记(强悍总结值得一看)-【千锋教育】程序设计基础学习笔记

2024-07-03
| 154页
| 111人阅读
| 0人下载
教辅

内容正文:

Linux 学习笔记 一、 常用命令 LINUX常用操作命令和命令行编辑快捷键 终端快捷键: 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快捷键 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) Ctrl+Alt+F7 返回桌面 窗口操作快捷键 Alt + F4 关闭窗口 Alt + F5 取消最大化窗口 (恢复窗口原来的大小) Alt + F7 移动窗口 (注: 在窗口最大化的状态下无效) Alt + F8 改变窗口大小 (注: 在窗口最大化的状态下无效) Alt + F9 最小化窗口 Alt + F10 最大化窗口 Alt + 空格键 打开窗口的控制菜单 (点击窗口左上角图标出现的菜单) 文件浏览器 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和管道符 昨天的时候 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)。 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-LogVol00 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-LogVol00 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/sda2 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 主分区 ext3 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/hda1 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 会自动选择正确的类型。常用类型有: 光盘或光盘镜像:iso9660 DOS fat16 文件系统:msdos Windows 9x fat32 文件系统:vfat Windows NT ntfs 文件系统:ntfs Mount Windows 文件网络共享:smbfs UNIX(LINUX) 文件网络共享:nfs 2.-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 FAT32 大家应该可以发现多了一个 SCSI 硬盘/dev/sdc 和它的两个磁盘分区/dev/sdc1?、/dev/sdc2,其中/dev/sdc5 是/dev/sdc2 分区的逻辑分区。我们可以使用下面的命令挂接/dev/sdc1 和/dev/sdc5。 #mkdir -p /mnt/usbhd1 #mkdir -p /mnt/usbhd2 注:建立目录用来作挂接点(mount point) #mount -t ntfs /dev/sdc1 /mnt/usbhd1 #mount -t vfat /dev/sdc5 /mnt/usbhd2 注:对 ntfs 格式的磁盘分区应使用-t ntfs 参数,对 fat32 格式的磁盘分区应使用-t vfat 参数。若汉字 文件名显示为乱码或不显示,可以使用下面的命令格式。 #mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1 #mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2 linux 系统下使用 fdisk 分区命令和 mkfs 文件系统创建命令可以将移动硬盘的分区制作成 linux 系统所特 有的 ext2、ext3 格式。这样,在 linux 下使用就更方便了。使用下面的命令直接挂接即可。 #mount /dev/sdc1 /mnt/usbhd1 挂接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 FAT32 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。当然也可以到 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/sunky1 # share /export/home/sunky2 注:/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 (在 REDHAT 中 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/hda1 选项 –l 并不是马上 umount,而是在该目录空闲后再 umount。 如果比较急,可用如下命令: #umount -f /mnt/hda1 -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/hda2 #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:46 . drwxrwxrwx 29 root root 4096 11 月 5 16:48 .. -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:x: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...] <accountName> -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:27 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 ~]$ finger -s ftp 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.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.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:27 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.10 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:27 linuxsir tty2 Nov 2 10:03 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.04 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:27 linuxsir tty2 Nov 2 10:03 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 ~]$ users beinan beinan beinan beinan beinan beinan linuxsir 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=3 密码复杂度通过/etc/pam.d/system-auth 实施 如: 要使用 pam_cracklib 将注释去掉,把 pam_passwdqc.so 注释掉即可. #password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1 password requisite /lib/security/$ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase=3 password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow #password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1 新密码至少有一位与原来的不同 PASS_MIN_DAYS 参数则设定了在本次密码修改后,下次允许更改密码之前所需的最少天数。 PASS_WARN_AGE 的设定则指明了在口令失效前多少天开始通知用户更改密码(一般在用户刚刚登陆系统时 就会收到警告通知)。 你也会编辑/etc/default/useradd 文件,寻找 INACTIVE 和 EXPIRE 两个关键词: INACTIVE=14 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: #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 命令作用 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、文件类型 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 目录 1. [root@localhost ~]# ls -lh 2. 总计 14M 3. -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale 4. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log 5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm 6. drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17 7. drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir 8. 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 的文件。 1. [root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock 2. srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock 注意这个文件的属性的第一个字符是 s。我们了解一下就行了。 5 符号链接文件 1. [root@localhost ~]# ls -lh setup.log 2. lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log 当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是 l,这类文件是链接文件。是通过 ln -s 源文件名 新文件名。上面是一个例子,表示 setup.log 是 install.log 的软链接文件。怎么理解呢? 这和 Windows 操作系统中的快捷方式有点相似。 符号链接文件的创建方法举例; 1. [root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm 2. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm 3. [root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm 4. [root@localhost ~]# ls -lh kernel* 5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm 6. 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 命令的情况。 -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 作为他们的当 前工作目录。 -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 登录并改变到所切换的用户环境;

资源预览图

Linux学习笔记(强悍总结值得一看)-【千锋教育】程序设计基础学习笔记
1
Linux学习笔记(强悍总结值得一看)-【千锋教育】程序设计基础学习笔记
2
Linux学习笔记(强悍总结值得一看)-【千锋教育】程序设计基础学习笔记
3
Linux学习笔记(强悍总结值得一看)-【千锋教育】程序设计基础学习笔记
4
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。