RH131Linux管理笔记六-Linux文件系统管理、挂载及sudo设置与使用

上期我们讲了Linux远程登陆telnet及ssh服务,下面我们讲的是设备文件管理
Linux沿袭Unix的风格,将所有设备认成是一个文件。
设备文件分为两种:
块设备文件(b)
字符设备文件(c)
设备文件一般存放在 /dev目录下
/dev/hd [a-t]:IDE设备
/dev/sd[a-z]:SCSI设备
/dev/fd [0-7]:标准软驱
/dev/md[0-31]:软raid设备
/dev/loop[0-7]:本地回环设备
/dev/ram[0-15]:内存
/dev/null:无限数据接收设备 , 相当于回收站
/dev/zero:无限零资源
/dev/tty[0-63]:虚拟终端
/dev/ttyS[0-3]:串口
/dev/lp[0-3]:并口
/dev/console:控制台
/dev/fb[0-31]:framebuffer
/dev/cd rom => /dev/hd c
/dev/modem => /dev/ttyS[0-9]
/dev/pilot => /dev/ttyS[0-9]
 
/dev/console:控制台和/dev/tty[0-63]:虚拟终端的区别与联系
控制抬就好比电视机上的按钮,终端好比遥控板,他们的目的都是控制电视机,但是控制台必须在本地,而终端可以在远端,系统只有一个控制台,叫console,其他的都是终端
好了,下面我们通过使用对设备文件的操作来完成对设备的操作
(1)现在我打开了两个虚拟终端,用w 查看就有pts/0和pts/1这两个虚拟终端
image
然后在pts/0输入命令 :# echo hello > /dev/pts/1
image
然后我切换到pts/1看看,已经有显示了哈~这样在pts/1就可以看见hello的文字了
 

image

(2)然后我们对hda硬盘文件操作,来备份/恢复分区表
备份分区信息,使用命令:
#fdisk -l /dev/hda > /bak/partition.bak
image
备份MBR,使用命令:
# dd if=/dev/hda of=/bak/mbr.bak bs=512 count=1
image
说明:主引导记录512字节中前446是程序代码,后64字节包含分区表信息,最后2字节标识是MBR。
恢复分区表,使用命令:
# dd if=/bak/mbr.bak of=/dev/hda bs=512 count=1
image
 
 
 
下面我们就说说挂载吧,讲挂载我们先要知道文件系统,常见的文件系统大家说说有哪些?
不同的操作系统需要使用不同类型的文件系统,为了与其他操作系统兼容,以相互交换数据,通常操作系统都能支持多种类型的文件系统,比如Windows 2000 Server,系统默认或推荐采用的文件系统是NTFS,但同时也支持FAT32或FAT16文件系统;DOS和Windows 9x一般采用FAT16或FAT32,不支持NTFS文件系统。
    Linux内核支持十多种不同类型的文件系统,对于Red Hat Linux,系统默认使用ext2或ext3和swap文件系统,下面对Linux常用的文件系统作一个简单介绍。
