上期我们讲了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/cdrom => /dev/hdc
/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这两个虚拟终端
然后在pts/0输入命令 # echo hello > /dev/pts/1
然后我切换到pts/1看看,已经有显示了哈~这样在pts/1就可以看见hello的文字了
(2)然后我们对hda硬盘文件操作,来备份/恢复分区表
备份分区信息,使用命令:
#fdisk -l /dev/hda > /bak/partition.bak
备份MBR,使用命令:
# dd if=/dev/hda of=/bak/mbr.bak bs=512 count=1
说明:主引导记录512字节中前446是程序代码,后64字节包含分区表信息,最后2字节标识是MBR。
恢复分区表,使用命令:
# dd if=/bak/mbr.bak of=/dev/hda bs=512 count=1
下面我们就说说挂载吧,讲挂载我们先要知道文件系统,常见的文件系统大家说说有哪些?
不同的操作系统需要使用不同类型的文件系统,为了与其他操作系统兼容,以相互交换数据,通常操作系统都能支持多种类型的文件系统,比如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
以下是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,然后就可使用虚拟终端。
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 
然后我们把光盘手动挂载到这个目录
#mount -t iso9660 -o ro /dev/hdc /mnt/dvd 
-t iso9600是指定文件系统,光盘的是is09660 ,如果没有指定的情况下,系统有个默认的参数auto,自动识别文件系统
所有不跟也行: mount /dev/hdc /mnt/dvd/,建议新手还是加上这个参数
-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盘有指示灯也会亮,表示被找到。
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支持也是模块方式,那么这些模块也要加载
现在我们再用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
3.最后就是把U盘mount上去,这里需要先在mnt目录下面建一个udisk目录:mount /dev/sda /mnt/udisk

某些系统需要指定文件系统的类型,可以用:
mount -t vfat -o rw /dev/sda /mnt/udisk
手动挂载的-o还有其他参数,我给大家说说
-o remount 是重新挂载某个分区
-o  loop 是挂载虚拟ISO用的
还有 -o username=? password=?之类的,我们用到的时候在说哈~
自动挂载
下面说自动挂载,这个就要稍微麻烦一点点了
大家 cd /misc这个目录,ls看看这个目录里面有没东西
然后cd cd,切换到当前目录的cd目录试试,我们发现可以进去哈,桌面上光驱也跳出来了哈~
ls看看,cd目录里面就是光盘里面的内容哈~为什么没有这个目录我们却能够进入呢?这就是自动挂载了
当我们cd到自动挂载的目录,系统就会自动把分区挂载到这个目录,而不需要我们去手动挂载
自动挂载有这几个特点:
被挂载的目录是不需要建立的,系统自动帮你建立
自动挂载需要激活,没激活的情况下被挂载目录是不可见的
我们来看看这个系统自动挂载是怎么定义的,系统通过autofs服务自动挂载文件系统,需要后台的automount进程,autofs服务的开闭由/etc/init.d/autofs脚本控制,主要应用于软驱与光驱等场合,如果该设备一段时间没有被使用,autofs会自动卸载。
自动挂载分两个配置文件来完成:一个是主文件,一个是辅文件。
主文件只有一个 ,就是/etc/auto.master
辅助文件是自己在主文件里面定义的,下面请大家用vim打开主文件: vim /etc/auto.master 
看见/misc这个目录了吧~~~
 
我们在下面添加一个自动挂载,主目录为michael,辅助文件为 /etc/auto.micchael
就这样写: /michael         /etc/auto.michael
写好后保存退出,我们去看看主文件里面定义的/etc/auto.misc这个文件是怎么写滴哈~
vim /etc/auto.misc
大家估计看懂了吧,前面的cd就是最终挂载目录,中间就是文件类型,后面就是挂载的设备
好了,大家退出,然后编写刚才我们那个自动挂载的辅助文件,辅助文件默认是没有的,我们需要手动建立
vim /etc/auto.michael
然后把辅助文件的内容写进去,我们最终的挂载目录为dvd ,自动挂载,挂载的设备还是光盘,大家按照的我要求,参照auto.misc写哈:
最前面是最终挂载点  中间是文件系统   后面是挂载设备
dvd             -fstype=iso9660,ro         :/dev/hdc 
OK,然后保存退出, 切记,辅助文件的语法格式要和主文件中定义的要一样,不然会失败的。
现在cd /,ls 看看有没有michael这个目录
然后重新启动自动挂载: service autofs restart 
现在再ls看看有没有michael这个目录,已经有了哈~
然后 cd michael/进入这个目录,ls查看下/michael/目录下没有文件哈~
然后cd dvd ,看能不能自动挂载
自动挂载的主文件定义的主目录和辅助文件定义的最终目录都是不用手动建立的。
这就算成功了,辅助文件内可以写分区的,也可以写nfs或者是samba的,不仅仅是光驱,这个就要你们自己灵活运用
开机挂载:/etc/fstab
开机挂载就是在系统启动后自动挂载的目录,定义这个功能的文件是/etc/fstab 文件,请大家打开这个文件: vim /etc/fstab
这个文件我们在系统排错的时候都讲过了,还记得吗?
第一列:设备名称,也就是要挂载的设备
第二列:挂载点
第三列:文件系统类型
第四列:挂载参数
第五列:是否dump备份,0为不,1为一天一次,2为两天一次
第六列:是否检查,0为不检查 1为第一个检查,2为第一的检查完了,检查值为二的 
如果我们要把某个分区开机挂载,就直接写入这个文件系统就OK
按照上面的规则,下面大家把hdc这个设备开机挂载到/mnt下的vcd目录
只需要加入这样一行,然后保存退出:
/dev/hdc    /mnt/vcd    iso9660  defaults,ro   0 0
  
然后 #mkdir /mnt/vcd 
这样就完成开机挂载了,不过,我没必要真的重新启动一次计算机,有个命令可以读取fstab文件中没有被挂载的文件
#mount -a 
Error: cannot mount filesystem: Protocol error,倒~~~解决的方法很简单,到VMware中将虚拟机选项中的”Shared Folders”设置为Enabled即可。
Disabled设置为Enable
我们再试下mount -a命令哈~
这三步完成了哈~,就可以去/mnt/vcd中去看看了
再给大家说一个命令,用卷标挂载:
#mount –L data /mnt/datas    (data代表卷标)
查看卷标是:
#e2label 设备名称  (设备如/dev/hda1,/dev/sda3)
更改卷标名:
#e2label  设备名称 卷表名称 
大家可以看看,但是不要乱改,可能会让你系统不能正常启动,因为fstab文件都使用卷表来定义的
现在我们来试试用卷标挂载:
#mount –L /home /mnt/test
ok了哈~
下面讲讲sudo
sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他特许用户才能完成的任务
大家知道ubuntu吧,他就封闭了root用户,都是使用的sudo
sudo能够限制指定用户在指定主机上运行某些命令。
sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机或者日志服务器。
sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机。它默认的存放位置是/etc/sudoers。
sudo使用时间戳文件来完成类似“检票”的系统。当用户执行sudo并且输入密码后,用户获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码。
 
编辑/etc/sudoers文件,只有超级用户才可以修改它。
sudoers文件就是sudo的配置文件了,但是我们不建议用户直接vim这个文件,建议使用visudo这个命令来编辑这个文件: #visudo
之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。  
sudo的常用参数
sudo -l :列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。
sudo -u 用户名 命令:以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid。
sudo -k:清除“入场卷”上的时间,下次再使用sudo时要再输入密码。
sudo -b 命令:在后台执行指定的命令。
sudo -p 提示语:可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。
sudo -e 文件名:不是执行命令,而是修改文件,相当于命令sudoedit。
现在我们来试试,请大家使用visudo这个命令  
然后使用/root查找
查找到这行 root   ALL=(ALL)     ALL 
这个文件最重要的也就这么一行
我给大家解释下:
第一个root 代表用户名
第一个ALL代表所有主机
(ALL)代表所有用户
后面那个ALL代表所有命令
 