1、ext2与ext3文件系统
ext是第一个专门为Linux设计的文件系统类型,称为扩展文件系统,在Linux发展的早期,起过重要的作用。由于稳定性,速度和兼容性方面存在许多缺陷,ext现已很少使用。
ext2是为解决ext文件系统存在的缺陷而设计的可扩展、高性能的文件系统,称为二级扩展文件系统。ext2于1993年发布,在速度和CPU利用率上具有较突出的优势,是GNU/Linux系统中标准的文件系统,支持256个字节的长文件名,文件存取性能极好。
ext3是ext2的升级版本,兼容ext2,在ext2的基础上,增加了文件系统日志记录功能,称为日志式文件系统。日志式文件系统在因断电或其他异常事件而停机重启后,操作系统会根据文件系统的日志,快速检测并恢复文件系统到正常的状态,并可提高系统的恢复时间,提高数据的安全性。若对数据有较高安全性要求,建议使用ext3文件系统。
日志文件系统是目前Linux文件系统发展的方向,常用的还用reiserfs和jfs等日志文件系统。
2、swap文件系统
swap文件系统用于Linux的交换分区。在Linux中,使用整个交换分区来提供虚拟内存,其分区大小一般应是系统物理内存的2倍,在安装Linux操作系统时,就应创分交换分区,它是Linux正常运行所必需的,其类型必须是swap,交换分区由操作系统自行管理。
3、vfat文件系统
vfat是Linux对DOS,Windows系统下的FAT(包括fat16和Fat32)文件系统的一个统称。
4、NFS文件系统
NFS即网络文件系统,用于在UNIX系统间通过网络进行文件共享,用户可将网络中NFS服务器提供的共享目录挂载到本地的文件目录中,从而实现操作和访问NFS文件系统中的内容。
5、ISO9660文件系统
该文件系统中光盘所使用的标准文件系统,Linux对该文件系统也有很好的支持,不仅能读取光盘和光盘ISO映像文件,而且还支持在Linux环境中刻录光盘。
Red Hat Linux支持的文件系统很多,在些就不逐一介绍,要想了解其支持的文件系统类型,可通过以下命令来查看:
# ls /lib/modules/2.6.18-53.el5/kernel/fs
image
以下是Linux支持的文件系统汇总
1.minix
   是Minix操作系统使用的文件系统,是Linux最先使用的文件系统。它有许多缺点:分区只能小于64MB,只支持短文件名,单一的时间戳,等等。在软盘和动态磁盘领域仍然有用。
2.ext
   是对Minix的扩展。已完全被ext2取代,内核最终将不会支持它。
3.ext2
   是Linux使用的,性能很好的文件系统,用于固定文件系统和可活动文件系统。它是作为ext文件系统的扩展而设计的。ext2在Linux所支持的文件系统中,提供最好的性能(在速度和CPU使用方面),简短的说,ext2是Linux的主要文件系统。
4.ext3
   是对ext2增加日志功能后的扩展。它向前,向后兼容ext2。意为ext2不用丢失数据和格式化就可以转换为ext3,ext3也可以转换为ext2 而不用丢失数据(只要重新安装该分区就行了),强烈推荐使用这种文件系统。
5.xiafs 
   作为Minix文件系统的一个稳定,安全的扩展,提供基本的最常用的特点。目前已经停止开发和维护了。不太常使用。
6.msdos
  是DOS, Windows和一些os/2计算机使用的文件系统。文件名不能超过8个字符,然后跟一个3个字符的后缀。
7.umsdos  
  是Linux使用的扩展的DOS文件系统。增加了长文件名支持,UID/GID,POSIX权限,特殊文件等而依然保持和DOS文件系统兼容。
8.vfat
  是Windows95,Windows NT使用的扩展的DOS文件系统。增加长文件名支持。
9.proc
   是一种假的文件系统,用于和内核数据结构接口, 它不占用磁盘空间,参考 man proc。
10.iso9660
   是一种针对ISO9660标准的CD-ROM文件系统。自动支持两种扩展(看下面)。
11.High Sierra
   是ISO9660标准的前身。Linux自动支持它。Rock Ridge是Rock Ridge interchange Protocol协议的一个产品,用于进一步向Unix系统描述ISO9660文件系统下的文件。另外提供诸如长文件名,UID/GID,POSIX权限,等信息。Linux自动支持它。
12.hpfs
   是OS/2使用的高性能的文件系统。在Linux系统中是只读的,因为缺乏相应的文档资料。
13.sysv
   是SystemV/Coherent文件系统在Linux上的实现。它实现了所有的Xenix,SystemV/386,和 Coherent文件系统。
14.nfs  
   是用于存取远方计算机硬盘的文件系统。
15.smb 
   是支持SMB协议的网络文件系统,Windows用它来实现工作组共享。
16.ncpfs
  是Novell NetWare使用的,支持NCP协议的网络文件系统。
17.Devpts
    是一个虚拟的文件系统,一般安装在/dev/pts。为了得到一个虚拟终端,进程打开/dev/ptmx,然后就可使用虚拟终端。
image 
18.fat
   不是一个单独的文件系统,而是msdos, umsdos 和vfat 文件系统的常用部分。
19.UFS
   是一个广泛使用于各种操作系统的文件系统
20.swap
  是一种特殊的分区,用于在内存和硬盘间交换数据的文件系统。
21.raiserfs
  是Linux内核2.4.1以后(2001年1 月)支持的,一种全新的日志文件系统。
22.hfs    
   hfs(=hierarchical files system)是苹果文件系统。
23.ntfs
   Windows NT文件系统。
注意,fat16和fat32在LINUX里都是用vfat来表示
vfat:win95与win98采用的文件系统
ntfs:win2000使用的文件系统
iso9660:光盘使用的文件系统
ReiserFS/JFS:仍然在完善的带日志文件系统
 
ext3和ext2是我们REDHAT使用的文件系统,我就不多说了,在基础部分都讲过了
挂载分三种:
手动挂载
自动挂载
开机挂载

手动挂载

我们从简单的手动挂载开始,请大家打开自己的虚拟机,在LINUX里,为了使用一个文件系统,往其中存读文件,用户需要先挂载该文件系统,所以要使用硬盘的空间就必须先分区,然后格式化,最后挂载。这样才能使用。
挂载文件系统的指令是 mount 
语法: mount -t 文件系统类型 [-o 其他参数] 设备 挂载点
我们来实战下,现在请大家在/mnt目录下建立一个目录,叫dvd
#mkdir /mnt/dvd 
image
然后我们把光盘手动挂载到这个目录
#mount -t iso9660 -o ro /dev/hdc /mnt/dvd 
image
-t iso9600是指定文件系统,光盘的是is09660 ,如果没有指定的情况下,系统有个默认的参数auto,自动识别文件系统
所有不跟也行: mount /dev/hdc /mnt/dvd/,建议新手还是加上这个参数
image
-o 是附加参数,ro是以只读方式挂载。应为光盘是不可写的,所以要只读挂载  
auto文件系统 -t的一个参数,你不加-t 他就默认是这个

挂载U盘的方法
# mount -t vfat  -o rw /dev/sda /mnt/你自己建立的目录
你U盘是哪个设备需要具体看你情况而定
现在的Usb设备很多,如mp3,u盘,读卡器等,但在linux上不一定被认出来,现把自己挂载Kingston DataTraveler 4GB U盘总结的经验分享出来哈~
插入U盘之后,按照下面的步骤:
1.fdisk -l /dev/sd*
fdisk -l 列出指定设备的分区表信息。由于usb盘是被模拟为scsi设备访问,所以会被自动命名为sd*。通常这一步就能找到U盘,如果U盘有指示灯也会亮,表示被找到。
image
2.lsmod
如果执行上一个命令没有反应,或者某些信息显示模块没有加入,我们可以lsmod查看一下是否有 usb-storage scsi_mod sd_mod模块。

[root@rhel5 ~]# lsmod
Module                  Size  Used by
vfat                   15809  0
fat                    51165  1 vfat
nls_utf8                6209  1
autofs4                24389  2
hidp                   23105  2
rfcomm                 42457  0
l2cap                  29633  10 hidp,rfcomm
bluetooth              53925  5 hidp,rfcomm,l2cap
vmblock                20512  4
vmmemctl               14544  0
sunrpc                144253  1
ipv6                  251393  14
vmhgfs                 54912  0
dm_mirror              28869  0
dm_multipath           21577  0
dm_mod                 58457  2 dm_mirror,dm_multipath
video                  19269  0
sbs                    18533  0
backlight              10049  0
i2c_ec                  9025  1 sbs
button                 10705  0
battery                13637  0
asus_acpi              19289  0
ac                      9157  0
lp                     15849  0
joydev                 13313  0
floppy                 57125  0
snd_ens1371            28513  1
gameport               18633  1 snd_ens1371
snd_rawmidi            26561  1 snd_ens1371
snd_ac97_codec         93025  1 snd_ens1371
ac97_bus                6337  1 snd_ac97_codec
snd_seq_dummy           7877  0
pcspkr                  7105  0
pcnet32                35269  0
snd_seq_oss            32577  0
snd_seq_midi_event     11072  1 snd_seq_oss
snd_seq                49713  5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event
vmxnet                 21504  0
snd_seq_device         11725  4 snd_rawmidi,snd_seq_dummy,snd_seq_oss,snd_seq
snd_pcm_oss            42945  0
snd_mixer_oss          19009  1 snd_pcm_oss
snd_pcm                72133  3 snd_ens1371,snd_ac97_codec,snd_pcm_oss
i2c_piix4              12237  0
i2c_core               23745  2 i2c_ec,i2c_piix4
mii                     9409  1 pcnet32
snd_timer              24645  2 snd_seq,snd_pcm
snd                    52421  12 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
soundcore              11553  1 snd
snd_page_alloc         13641  1 snd_pcm
ide_cd                 40033  1
serio_raw              10693  0
parport_pc             29157  1
cdrom                  36705  1 ide_cd
parport                37513  2 lp,parport_pc
ata_piix               18501  0
libata                115833  1 ata_piix
sd_mod                 24897  0
scsi_mod              132685  2 libata,sd_mod
ext3                  123337  7
jbd                    56553  1 ext3
ehci_hcd               32973  0
ohci_hcd               23261  0
uhci_hcd               25421  0
[root@rhel5 ~]#