这句话的意思就是:root用户可以在任何机器上运行所有用户的所有命令 
第一个主机你就理解成这个主机吧,他主要是对一个域来定义的
如果我要让michael这个用户可以执行所有用户的shutdown和useradd命令就这样写
michael  ALL=(ALL)    shutdown,useradd 
然后保存退出,如果没有提示的话就证明成功了
visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像: 
>>> sudoers file: syntax error, line 71 <<<
此时我们有三种选择:
键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。
我故意说错了这个命令,那两个命令michael用户是没有环境变量的,也就是michael没那两个命令,所以会报错,就像这样看下图:
比如把命令改成 system-confg-users命令的可执行文件
先使用 which system-config-users找到他的可执行文件 /usr/bin/system-config-users 
需要注意的是,当我们为用户定义可以运行的命令时,必须使用完整的命令路径。这样做是完全出于安全的考虑,如果我们给出的命令只是简单的useradd而非/usr/sbin/useradd,那么用户有可能创建一个他自己的脚本,也叫做useradd,然后放在它的本地路径中,如此一来他就能够通过这个名为useradd的本地脚本,作为root来执行任何他想要的命令了。这是相当危险的!
我们来查找下: which shutdownwhich useradd
/sbin/shutdown,/usr/sbin/useradd这个进去就OK了,多个命令使用" ,"分隔
现在保存退出就没有报错哈~
你可以切换到michael这个用户,使用 #sudo useradd xxxx 
然后输入michael用户的密码,命令就可以执行成功
普通用户的PATH没有加/usr/sbin,自己加上 export PATH=$PATH:/usr/sbin ,然后我们再试试哈~
ok,可以了哈~
大型的主机就使用这种方法把权限分配给不同的管理员
#########################################################################
本文出自 “ 王乾De技术Blog[爱生活,爱学习]” 博客,谢绝转载!




     文章评论
 
[1楼]     reply.gif   闪电cto
2008-12-25 15:13:50
很详细!

博主回复:
呵呵,整理了三天哈~
2008-12-25 15:28:45
 短消息通知评论者

[2楼]     reply.gif   闪电cto
2008-12-25 16:21:21
辛苦辛苦,博主还这是用心了,抽时间整理,平时工作忙吗?

博主回复:
是哈,还可以哈~
2008-12-25 16:42:07
 短消息通知评论者

[3楼]     reply.gif   w156445045
2008-12-25 20:08:52
再次感谢博主的无私奉献.
网络即共享.共享亦即网络.

博主回复:
Thx~~
2008-12-25 21:21:16
 短消息通知评论者

[4楼]     reply.gif   sdmxy2008
2008-12-26 09:55:48
非常感谢啊!

博主回复:
你滴回复是偶滴动力~~~
2008-12-26 14:01:28
 短消息通知评论者

[5楼]     reply.gif   kirri
2008-12-30 13:08:47
老兄,linux终端没有pst,只有pts(Pseudo Terminal Slave)。

以下链接详细描述了tty, pts等概念:
[url]http://wzc0066.blog.hexun.com/14079009_d.html[/url]

博主回复:
嗯,笔误,己更正,谢谢提醒~~~
2008-12-30 13:31:55
 短消息通知评论者

[6楼]     reply.gif   redking
2008-12-30 13:41:24
贴在这里大家学习一下~
[url]http://hi.baidu.com/mypleasure/blog/item/9cc95360ce0923da8cb10dfb.html[/url]

linux tty pty pts 概念 区别
基本概念:

1> tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。


2> pty(虚拟终端):
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)


3> pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。

Linux终端:

在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
1、串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。

2、伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。

这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用 ptyp3(m3)逻辑设备。

例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备 ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给 getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。

在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf) 的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前仍然在RedHat等Linux系统中使用着。

但Linux系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录 /dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。
即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY
=========================================================================
实验:
1、在X下打开一个或N个终端窗口
2、#ls /dev/pt*
3、关闭这个X下的终端窗口,再次运行;比较两次输出信息就明白了。
在RHEL4环境下: 输出为/dev/ptmx /dev/pts/1存在一(master)对多(slave)的情况
=========================================================================


3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。


4、控制台终端(/dev/ttyn, /dev/console)
在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向 /dev/tty0进行写操作 即下例:
1、# tty(查看当前TTY)
/dev/tty1
2、#echo "test tty0" > /dev/tty0
test tty0