没有就 modprobe [module] ,添加所缺模块: usb-storage scsi_mod sd_mod
在Linux下这些设备通常都是以一种叫做usb-storage的方式进行驱动。要使用他们必须加载此模块,当然,usbcore.o、usb-uhci.o、usb-ohci也肯定是不可缺少的。另外,若你系统中SCSI支持也是模块方式,那么这些模块也要加载
image
现在我们再用lsmod命令查看,可以看到模块已经添加上去了哈~~

[root@rhel5 ~]# lsmod
Module                  Size  Used by
usb_storage            76577  0
autofs4                24389  2
hidp                   23105  2
rfcomm                 42457  0
l2cap                  29633  10 hidp,rfcomm
bluetooth              53925  5 hidp,rfcomm,l2cap
vmblock                20512  4
vmmemctl               14544  0
sunrpc                144253  1
ipv6                  251393  14
vmhgfs                 54912  0
dm_mirror              28869  0
dm_multipath           21577  0
dm_mod                 58457  2 dm_mirror,dm_multipath
video                  19269  0
sbs                    18533  0
backlight              10049  0
i2c_ec                  9025  1 sbs
button                 10705  0
battery                13637  0
asus_acpi              19289  0
ac                      9157  0
lp                     15849  0
floppy                 57125  0
joydev                 13313  0
snd_ens1371            28513  1
gameport               18633  1 snd_ens1371
snd_rawmidi            26561  1 snd_ens1371
snd_ac97_codec         93025  1 snd_ens1371
ac97_bus                6337  1 snd_ac97_codec
snd_seq_dummy           7877  0
snd_seq_oss            32577  0
snd_seq_midi_event     11072  1 snd_seq_oss
snd_seq                49713  5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event
snd_seq_device         11725  4 snd_rawmidi,snd_seq_dummy,snd_seq_oss,snd_seq
snd_pcm_oss            42945  0
pcnet32                35269  0
snd_mixer_oss          19009  1 snd_pcm_oss
vmxnet                 21504  0
snd_pcm                72133  3 snd_ens1371,snd_ac97_codec,snd_pcm_oss
pcspkr                  7105  0
i2c_piix4              12237  0
snd_timer              24645  2 snd_seq,snd_pcm
i2c_core               23745  2 i2c_ec,i2c_piix4
snd                    52421  12 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_seq_
oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
mii                     9409  1 pcnet32
soundcore              11553  1 snd
snd_page_alloc         13641  1 snd_pcm
parport_pc             29157  1
ide_cd                 40033  0
parport                37513  2 lp,parport_pc
cdrom                  36705  1 ide_cd
serio_raw              10693  0
ata_piix               18501  0
libata                115833  1 ata_piix
sd_mod                 24897  0
scsi_mod              132685  3 usb_storage,libata,sd_mod
ext3                  123337  7
jbd                    56553  1 ext3
ehci_hcd               32973  0
ohci_hcd               23261  0
uhci_hcd               25421  0
[root@rhel5 ~]#

在加载完这些模块后,我们插入U盘就会发现系统中多了一个SCSI硬盘,通过正确地mount它,就可以使用了(SCSI硬盘一般为/dev/sd?)。
我们再重新插拔下U盘,然后再试就ok
image
3.最后就是把U盘mount上去,这里需要先在mnt目录下面建一个udisk目录:mount /dev/sda /mnt/udisk
image
某些系统需要指定文件系统的类型,可以用: mount -t vfat -o rw /dev/sda /mnt/udisk
image
手动挂载的-o还有其他参数,我给大家说说
-o remount 是重新挂载某个分区
-o  loop 是挂载虚拟ISO用的
还有 -o username=? password=?之类的,我们用到的时候在说哈~

自动挂载
 

下面说自动挂载,这个就要稍微麻烦一点点了
大家 cd /misc这个目录,ls看看这个目录里面有没东西
image
然后cd cd,切换到当前目录的cd目录试试,我们发现可以进去哈,桌面上光驱也跳出来了哈~
image
ls看看,cd目录里面就是光盘里面的内容哈~为什么没有这个目录我们却能够进入呢?这就是自动挂载了
image
当我们cd到自动挂载的目录,系统就会自动把分区挂载到这个目录,而不需要我们去手动挂载
自动挂载有这几个特点:
被挂载的目录是不需要建立的,系统自动帮你建立
自动挂载需要激活,没激活的情况下被挂载目录是不可见的
我们来看看这个系统自动挂载是怎么定义的,系统通过autofs服务自动挂载文件系统,需要后台的automount进程,autofs服务的开闭由/etc/init.d/autofs脚本控制,主要应用于软驱与光驱等场合,如果该设备一段时间没有被使用,autofs会自动卸载。
自动挂载分两个配置文件来完成:一个是主文件,一个是辅文件。
主文件只有一个 ,就是/etc/auto.master
辅助文件是自己在主文件里面定义的,下面请大家用vim打开主文件: vim /etc/auto.master 

 

image
看见/misc这个目录了吧~~~
image 
我们在下面添加一个自动挂载,主目录为michael,辅助文件为 /etc/auto.micchael
就这样写: /michael         /etc/auto.michael
image
写好后保存退出,我们去看看主文件里面定义的/etc/auto.misc这个文件是怎么写滴哈~
vim /etc/auto.misc
大家估计看懂了吧,前面的cd就是最终挂载目录,中间就是文件类型,后面就是挂载的设备
image
好了,大家退出,然后编写刚才我们那个自动挂载的辅助文件,辅助文件默认是没有的,我们需要手动建立
vim /etc/auto.michael
image
然后把辅助文件的内容写进去,我们最终的挂载目录为dvd ,自动挂载,挂载的设备还是光盘,大家按照的我要求,参照auto.misc写哈:
最前面是最终挂载点  中间是文件系统   后面是挂载设备
dvd             -fstype=iso9660,ro         :/dev/hdc 
image
OK,然后保存退出, 切记,辅助文件的语法格式要和主文件中定义的要一样,不然会失败的。
image
现在cd /,ls 看看有没有michael这个目录
image
然后重新启动自动挂载: service autofs restart 
image
现在再ls看看有没有michael这个目录,已经有了哈~
image
然后 cd michael/进入这个目录,ls查看下/michael/目录下没有文件哈~
image
然后cd dvd ,看能不能自动挂载
image
自动挂载的主文件定义的主目录和辅助文件定义的最终目录都是不用手动建立的。
这就算成功了,辅助文件内可以写分区的,也可以写nfs或者是samba的,不仅仅是光驱,这个就要你们自己灵活运用
开机挂载:/etc/fstab
开机挂载就是在系统启动后自动挂载的目录,定义这个功能的文件是/etc/fstab 文件,请大家打开这个文件: vim /etc/fstab
image
这个文件我们在系统排错的时候都讲过了,还记得吗?
第一列:设备名称,也就是要挂载的设备
第二列:挂载点
第三列:文件系统类型
第四列:挂载参数
第五列:是否dump备份,0为不,1为一天一次,2为两天一次
第六列:是否检查,0为不检查 1为第一个检查,2为第一的检查完了,检查值为二的 
如果我们要把某个分区开机挂载,就直接写入这个文件系统就OK
按照上面的规则,下面大家把hdc这个设备开机挂载到/mnt下的vcd目录
只需要加入这样一行,然后保存退出:
/dev/hdc    /mnt/vcd    iso9660  defaults,ro   0 0
image  
然后 #mkdir /mnt/vcd 
image
这样就完成开机挂载了,不过,我没必要真的重新启动一次计算机,有个命令可以读取fstab文件中没有被挂载的文件
#mount -a 
image
Error: cannot mount filesystem: Protocol error,倒~~~解决的方法很简单,到VMware中将虚拟机选项中的”Shared Folders”设置为Enabled即可。
image
Disabled设置为Enable
image
我们再试下mount -a命令哈~
image
这三步完成了哈~,就可以去/mnt/vcd中去看看了
image
再给大家说一个命令,用卷标挂载:
#mount –L data /mnt/datas    (data代表卷标)
查看卷标是:
#e2label 设备名称  (设备如/dev/hda1,/dev/sda3)
image
更改卷标名:
#e2label  设备名称 卷表名称 
image
大家可以看看,但是不要乱改,可能会让你系统不能正常启动,因为fstab文件都使用卷表来定义的
现在我们来试试用卷标挂载:
#mount –L /home /mnt/test
image
ok了哈~
下面讲讲sudo
sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他特许用户才能完成的任务
大家知道ubuntu吧,他就封闭了root用户,都是使用的sudo
sudo能够限制指定用户在指定主机上运行某些命令。
sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机或者日志服务器。
sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机。它默认的存放位置是/etc/sudoers。
sudo使用时间戳文件来完成类似“检票”的系统。当用户执行sudo并且输入密码后,用户获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码。 
编辑/etc/sudoers文件,只有超级用户才可以修改它。
image
sudoers文件就是sudo的配置文件了,但是我们不建议用户直接vim这个文件,建议使用visudo这个命令来编辑这个文件: #visudo
image
之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。  
sudo的常用参数
sudo -l :列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。
sudo -u 用户名 命令:以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid。
sudo -k:清除“入场卷”上的时间,下次再使用sudo时要再输入密码。
sudo -b 命令:在后台执行指定的命令。
sudo -p 提示语:可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。
sudo -e 文件名:不是执行命令,而是修改文件,相当于命令sudoedit。
 