5 虚拟终端(/dev/pts/n)
在Xwindows模式下的伪终端.


6 其它类型
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。


FAQ: 终端和控制台

RROM:[url]http://blog.footoo.org/?p=73[/url]
Posted on Tuesday, November 28th, 2006 by CLIFF

吴晋 ([email]cliffwoo@gmail.com[/email])
FoOTOo OpenSource Lab

由于在很多朋友对终端的概念一直不是很清楚,因此写了这个FAQ,希望能够帮助大家理解这些概念。不妥之处,还请大家来信指出。

Q:/dev/console 是什么?

A:/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。


Q:/dev/tty是什么?

A:tty设备包括虚拟控制台,串口以及伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。


Q:/dev/ttyS*是什么?

A:/dev/ttyS*是串行终端设备。


Q:/dev/pty*是什么?

A:/dev/pty*即伪终端,所谓伪终端是逻辑上的终端设备,多用于模拟终端程序。例如,我们在X Window下打开的终端,以及我们在Windows使用telnet 或ssh等方式登录Linux主机,此时均在使用pty设备(准确的说应该pty从设备)。

Q:/dev/tty0与/dev/tty1 …/dev/tty63是什么?它们之间有什么区别?

A:/dev/tty0代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前的控制台则指向/dev/tty2

Q:如何确定当前所在的终端(或控制台)?

A:使用tty命令可以确定当前的终端或者控制台。

Q:/dev/console是到/dev/tty0的符号链接吗?

A: 目前的大多数文本中都称/dev/console是到/dev/tty0的链接(包括《Linux内核源代码情景分析》),但是这样说是不确切的。根据内核文档,在2.1.71之前,/dev/console根据不同系统的设定可以链接到/dev/tty0或者其他tty*上,在2.1.71版本之后则完全由内核控制。目前,只有在单用户模式下可以登录/dev/console(可以在单用户模式下输入tty命令进行确认)。

Q:/dev/tty0与/dev/fb*有什么区别?

A: 在Framebuffer设备没有启用的系统中,可以使用/dev/tty0访问显卡。

Q:关于终端和控制台的区别可以参考哪些文本

A: 可以参考内核文档中的 Documents/devices.txt 中关于”TERMINAL DEVICES” 的章节。另外,《Linux内核源代码情景分析》的8.7节 以及《Operating Systems : Design and Implementation》中的3.9节(第3版中为3.8节)都对终端设备的概念和历史做了很好的介绍。另外在《Modern Operating system》中也有对终端设备的介绍,由于与《Operating Systems : Design and Implementation》的作者相同,所以文本内容也大致相同。需要注意的一点是《Operating Systems : Design and Implementation》中将终端设备分为3类,而《Modern Operating system》将终端硬件设备分为2类,差别在于前者将 X Terminal作为一个类别。

PS:
 
只有2410的2.6才叫ttySAC0,9200等的还是叫ttyS0
短消息通知评论者

[7楼]     reply.gif   kirri
2008-12-30 13:56:18
另外,系统中到底有多少个tty? 你的是tty[0-31],而我的系统上却是tty[0-63]。应该是某个kernel参数设定的。不知道RHCE是否会提到?

博主回复:
[root@rhel5 ~]# ls /dev/ | grep tty
systty
tty
tty0
tty1
tty10
tty11
tty12
tty13
tty14
tty15
tty16
tty17
tty18
tty19
tty2
tty20
tty21
tty22
tty23
tty24
tty25
tty26
tty27
tty28
tty29
tty3
tty30
tty31
tty32
tty33
tty34
tty35
tty36
tty37
tty38
tty39
tty4
tty40
tty41
tty42
tty43
tty44
tty45
tty46
tty47
tty48
tty49
tty5
tty50
tty51
tty52
tty53
tty54
tty55
tty56
tty57
tty58
tty59
tty6
tty60
tty61
tty62
tty63
tty7
tty8
tty9
ttyS0
ttyS1
ttyS2
ttyS3
[root@rhel5 ~]# ls /dev/ | grep lp
lp0
[root@rhel5 ~]#
我查了下是到63个,并口我只有lp0,估计是和主机硬件有关吧~~
2008-12-30 20:39:40
 短消息通知评论者