现在我们来试试,请大家使用visudo这个命令  
 

image

然后使用/root查找

image

查找到这行 root   ALL=(ALL)     ALL 
image
这个文件最重要的也就这么一行
我给大家解释下:
第一个root 代表用户名
第一个ALL代表所有主机
(ALL)代表所有用户
后面那个ALL代表所有命令 
这句话的意思就是:root用户可以在任何机器上运行所有用户的所有命令 
第一个主机你就理解成这个主机吧,他主要是对一个域来定义的
如果我要让michael这个用户可以执行所有用户的shutdown和useradd命令就这样写
michael  ALL=(ALL)    shutdown,useradd 
image
然后保存退出,如果没有提示的话就证明成功了
 
image
visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像: 
>>> sudoers file: syntax error, line 71 <<<
此时我们有三种选择:
键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。
我故意说错了这个命令,那两个命令michael用户是没有环境变量的,也就是michael没那两个命令,所以会报错,就像这样看下图:
image
比如把命令改成 system-confg-users命令的可执行文件
先使用 which system-config-users找到他的可执行文件 /usr/bin/system-config-users 
 
image
需要注意的是,当我们为用户定义可以运行的命令时,必须使用完整的命令路径。这样做是完全出于安全的考虑,如果我们给出的命令只是简单的useradd而非/usr/sbin/useradd,那么用户有可能创建一个他自己的脚本,也叫做useradd,然后放在它的本地路径中,如此一来他就能够通过这个名为useradd的本地脚本,作为root来执行任何他想要的命令了。这是相当危险的!
我们来查找下: which shutdownwhich useradd
image
/sbin/shutdown,/usr/sbin/useradd这个进去就OK了,多个命令使用" ,"分隔
image
现在保存退出就没有报错哈~
image 
你可以切换到michael这个用户,使用 #sudo useradd xxxx 
然后输入michael用户的密码,命令就可以执行成功
image
普通用户的PATH没有加/usr/sbin,自己加上 export PATH=$PATH:/usr/sbin ,然后我们再试试哈~
image 

你可能感兴趣的:(linux,系统)