怎么设置中国电信4G参数,让手机飞起来 三星s7 edge三网通用,现在用电信卡,现在网速慢,不稳定,能修改

sponsored links
5.文件系统——文件系统挂载、卸载、自动挂载(mount,loop,umount,fuser)
前文中简单介绍了文件系统的挂载方法,即使用mount命令。事实上,mount命令可以使用的选项非常多,其功能十分强大。比如在挂载U盘时,有些程序会向U盘里写入数据,以此来传播病毒,如果采用只读的方式挂载U盘,则可以有效避免病毒的感染。再比如想对挂载的文件系统进行读写控制,如是否可以在新挂载的文件系统里创建设备文件等,都可以通过mount命令组合特定的选项来完成。
下面使用man命令来查看一下mount命令可以使用的选项:
[ ~]# man mount
Linux Programmer Manual
mount - mount a filesystem
COMMAND LINE OPTIONS
-O, --test-opts opts
Used in conjunction with -a, to limit the set of filesystems to which the -a is applied.
# 用于指定挂载选项,常用的挂载选项有:
Mount the filesystem read-only.
# 只读挂载
rw: Mount the filesystem read-write.
# 读写,默认挂载方式
noatime:Do not update inode access times on this filesystem (e.g, for faster access on
the news spool to speed up news servers).
# 关闭文件访问时间的更新,由于文件被访问时会产生时间戳,如果有些文件被频繁访问,
# 而每一次访问都会产生一个时间戳,这样就会导致大量不必要的I/O操作,
# 从而降低系统性能,故关闭时间戳更新是系统优化时常用的选项
atime: Do not use noatime feature, then the inode access time is controlled by kernel defaults.
# 和noatime相反,开启访问时间的更新
Can be mounted with the -a option.
# 是否能够由“mount -a”挂载,在后期关于fstab章节中会详解此命令
diratime:Update directory inode access times on this filesystem. This is the default.
# 和atime命令类似,但这里是更新目录的访问时间
nodiratime:
Do not update directory inode access times on this filesystem.
# 关闭更新目录的访问时间。事实上,noatime命令已经包含了关闭nodiratime命令,
# 只不过nodiratime命令可以单独使用。如果已经使用了noatime,则无需使用此命令
All I/O to the filesystem should be done asynchronously.
# 异步写入。由于文件的写入,首先是由cpu在内存中完成编辑,如果要保存,
# 则只保存到内存里,而没有马上写入硬盘,需要过一段时间,当内存中积累了
# 大量的写操作后,一次性将这些写操作都保存到硬盘上,而不是直接操作硬盘,
# 这个过程就称为异步写入。异步的性能要远远高于同步,但异步的缺陷在于如果
# 出现断电等意外情况,有可能造成数据丢失。解决数据丢失的办法,可以采用
# 自定义内核的磁盘刷写策略,如每一秒刷写一次内存
All I/O to the filesystem should be done synchronously.
# 同步写入。和异步写入相反,编辑一个文件时,在内存中完成的同时也保存到硬盘上的过程,
# 同步写入性能较差,通常情况下不使用。
directory updates within the filesystem should be done synchronously.
# 目录同步。实际操作中,可以使用文件异步而目录同步,这样可以保证即使文件丢失了
# 目录结构也不会丢失
Interpret character or block special devices on the filesystem.
# 允许挂载的磁盘启用设备文件
nodev: Do not interpret character or block special devices on the file system.
# 不允许使用设备文件
Permit execution of binaries.
# 允许在挂载的设备上执行二进制程序,这是默认挂载选项
noexec: Do not allow direct execution of any binaries on the mounted filesystem.
# 不允许在挂载的设备上执行二进制程序,U盘通常建议不允许执行以防止病毒
Allow an ordinary (i.e., non-root) user to mount the filesystem
# 允许普通用户组用户挂载此文件系统,使用不多
relatime:Update
relative to modify or change time.
# 当访问时间被改变时,更新修改时间
norelatime: Do not use relatime feature
# 和relatime相反,当访问时间被更改时,不更新修改时间
Attempt to remount an already-mounted filesystem.
# 重新挂载。如果挂载了某个文件系统后,觉得其中的某些属性不合要求,
# 可以使用此选项,而无需先卸载再挂载。如:
[ ~]# mount -o remount,ro /dev/sdb3
# 这里使用remount重新挂载/dev/sdb3,将挂载属性改为只读。重新挂载无需
# 指定挂载点了
[ ~]# mount
—————————————运行结果———————————————
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
# 重新挂载的/dev/sdb3已经变为只读属性了
THE LOOP DEVICE: One further possible type is a mount via the loop device.
# 本地回环设备,事实上它不是一个设备,而是一个文件。如果挂载了一个光盘,
# 那么就可以使用光盘中的文件了。如果挂载的不是光盘而是一个ISO镜像文件
# 则无法将该镜像挂载到光驱中,此时就需要用到本地回环设备了。如以下操作:
[ ~]# man mount
[ ~]# mount /dev/cdrom /media
mount: block device /dev/sr0 is write-protected, mounting read-only
# 出现警告信息,是因为光盘被写保护了
[ ~]# umount /media
[ ~]# mount -o ro /dev/cdrom /media
# 卸载后以只读方式重新挂载,则没有警告信息
[ ~]# ll /media
-r-xr-xr-x. 1 root root 232019 Jul 17
2011 commons-beanutils-1.8.3.jar
这里使用了cdrom来挂载,事实上cdrom是一个链接,它指向的是src0
[ ~]# ll /dev
—————————————运行结果———————————————
lrwxrwxrwx. 1 root root
3 Jul 11 05:58 cdrom -& sr0
lrwxrwxrwx. 1 root root
3 Jul 11 05:58 dvd -& sr0
lrwxrwxrwx. 1 root root
3 Jul 11 05:58 scd0 -& sr0
如果刚才的光盘被制作成了ISO镜像文件直接下载到了本地上,那么就必须采用本地回环设备来挂载:
[ /]# mount -o loop,ro /commons-beanutils-1.8.3.iso /media
[ /]# ll /media
-r-xr-xr-x. 1 root root 232019 Jul 17
2011 commons-beanutils-1.8.3.jar
Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
# 使用defaults选项,等同于同时使用了上述rw,suid,exec等等多个选项。
# 如果mount -o不指定任何选项,则默认使用defaults。
mount命令除了-o选项外,还有一些其他的选项也经常用到:
-v, --verbose
Verbose mode.
# 挂载时显示详细的设备信息,如:
[ /]# mount -o loop -v /u01/commons-beanutils-1.8.3.iso /media
—————————————运行结果———————————————
mount: going to use the loop device /dev/loop0
mount: you didn't specify a filesystem type for /dev/loop0
I will try type iso9660
/u01/commons-beanutils-1.8.3.iso on /media type iso9660 (rw,loop=/dev/loop0)
-n, --no-mtab
/etc/mtab.
# 挂载文件系统时,不更新/etc/mtab文件。/etc/mtab文件会随时更新挂载情况,
# 如果不希望这些更新状况保存到 /etc/mtab文件中,就可以使用该选项
[ /]# cat /etc/mtab
—————————————运行结果———————————————
/dev/mapper/VolGroup-lv_root / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,rootcontext="system_u:object_r:tmpfs_t:s0" 0 0
/dev/sda1 /boot ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sdb3 /mydata ext4 ro 0 0
/dev/sr0 /media iso9660 ro 0 0
/u01/commons-beanutils-1.8.3.iso /media iso9660 rw,loop=/dev/loop0 0 0
# 这里可以看到/etc/mtab文件和直接输入mount命令的结果很相似,事实上/etc/mtab
# 文件是用来追踪mount命令的结果的,mount命令默认显示的也是该文件的内容
[ /]# umount /media
[ /]# cat /etc/mtab
# 卸载/media后再次查看/etc/mtab文件
—————————————运行结果———————————————
/dev/mapper/VolGroup-lv_root / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,rootcontext="system_u:object_r:tmpfs_t:s0" 0 0
/dev/sda1 /boot ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sdb3 /mydata ext4 ro 0 0
/dev/sr0 /media iso9660 ro 0 0
# 可以看到最后一项消失了
[ /]# mount
—————————————运行结果———————————————
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
/dev/sr0 on /media type iso9660 (ro)
# 对比可以看出mount命令显示的实际上是对/dev/mtab中的内容的解释
-r, --read-only
Mount the filesystem read-only. A synonym is -o ro.
# 只读挂载,相当于 -o ro
前文中介绍过当使用umount卸载某个挂载设备时,有时候会报device is busy的错误,这可能是由于当前该设备正在被访问,使用fuser命令可以用来显示正在访问某个文件的进程。如以下实例:
[ ~]# mount -o ro,loop /u01/commons-beanutils-1.8.3.iso /media
[ ~]# mount
—————————————运行结果———————————————
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
/u01/commons-beanutils-1.8.3.iso on /media type iso9660 (ro,loop=/dev/loop0)
# 新挂载的设备
[ ~]# cd /media
# 进入/media设备中
[ ]# umount /media
umount: /media: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
# 这时如果再开启一个终端,试图卸载/media设备,会报错。
[ ~]# fuser /media
# 使用fuser命令查看正在访问 /media的进程
[ ~]# fuser -km /media
# 使用 -km选项杀掉使用/media的进程
[ ~]# umount /media
# 再次使用umount可以成功卸载该设备了
注意 fuser -km 命令可以杀掉一些不起作用且占用了系统资源的进程,但这是个比较危险的操作,因为其他用户可能正在编辑该文件,该命令会导致数据丢失。该命令的使用需要一定的权限。
三、自动挂载的环境配置
上文中提到过,手动挂载的设备,系统重启后不会自动挂载。如果希望某个设备能在系统启动时自动挂载,就需要编辑 /etc/fstab这个文件。下面来简单介绍一下这个文件
[ ~]# vim /etc/fstab
—————————————配置文件———————————————
# /etc/fstab
# Created by anaconda on Wed Jul
9 21:21:40 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/VolGroup-lv_root /
UUID=ddd6-4613-ae55-8e99ba0ef627 /boot
/dev/mapper/VolGroup-lv_swap swap
gid=5,mode=620
# 这里有六个字段,其含义如下:
# 要挂载的文件系统
指定文件系统类型
这里需要对转储频率和自检次序做个说明:
转储频率是用来指定对挂载设备进行备份的频率,其中:
0: 表示从来不备份
1: 表示每天备份
2: 表示隔天备份
自检是系统开机检测的过程,当某个文件在创建过程中被意外破坏(如断电),而这个文件已经收录在索引中,这样会导致索引中存在此文件,但无法访问,自检的过程就是清除索引中已经坏掉的文件。不同的文件系统,自检方式也会不同:
ext2的文件系统,其自检过程是将索引和文件一一比对,这样的检查速度比较缓慢;
ext3的文件系统又称为日志文件系统。它可以使自检过程效率更高,但缺陷是同一个索引要写入两次,从而导致I/O操作的冗余。因此日志文件系统开机检测速度高于非日志文件系统,但写入速度低于非日志文件系统。
自检次序就是系统开机自检时的检测顺序。自检时永远首先检测 / 根文件,这里的数字所代表的含义是:
0: 不检测;
1: 表示第一个检测,一般只有根文件系统被第一个检测;
2、 3、 4...依次类推
如果想要使某个设备能在开机时自动挂载,可以进行如下配置:
[ ~]# vim /etc/fstab
—————————————配置文件———————————————
# /etc/fstab
# Created by anaconda on Wed Jul
9 21:21:40 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/VolGroup-lv_root /
UUID=ddd6-4613-ae55-8e99ba0ef627 /boot ext4
/dev/mapper/VolGroup-lv_swap swap
devpts gid=5,mode=620
defaults,noatime 0 0
# 要挂载的文件系统为 /dev/sdb3;挂载点为/ 文件系统的类型为ext4;挂载选项为
# defaults,且不需要更新访问时间;挂载后不用备份,也无需自检
# (如果该文件系统有问题,可以手动检测)
修改了此配置文件后,并不会马上生效,/dev/sdb3这个文件系统只有在下次开机时才会挂载,当前则不会;如果现在要挂载这个文件,只需使用mount [DEVICE]命令手动挂载即可。而使用 mount -a 这个命令,也可以挂载该文件系统。mount -a 命令表示挂载所有定义在 /etc/fstab下且支持auto挂载选项的文件系统,如:
[ ~]# umount /dev/sdb3
[ ~]# mount
—————————————配置文件———————————————
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
# 此时没有挂载 /etc/sdb3这个文件系统
[ ~]# mount -a
# 使用 mount -a 挂载所有/etc/fstab下的文件系统
[ ~]# mount
—————————————配置文件———————————————
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (rw,noatime)
# 可以看到/dev/sdb3被挂载了
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan./9721
1.Linux文件系统挂载和自动挂载是在Linux中非常常用的一个功能,由于Linux的文件架构的特性决定了文件必须先被挂载到某一个挂载点才能使用,因此熟练掌握挂载的使用方法非常重要. 2.挂载的方法: 挂载一般分为三种: 1)手动挂载 2)按需挂载 3)自动挂载 挂载的命令: mount [options] [-t fstype] [-o option]
在linux下分区格式化完成后还没办法像windows下那样直接使用,我们还需要为这些分区(文件系统)提供一个入口,就类似windows下不给一个分区分配盘符就没办法看到一样. linux的目录结构是一个倒状的树,最顶端是&/&根目录,其他目录都从根开始也必须从根开始.&/&根目录是linux文件系统的入口,根目录由内 ...
新swap分区的规划.挂载和自动挂载示例 注:来自Linux系统管理_磁盘分区和格式化的扩展 Linux系统管理_磁盘分区和格式化:http://murongqingqqq./1918 思路: 第一步:首先查看当前swap分区的大小:free -m 第二步:新建磁盘分区指定状态为82,即为swap分区格式:f ...
samba服务器基本配置及挂载和自动挂载 [ ~]# mount /dev/cdrom /mnt/cdrom [ ~]# cd /mnt/cdrom/Server/ [ Server]# rpm -ivh perl-Convert-ASN1-0.20-1.1.noarch.r ...
CentOS 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单. 首先要进入官网下载NTFS-3G工具 /community/ntfs-3g-download/ 1.下载之后进行解压 wget /opensou ...
Centos 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单.首先要进入官网下载NTFS-3G工具/community/ntfs-3g-download/1.下载之后进行解压wget /opensource/ ...系统与管理命令高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍前一页下一页13. 系统与管理命令在/etc/rc.d目录中的启动和关机脚本中包含了好多有用的(和没用的)系统管理命令.
这些命令通常总是被root用户使用, 用于系统维护或者是紧急系统文件修复.
一定要小心使用这些工具, 因为如果滥用的话, 它们会损坏你的系统. User和Group类users显示所有的登录用户. 这个命令与who -q基本一致. groups列出当前用户和他所属的组. 这相当于$GROUPS内部变量,
但是这个命令将会给出组名字, 而不是数字. bash$ groups
bozita cdrom cdwriter audio xgrp
bash$ echo $GROUPS
501chown, chgrpchown命令将会修改一个或多个文件的所有权.
对于root用户来说,
如果他想将文件的所有权从一个用户换到另一个用户的话,
那么使用这个命令是非常好的选择.
一个普通用户不能修改文件的所有权, 即使他是文件的宿主也不行.
root# chown bozo *.txt
chgrp将会修改一个或多个文件的group所有权.
但前提是你必须是这些文件的宿主, 并且必须是目的组的成员(或者是root),
这样你才能够使用这个命令.
1&chgrp --recursive dunderheads *.data
"dunderheads"(译者: 晕,蠢才...) 组现在拥有了所有的"*.data"文件.
3&#+ 包括所有$PWD目录下的子目录中的文件(--recursive的作用就是包含子目录). useradd, userdeluseradd管理命令将会在系统上添加一个用户帐号,
并且如果指定的话, 还会为特定的用户创建home目录.
相应的, userdel命令将会从系统上删除一个用户帐号,
并且会删除相应的文件. adduser与useradd是完全相同的,
adduser通常仅仅是个符号链接.
usermod修改用户帐号. 可以修改给定用户帐号的密码,
组身份, 截止日期, 或者其他一些属性.
使用这个命令, 用户的密码可能会被锁定, 因为密码会影响到帐号的有效性.
groupmod修改指定组. 组名字或者ID号都可以用这个命令来修改.
idid命令将会列出当前进程真实有效的用户ID, 还有用户的组ID.
这与Bash内部变量$UID,
$EUID, 和$GROUPS很相像.
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID
501id命令只有在有效ID与实际ID不符时,
才会显示有效ID. 请参考例子 9-5. who显示系统上所有已经登录的用户.
Apr 27 17:45
Apr 27 17:46
Apr 27 17:47
Apr 27 17:49
-m选项将会给出当前用户的详细信息.
将任意两个参数传递到who中,
都等价于who -m,
就像who am i或who The Man.
bash$ who -m
localhost.localdomain!bozo
Apr 27 17:49
whoami与who
-m很相似, 但是只列出用户名.
bash$ whoami
w显示所有的登录用户和属于它们的进程.
这是一个who命令的扩展版本.
w的输出可以通过管道传递到grep命令中,
这样就可以查找指定的用户或进程. bash$ w | grep startx
startxlogname显示当前用户的登录名(可以在/var/run/utmp中找到).
这与上边的whoami很相近.
bash$ logname
bash$ whoami
bozo然而...bash$ su
Password: ......
bash# whoami
bash# logname
bozologname只会打印出登录的用户名,
而whoami将会给出附着到当前进程的用户名.
就像我们上边看到的那样, 这两个名字有时会不同. su使用替换的用户(substitute user)身份来运行一个程序或脚本.
su rjones将会以用户rjones的身份来启动shell.
使用su命令时, 如果不使用任何参数的话,
那默认就是root用户. 请参考例子 A-15.
sudo以root(或其他用户)的身份来运行一个命令.
这个命令可以用在脚本中, 这样就允许以正规的用户身份来运行脚本.
1&#!/bin/bash
3&# 某些命令.
4&sudo cp /root/secretfile /home/bozo/secret
5&# 其余的命令. 文件/etc/sudoers中保存有允许调用sudo命令的用户名. passwd设置, 修改, 或者管理用户的密码. passwd命令可以用在脚本中,
但是估计你不想这么用, 呵呵. 例子 13-1. 设置一个新密码
1&#!/bin/bash
setnew-password.sh: 这个脚本仅仅用于说明passwd命令.
如果你真想运行这个脚本, 很遗憾, 这可不是个好主意.
这个脚本必须以root身份来运行.
6&ROOT_UID=0
# Root的$UID为0.
7&E_WRONG_USER=65
# 不是root用户?
9&E_NOSUCHUSER=70
10&SUCCESS=0
13&if [ "$UID" -ne "$ROOT_UID" ]
15& echo "Only root can run this script."; echo
exit $E_WRONG_USER
echo "You should know better than to run this script, root."
echo "Even root users get the blues... "
25&username=bozo
26&NEWPASSWORD=security_violation
28&# 检查bozo是否在这里.
29&grep -q "$username" /etc/passwd
30&if [ $? -ne $SUCCESS ]
echo "User $username does not exist."
echo "No password changed."
exit $E_NOSUCHUSER
37&echo "$NEWPASSWORD" | passwd --stdin "$username"
'passwd'命令的'--stdin'选项允许
39&#+ 从stdin(或者管道)中获得一个新的密码.
41& echo "User $username's password changed!"
43&# 在脚本中使用'passwd'命令是非常危险的.
45&exit 0passwd命令的-l,
-u, 和-d选项允许锁定,
解锁, 和删除一个用户的密码. 只有root用户可以使用这些选项.
ac显示用户登录的连接时间,
就像从/var/log/wtmp中读取一样.
这是一个GNU统计工具.
68.08last用户最后登录的信息,
就像从/var/log/wtmp中读出来一样.
这个命令也可以用来显示远端登录.
比如, 显示最后几次系统的重启信息: bash$ last reboot
system boot
2.6.9-1.667
system boot
2.6.9-1.667
system boot
2.6.9-1.667
system boot
2.6.9-1.667
wtmp begins Tue Feb
1 12:50:09 2005newgrp不用登出就可以修改用户的组ID. 并且允许访问新组的文件.
因为用户可能同时属于多个组, 这个命令很少被使用.
终端类命令tty显示当前用户终端的名字.
注意每一个单独的xterm窗口都被算作一个不同的终端.
/dev/pts/1stty显示并(或)修改终端设置. 这个复杂命令可以用在脚本中,
并可以用来控制终端的行为和其显示输出的方法. 参见这个命令的info页, 并仔细学习它.
例子 13-2. 设置一个擦除字符
1&#!/bin/bash
2&# erase.sh: 在读取输入时使用"stty"来设置一个擦除字符.
4&echo -n "What is your name? "
5&read name
试试用退格键
#+ 来删除输入的字符.
有什么问题?
8&echo "Your name is $name."
10&stty erase '#'
将"hashmark"(#)设置为退格字符.
11&echo -n "What is your name? "
12&read name
使用#来删除最后键入的字符.
13&echo "Your name is $name."
15&# 警告: 即使在脚本退出后, 新的键值还是保持着这个设置. (译者: 可以使用stty erase '^?'进行恢复)
17&exit 0例子 13-3. 保密密码: 关闭终端对于密码的echo
1&#!/bin/bash
2&# secret-pw.sh: 保护密码不被显示
5&echo -n "Enter password "
6&read passwd
7&echo "password is $passwd"
8&echo -n "If someone had been looking over your shoulder, "
9&echo "your password would have been compromised."
11&echo && echo
# 在一个"与列表"中产生两个换行.
14&stty -echo
# 关闭屏幕的echo.
16&echo -n "Enter password again "
17&read passwd
19&echo "password is $passwd"
22&stty echo
# 恢复屏幕的echo.
26&# 详细的阅读stty命令的info页, 以便于更好的掌握这个有用并且狡猾的工具. 一个创造性的stty命令的用法,
检测用户所按的键(不用敲回车).
例子 13-4. 按键检测
1&#!/bin/bash
2&# keypress.sh: 检测用户按键("hot keys").
6&old_tty_settings=$(stty -g)
# 保存老的设置(为什么?).
7&stty -icanon
8&Keypress=$(head -c1)
# 或者使用$(dd bs=1 count=1 2> /dev/null)
# 在非GNU系统上
12&echo "Key pressed was \""$Keypress"\"."
15&stty "$old_tty_settings"
# 恢复老的设置.
17&# 感谢, Stephane Chazelas.
19&exit 0请参考例子 9-3. 终端与模式terminals and modes一般情况下, 一个终端都是工作在canonical(标准)模式下.
当用户按键后, 事实上所产生的字符并没有马上传递到运行在当前终端上的程序.
终端上的一个本地缓存保存了这些按键. 当用按下回车键的时候,
才会将所有保存的按键信息传递到运行的程序中.
这就意味着在终端内部存在一个基本的行编辑器.
bash$ stty -a
speed 9600 rows 36; columns 96; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
在使用canonical模式的时候, 可以对本地终端行编辑器所定义的特殊按键进行重新定义.
bash$ cat > filexxx
wha<ctl-W>I<ctl-H>foo bar<ctl-U>hello world<ENTER>
<ctl-D>
bash$ cat filexxx
hello world
bash$ wc -c < filexxx
控制终端的进程只保存了12个字符(11个字母加上一个换行),
虽然用户敲了26个按键.
在non-canonical(("raw")模式下,
每次按键(包括特殊定义的按键,
比如ctl-H)都将会立即发送一个字符到控制进程中.
Bash提示符禁用了icanon和echo,
因为它用自己的行编辑器代替了终端的基本行编辑器, 因为Bash的行编辑器更好.
比如, 当你在Bash提示符下敲ctl-A的时候,
终端将不会显示^A,
但是Bash将会获得\1字符,
然后解释这个字符, 这样光标就移动到行首了.
Stephane Chazelassetterm设置特定的终端属性.
这个命令将向它所在终端的stdout发送一个字符串,
这个字符串将修改终端的行为.
bash$ setterm -cursor off
setterm命令可以放在脚本中用来修改写入到stdout上的文本的外观.
当然, 如果你只想完成这个目的的话,
还有更合适的工具可以用.
1&setterm -bold on
2&echo bold hello
4&setterm -bold off
5&echo normal hellotset显示或初始化终端设置.
可以把它看成一个功能比较弱的stty命令.
bash$ tset -r
Terminal type is xterm-xfree86.
Kill is control-U (^U).
Interrupt is control-C (^C).
setserial设置或者显示串口参数.
这个脚本只能被root用户来运行,
并且通常都在系统安装脚本中使用.
1&# 来自于/etc/pcmcia/serial脚本:
3&IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'`
4&setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQgetty, agetty一个终端的初始化过程通常都是使用getty或agetty来建立,
这样才能让用户登录. 这些命令并不用在用户的shell脚本中.
它们的行为与stty很相似.
mesg启用或禁用当前用户终端的访问权限.
禁用访问权限将会阻止网络上的另一用户向这个终端写消息.
当你正在编写文本文件的时候, 在文本中间突然来了一个莫名其妙的消息,
你会觉得非常烦人. 在多用户的网络环境下, 如果你不想被打断,
那么你必须关闭其他用户对你终端的写权限.
wall这是一个缩写单词"write all",
也就是, 向登录到网络上的所有终端的所有用户都发送一个消息.
最早这是一个管理员的工具, 很有用, 比如,
当系统有问题的时候,
管理可以警告系统上的所有人暂时离开(请参考例子 17-1).
bash$ wall System going down for maintenance in 5 minutes!
Broadcast message from bozo (pts/1) Sun Jul
8 13:53:27 2001...
System going down for maintenance in 5 minutes!
如果某个特定终端使用mesg来禁止了写权限,
那么wall将不会给它发消息.
信息与统计类uname显示系统信息(OS, 内核版本, 等等.) ,输出到stdout上.
使用-a选项, 将会给出详细的系统信息(请参考例子 12-5).
使用-s选项只会输出OS类型. bash$ uname -a
Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST
bash$ uname -s
Linuxarch显示系统的硬件体系结构.
等价于uname -m.
请参考例子 10-26. bash$ arch
bash$ uname -m
i686lastcomm给出前一个命令的信息, 存储在/var/account/pacct文件中.
命令名字和用户名字都可以通过选项来指定. 这是GNU的一个统计工具.
lastlog列出系统上所有用户最后登录的时间.
然后保存到/var/log/lastlog文件中.
bash$ lastlog
7 18:43:21 -
**Never logged in**
**Never logged in**
8 21:14:29 -
bash$ lastlog | grep root
7 18:43:21 -
如果用户对于文件/var/log/lastlog没有读权限的话,
那么调用这个命令就会失败. lsof列出打开的文件. 这个命令将会把所有当前打开的文件都列出到一份详细的表格中,
包括文件的宿主信息, 尺寸, 还有与它们相关的信息等等.
当然, lsof也可以通过管道输出到grep和(或)awk中,
来分析它的内容.
bash$ lsof
30303 /sbin/init
8069 /lib/ld-2.1.3.so
8075 /lib/libc-2.1.3.so
30357 /sbin/cardmgr
strace系统跟踪(System trace):
是跟踪系统调用和信号的诊断和调试工具.
如果你想了解特定的程序或者工具包为什么运行失败的话,
那么这个命令和下边的ltrace命令就显得非常有用了,
. . . 当然, 这种失败现象可能是由缺少相关的库, 或者其他问题所引起.
bash$ strace df
execve("/bin/df", ["df"], [/* 45 vars */]) = 0
uname({sys="Linux", node="bozo.localdomain", ...}) = 0
= 0x804f5e4
这是Solaris truss命令的Linux的等价工具. ltrace库跟踪工具(Library trace):
跟踪给定命令的调用库的相关信息.
bash$ ltrace df
__libc_start_main(0x804a910, 1, 0xbfb589a4, 0x804fb70, 0x804fb68 <unfinished ...>:
setlocale(6, "")
= "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils")
= "coreutils"
__cxa_atexit(0x804b650, 0, 0, 0xxbfb58908) = 0
getenv("DF_BLOCK_SIZE")
nmap网络映射(Network mapper)与端口扫描程序.
这个命令将会扫描一个服务器来定位打开的端口,
并且定位与这些端口相关的服务.
这个命令也能够上报一些包过滤与防火墙的信息.
这是一个防止网络被黑客入侵的非常重要的安全工具.
1&#!/bin/bash
3&SERVER=$HOST
# localhost.localdomain (127.0.0.1).
4&PORT_NUMBER=25
# SMTP端口.
6&nmap $SERVER | grep -w "$PORT_NUMBER"
# 察看指定端口是否打开?
grep -w 匹配整个单词.
这样就不会匹配类似于1025这种含有25的端口了.
12&# 25/tcp
smtpncnc(netcat)工具是一个完整的工具包,
可以用它连接和监听TCP和UDP端口.
它能作为诊断和测试工具,
也能作为基于脚本的HTTP客户端和服务器组件.
bash$ nc localhost.localdomain 25
220 localhost.localdomain ESMTP Sendmail 8.13.1/8.13.1; Thu, 31 Mar :35 -0700
例子 13-5. 扫描远程机器上的identd服务进程
1&#! /bin/sh
2&## 使用netcat工具写的和DaveG写的ident-scan扫描器有同等功能的东西. 噢, 他会被气死的.
3&## 参数: target port [port port port ...]
4&## 标准输出和标准输入被混到一块.
优点: 运行起来比ident-scan慢, 这样使远程机器inetd进程更不易注意而不会产生警告,
7&##+ 并且只有很少的知名端口会被指定.
缺点: 要求数字端口参数, 输出中无法区分标准输出和标准错误,
9&##+ 并且当远程服务监听在很高的端口时无法工作.
10&# 脚本作者: Hobbit <hobbit@avian.org>
11&# 已征得作者同意在ABS指南中使用.
13&# ---------------------------------------------------
14&E_BADARGS=65
# 至少需要两个参数.
15&TWO_WINKS=2
# 睡眠多长时间.
16&THREE_WINKS=3
17&IDPORT=113
# indent协议的认证端口.
18&RAND1=999
19&RAND2=31337
20&TIMEOUT0=9
21&TIMEOUT1=8
22&TIMEOUT2=4
23&# ---------------------------------------------------
25&case "${2}" in
"" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;;
29&# 测试目标主机看是否运行了identd守护进程.
30&nc -z -w $TIMEOUT0 "$1" $IDPORT || { echo "Oops, $1 isn't running identd." ; exit 0 ; }
-z 选项扫描监听进程.
-w $TIMEOUT = 尝试连接多长时间.
34&# 产生一个随机的本地起点源端口.
35&RP=`expr $$ % $RAND1 + $RAND2`
37&TRG="$1"
40&while test "$1" ; do
nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} < /dev/null > /dev/null &
sleep $THREE_WINKS
echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2>&1
sleep $TWO_WINKS
47&# 这看上去是不是像个残疾的脚本或是其他类似的东西... ?
48&# ABS作者评注 : "这不是真的那么糟糕,
事实上, 做得非常聪明."
kill -HUP $PROC
RP=`expr ${RP} + 1`
56&exit $?
试着把第30行去掉,
62&#+ 然后以"localhost.localdomain 25"为参数来运行脚本.
关于Hobbit写的更多'nc'例子脚本,
65&#+ 可以在以下文档中找到:
66&#+ /usr/share/doc/nc-X.XX/scripts 目录.
并且, 当然,
这里还有Dr. Andrew Tridgell在BistKeeper事件中臭名卓著的一行脚本:
1&echo clone | nc thunk.org 5000 > e2fsprogs.dat
free使用表格形式来显示内存和缓存的使用情况.
这个命令的输出非常适合于使用grep,
awk或者Perl来分析.
procinfo将会显示free命令所能显示的所有信息, 而且更加详细.
bash$ free
-/+ buffers/cache:
65412打印出未使用的RAM内存: bash$ free | grep Mem | awk '{ print $4 }'
1880procinfo从/proc
pseudo-filesystem中提取并显示所有信息和统计资料.
这个命令将给出更详细的信息.
bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001
Load average: 0.04 0.21 0.34 3/47 6829lsdev列出系统设备, 也就是显示所有安装的硬件.
bash$ lsdev
------------------------------------------------
01f0-01f7 03f6-03f6
du递归的显示(磁盘)文件的使用状况. 除非特殊指定, 否则默认是当前工作目录.
bash$ du -ach
./random.file
totaldf使用列表的形式显示文件系统的使用状况. bash$ df
Filesystem
Used Available Use% Mounted on
% /usrdmesg将所有的系统启动消息输出到stdout上.
方便除错, 并且可以查出安装了哪些设备驱动和察看使用了哪些系统中断.
dmesg命令的输出当然也放在脚本中, 并使用grep,
sed, 或awk来进行分析.
bash$ dmesg | grep hda
Kernel command line: ro root=/dev/hda2
hda: IBM-DLGA-23080, ATA DISK drive
hda: 6015744 sectors (3080 MB) w/96KiB Cache, CHS=746/128/63
hda: hda1 hda2 hda3 < hda5 hda6 hda7 > hda4
stat显示一个或多个给定文件(也可以是目录文件或设备文件)的详细统计信息(statistic).
bash$ stat test.cru
File: "test.cru"
Size: 49970
Allocated Blocks: 100
Filetype: Regular File
Mode: (0664/-rw-rw-r--)
501/ bozo)
501/ bozo)
Inode: 18185
Access: Sat Jun
2 16:40:24 2001
Modify: Sat Jun
2 16:40:24 2001
Change: Sat Jun
2 16:40:24 2001
如果目标文件不存在,
stat将会返回一个错误消息.
bash$ stat nonexistent-file
nonexistent-file: No such file or directory
vmstat显示虚拟内存的统计信息.
bash$ vmstat
netstat显示当前网络的统计状况和信息,
比如路由表和激活的连接,
这个工具将访问/proc/net( 27)中的信息.
请参考例子 27-3. netstat -r等价于route命令. bash$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags
I-Node Path
/tmp/.X11-unix/X0
. . .uptime显示系统运行的时间,
还有其他的一些统计信息.
bash$ uptime
load average: 0.17, 0.34, 0.27load average如果小于或等于1,
那么就意味着系统会马上处理.
如果大于1, 那么就意味着进程需要排队.
如果大于3, 那么就意味着, 系统性能已经显著下降了.
hostname显示系统的主机名字.
这个命令在/etc/rc.d安装脚本(或类似的/etc/rc.d/rc.sysinit)中设置主机名.
等价于uname -n,
并且与$HOSTNAME内部变量很相像. bash$ hostname
localhost.localdomain
bash$ echo $HOSTNAME
localhost.localdomain与hostname命令很相像的命令还有domainname,
dnsdomainname,
nisdomainname,
和ypdomainname命令.
使用这些命令来显示(或设置)系统DNS或NIS/YP域名.
对于hostname命令来说,
使用不同的选项就可以分别达到上边这些命令的目的. hostid用16进制表示法来显示主机的32位ID.
bash$ hostid
这个命令据说对于特定系统可以获得一个"唯一"的序号.
某些产品的注册过程可能会需要这个序号来作为用户的许可证.
不幸的是, hostid只会使用字节对转换的方法来返回机器的网络地址, 网络地址用16进制表示.
对于一个典型的没有网络的Linux机器来说,
它的网络地址保存在/etc/hosts中.
bash$ cat /etc/hosts
localhost.localdomain localhost
碰巧, 通过对127.0.0.1进行字节转换,
我们获得了0.127.1.0,
用16进制表示就是007f0100,
这就是上边hostid命令返回的结果.
这样几乎所有的无网络的Linux机器都会得到这个hostid. sarsar(System Activity Reporter系统活动报告)命令将会给出系统统计的一个非常详细的概要.
Santa Cruz Operation("以前的"SCO)公司在1999年4月份以开源软件的形式发布了sar. 这个命令并不是基本Linux发行版的一部分,
但是你可以从sysstat
utilities所编写的Sebastien
Godard包中获得这个工具. bash$ sar
Linux 2.4.9 (brooks.seringas.fr)
LINUX RESTART
readelf这个命令会显示elf格式的二进制文件的统计信息. 这个工具是binutils工具包的一部分. bash$ readelf -h /bin/bash
ELF Header:
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
2's complement, little endian
1 (current)
UNIX - System V
ABI Version:
EXEC (Executable file)
. . .sizesize [/path/to/binary]命令可以显示2进制可执行文件或归档文件每部分的尺寸.
这个工具主要提供给程序员使用.
bash$ size /bin/bash
hex filename
82d33 /bin/bash
系统日志类logger附加一个用户产生的消息到系统日志中(/var/log/messages).
即使不是root用户, 也可以调用logger.
1&logger Experiencing instability in network connection at 23:10, 05/21.
2&# 现在, 运行'tail /var/log/messages'.通过在脚本中调用logger命令,
就可以将调试信息写到/var/log/messages中.
1&logger -t $0 -i Logging at line "$LINENO".
2&# "-t"选项可以为日志入口指定标签.
3&# "-i"选项记录进程ID.
5&# tail /var/log/message
7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.
logrotate这个工具用来管理系统的log文件,
可以在合适的时候轮换, 压缩, 删除, 或(和)e-mail它们.
这个工具将从旧的log文件中取得一些杂乱的记录,
并保存到/var/log中.
一般的, 每天都是通过cron来运行logrotate. 在/etc/logrotate.conf中添加合适的入口就可以管理自己的log文件了,
就像管理系统log文件一样.
Stefano Falsetto创造了rottlog,
他认为这是logrotate的改进版本. 作业控制类ps进程统计(Process
Statistics):
通过进程宿主或PID(进程ID)来列出当前正在执行的进程.
通常都是使用ax或aux选项来调用这个命令,
并且结果可以通过管道传递到grep或sed中来搜索特定的进程(请参考例子 11-12和例子 27-2). bash$
ps ax | grep sendmail
0:00 sendmail: accepting connections on port 25如果想使用"树"的形式来显示系统进程:
那么就使用ps afjx或ps ax --forest. pgrep, pkillps命令可以与grep或kill结合使用.
bash$ ps a | grep mingetty
0:00 /sbin/mingetty tty2
0:00 /sbin/mingetty tty3
0:00 /sbin/mingetty tty4
0:00 /sbin/mingetty tty5
0:00 /sbin/mingetty tty6
4849 pts/2
0:00 grep mingetty
bash$ pgrep mingetty
2212 mingetty
2213 mingetty
2214 mingetty
2215 mingetty
2216 mingetty
pstree使用"树"形式列出当前执行的进程.
-p选项显示PID, 也就是进程名字.
top连续不断的显示cpu占有率最高的进程.
-b选项将会以文本方式来显示,
以便于可以在脚本中进行分析或访问.
bash$ top -b
load average: 0.49, 0.32, 0.13
45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 13.6% user,
7.3% system,
0.0% nice, 78.9% idle
78396K av,
65468K used,
12928K free,
2352K buff
157208K av,
157208K free
37244K cached
RSS SHARE STAT %CPU %MEM
TIME COMMAND
0:00 keventd
nice使用经过修改的优先级来运行一个后台作业.
优先级从19(最低)到-20(最高)
只有root用户可以设置负的(相对比较高的)优先级.
相关的命令还有renice,
和skill. nohup保持一个命令进程处于运行状态, 即使这个命令进程所属的用户登出系统.
这个命令进程将会运行在前台, 除非在它前面加上&.
如果你在脚本中使用nohup命令,
那么你最好同时使用wait命令,
这样就可以避免产生孤儿进程或僵尸进程. pidof获取一个正在运行作业的进程ID(PID).
因为一些作业控制命令, 比如kill和renice只能使用进程的PID(而不是它的名字)作为参数,
所以有的时候必须得取得PID.
pidof命令与$PPID内部变量非常相似.
bash$ pidof xclock
例子 13-6. 使用pidof命令帮忙kill一个进程
1&#!/bin/bash
2&# kill-process.sh
4&NOPROCESS=2
6&process=xxxyyyzzz
# 使用不存在的进程.
7&# 只不过是为了演示...
8&# ... 并不想在这个脚本中杀掉任何真正的进程.
10&# 举个例子, 如果你想使用这个脚本来断线Internet,
process=pppd
13&t=`pidof $process`
# 取得$process的pid(进程id).
14&# 'kill'只能使用pid(不能用程序名)作为参数.
16&if [ -z "$t" ]
# 如果没这个进程, 'pidof' 返回空.
echo "Process $process was not running."
echo "Nothing killed."
exit $NOPROCESS
23&kill $t
# 对于某些顽固的进程可能需要使用'kill -9'.
25&# 这里需要做一个检查, 看看进程是否允许自身被kill.
26&# 或许另一个 " t=`pidof $process` " 或许 ...
29&# 整个脚本都可以使用下边这句来替换:
kill $(pidof -x process_name)
killall process_name
33&# 但是这就没有教育意义了.
35&exit 0fuser或取一个正在访问某个或某些文件(或目录)的进程ID.
使用-k选项将会kill这些进程.
对于系统安全来说,
尤其是在脚本中想阻止未被授权的用户访问系统服务的时候,
这个命令就显得非常有用了.
bash$ fuser -u /usr/bin/vim
/usr/bin/vim:
3207e(bozo)
bash$ fuser -u /dev/null
/dev/null:
3009(bozo)
3010(bozo)
3197(bozo)
3199(bozo)
在进行正常插入或删除保存的媒体(比如CD ROM或者USB闪存设备)的时候, fuser命令非常的有用.
某些情况下, 也就是当你umount一个设备失败的时候,
会出现设备忙错误消息.
这意味着某些用户或进程正在访问这个设备.
可以使用fuser -um /dev/device_name来解决这种问题,
这样你就可以kill所有相关的进程.
bash$ umount /mnt/usbdrive
umount: /mnt/usbdrive: device is busy
bash$ fuser -um /dev/usbdrive
/mnt/usbdrive:
1772c(bozo)
bash$ kill -9 1772
bash$ umount /mnt/usbdrive
fuser命令的-n选项可以获得正在访问某一端口的进程.
当和nmap命令结合使用的时候尤其有用.
root# nmap localhost.localdomain
STATE SERVICE
root# fuser -un tcp 25
2095(root)
root# ps ax | grep 2095 | grep -v grep
0:00 sendmail: accepting connections
cron管理程序调度器, 用来执行一些日常任务,
比如清除和删除系统log文件, 或者更新slocate数据库.
这是at命令的超级用户版本(虽然每个用户都可以有自己的crontab文件,
并且这个文件可以使用crontab命令来修改).
它以幽灵进程的身份来运行,
并且从/etc/crontab中获得执行的调度入口.
一般Linux风格的系统都使用crond,
用的是Matthew Dillon版本的cron. 启动与进程控制类initinit命令是所有进程的父进程.
在系统启动的最后一步调用,
init将会依据/etc/inittab来决定系统的运行级别.
只能使用root身份来运行它的别名 - telinit.
telinitinit命令的符号链接,
这是一种修改系统运行级别的手段,
通常在系统维护的时候, 或者在紧急的文件系统修复的时候才能用.
只能使用root身份调用.
调用这个命令是非常危险的 -
在你使用之前确定你已经很好地了解它! runlevel显示当前的和最后的运行级别, 也就是,
判断系统是处于终止状态(runlevel为0),
单用户模式(1), 多用户模式(2或3),
X Windows(5),
还是正处于重起状态(6).
这个命令将会访问/var/run/utmp文件. halt, shutdown, reboot设置系统关机的命令, 通常比电源关机的优先级高. service开启或停止一个系统服务.
在/etc/init.d
和/etc/rc.d中的启动脚本使用这个命令来启动服务.
root# /sbin/service iptables stop
Flushing firewall rules:
Setting chains to policy ACCEPT: filter
Unloading iptables modules:
网络类ifconfig网络的接口配置和调试工具. bash$ ifconfig -a
Link encap:Local Loopback
inet addr:127.0.0.1
Mask:255.0.0.0
UP LOOPBACK RUNNING
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:700 (700.0 b)
TX bytes:700 (700.0 b)ifconfig命令绝大多数情况都是在启动的时候设置接口,
或者在重启的时候关闭它们.
1&# 来自于/etc/rc.d/init.d/network中的代码片断
5&# 检查网络是否启动.
6&[ ${NETWORKING} = "no" ] && exit 0
8&[ -x /sbin/ifconfig ] || exit 0
12&for i in $ do
if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then
action "Shutting down interface $i: " ./ifdown $i boot
16&# grep命令的GNU指定选项"-q"的意思是"安静", 也就是, 不产生输出.
17&# 这样, 后边重定向到/dev/null的操作就有点多余了.
21&echo "Currently active devices:"
22&echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'`
应该被引用以防止通配(globbing).
下边这段也能工作.
echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })'
echo $(/sbin/ifconfig | sed -e 's/ .*//')
感谢, S.C., 做了额外的注释. 请参考例子 29-6. iwconfig这是为了配置无线网络的命令集合.
可以说是上边的ifconfig的无线版本.
route显示内核路由表信息, 或者查看内核路由表的修改情况.
bash$ route
Destination
MSS Window
irtt Iface
pm3-67.bozosisp *
255.255.255.255 UH
pm3-67.bozosisp 0.0.0.0
chkconfig检查网络配置.
这个命令负责显示和管理在启动过程中所开启的网络服务
(这些服务都是从/etc/rc?.d目录中开启的).
最开始是从IRIX到Red Hat Linux的一个接口,
chkconfig在某些Linux发行版中并不是核心安装的一部分.
bash$ chkconfig --list
tcpdump网络包的"嗅探器".
这是一个用来分析和调试网络上传输情况的工具,
它所使用的手段是把所有匹配指定规则的包头都显示出来.
显示主机bozoville和主机caduceus之间所有传输的ip包.
bash$ tcpdump ip host bozoville and caduceus
当然, tcpdump的输出是可以进行分析的,
可以用我们之前讨论的文本处理工具来分析结果. 文件系统类mount加载一个文件系统, 通常都用来安装外部设备, 比如软盘或CDROM.
文件/etc/fstab将会提供一个方便的列表,
这个列表列出了所有可用的文件系统, 分区和设备,
另外还包括某些选项, 比如是否可以自动或者手动的mount.
文件/etc/mtab显示了当前已经mount的文件系统和分区(包括虚拟的,
比如/proc). mount -a将会mount所有出现在/etc/fstab中的文件系统和分区,
除了那些标记有noauto(非自动)选项的.
启动的时候,
在/etc/rc.d中的一个启动脚本(rc.sysinit或者一些相似的脚本)将会调用mount -a,
目的是mount所有可用的文件系统和分区.
1&mount -t iso9660 /dev/cdrom /mnt/cdrom
2&# 加载CDROM
3&mount /mnt/cdrom
4&# 如果/mnt/cdrom包含在/etc/fstab中的话, 那么这么调用就是一种简便的方法.
这个多功能的命令甚至可以将一个普通文件mount到块设备中,
这样一来, 就可以象做操作文件系统一样来操作这个文件.
先将这个文件与一个loopback
device设备相关联, 然后Mount就能达到这个目的了.
这种应用一般都是用来mount或检查一个ISO9660镜像, 经过检查后这个镜像会被烧录到CDR上.
例子 13-7. 检查一个CD镜像
1&# 以root身份...
3&mkdir /mnt/cdtest
# 准备一个mount入口, 如果你没准备的话.
5&mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest
# mount这个镜像.
"-o loop" option equivalent to "losetup /dev/loop0"
7&cd /mnt/cdtest
# 现在检查这个镜像.
# 列出目录树中的文件.
# 诸如此类. umount卸除一个当前已经mount的文件系统.
在删除已经mount上的软盘或CDROM之前, 这个设备必须被umount,
否则文件系统将会被损坏.
1&umount /mnt/cdrom
2&# 现在你可以按下弹出键(指的是cdrom或软盘驱动器上的弹出按键), 并安全的弹出光盘. automount工具,
如果对这个工具进行了适当的安装,
那么当需要访问或退出磁盘(或软盘)的时候,
就能够自动的mount和unmount它们了.
但是如果在带有软躯或光驱的笔记本电脑上使用的话,
可能会引起问题.
sync当你需要更新硬盘buffer中的数据时, 这个命令可以强制将你buffer上的数据立即写入到硬盘上(同步带有buffer的驱动器).
在某些情况下,
一个sync命令可能会挽救你刚刚更新的数据, 比如说突然断电,
所以这个命令可以给系统管理员和普通用户一些保障.
以前, 系统重启前都使用
sync (两次, 为了保证绝对可靠),
这是一种谨慎小心的可靠方法.
某些时候, 比如说当你想安全删除文件的时候(请参考例子 12-55), 或者当磁盘灯开始闪烁的时候,
你可能需要强制对buffer进行立即刷新.
losetup建立和配置loopback设备. 例子 13-8. 在一个文件中创建文件系统
1&SIZE=1000000
3&head -c $SIZE < /dev/zero > file
# 建立指定尺寸的文件.
4&losetup /dev/loop0 file
# 作为loopback设备来创建.
5&mke2fs /dev/loop0
# 创建文件系统.
6&mount -o loop /dev/loop0 /mnt
8&# 感谢, S.C.mkswap创建一个交换分区或文件.
交换区域随后必须马上使用swapon来启用.
swapon, swapoff启用/禁用交换分区或文件.
这两个命令通常在启动和关机的时候才有效.
mke2fs创建Linux ext2文件系统. 这个命令必须以root身份调用.
例子 13-9. 添加一个新的硬盘驱动器
1&#!/bin/bash
3&# 在系统上添加第二块硬盘驱动器.
4&# 软件配置. 假设硬件已经安装了.
5&# 来自于本书作者的一篇文章.
6&# 在"Linux Gazette"的问题#38上, .
8&ROOT_UID=0
# 这个脚本必须以root身份运行.
9&E_NOTROOT=67
# 非root用户将会产生这个错误.
11&if [ "$UID" -ne "$ROOT_UID" ]
echo "Must be root to run this script."
exit $E_NOTROOT
17&# 要非常谨慎小心的使用!
18&# 如果某步错了, 可能会彻底摧毁你当前的文件系统.
21&NEWDISK=/dev/hdb
# 假设/dev/hdb空白. 检查一下!
22&MOUNTPOINT=/mnt/newdisk
#或者选择其他的mount入口.
25&fdisk $NEWDISK
26&mke2fs -cv $NEWDISK1
# 检查坏块, 并且详细输出.
/dev/hdb1, *不是* /dev/hdb!
28&mkdir $MOUNTPOINT
29&chmod 777 $MOUNTPOINT
# 让所有用户都具有全部权限.
32&# 现在, 测试一下...
33&# mount -t ext2 /dev/hdb1 /mnt/newdisk
34&# 尝试创建一个目录.
35&# 如果运行起来了, umount它, 然后继续.
37&# 最后一步:
38&# 将下边这行添加到/etc/fstab.
39&# /dev/hdb1
/mnt/newdisk
41&exit 0请参考例子 13-8和例子 28-3.tune2fs调整ext2文件系统. 可以用来修改文件系统参数,
比如mount的最大数量. 必须以root身份调用.
这是一个非常危险的命令. 一旦用错, 你需要自己负责, 因为它可能会破坏你的文件系统. dumpe2fs打印(输出到stdout)非常详细的文件系统信息.
必须以root身份调用.
root# dumpe2fs /dev/hda7 | grep 'ount count'
dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09
Mount count:
Maximum mount count:
20hdparm显示或修改硬盘参数. 这个命令必须以root身份调用,
如果滥用的话会有危险.
fdisk在存储设备上(通常都是硬盘)创建和修改一个分区表. 必须以root身份使用.
谨慎使用这个命令. 如果出错, 会破坏你现存的文件系统.
fsck, e2fsck, debugfs文件系统的检查, 修复, 和除错命令集合. fsck:
检查UNIX文件系统的前端工具(也可以调用其它的工具).
文件系统的类型一般都是默认的ext2.
e2fsck: ext2文件系统检查器. debugfs: ext2文件系统除错器.
这个功能多 - 并且危险的工具, 主要用处之一就是(尝试)恢复删除的文件.
只有高级用户才能用!
上边的这几个命令都必须以root身份调用,
这些命令都很危险, 如果滥用的话会破坏文件系统.
badblocks检查存储设备的坏块(物理损坏).
这个命令在格式化新安装的硬盘时候, 或者在测试"备份媒体"完整性的时候会被用到.
举个例子, badblocks /dev/fd0用来测试软盘. 如果badblocks使用不慎的话, 可能会引起比较糟糕的结果(覆盖所有数据), 但是在只读模式下就不会发生这种情况.
如果root用户要测试某个设备(这是通常情况),
那么root用户必须使用这个命令.
lsusb, usbmoduleslsusb命令会显示所有USB(Universal
Serial Bus通用串行总线)总线和使用USB的设备.
usbmodules命令会输出连接USB设备的驱动模块的信息.
root# lsusb
Bus 001 Device 001: ID
Device Descriptor:
bDescriptorType
bDeviceClass
bDeviceSubClass
bDeviceProtocol
bMaxPacketSize0
lspci显示pci总线及其设备.
bash$ lspci
00:00.0 Host bridge: Intel Corporation
(Brookdale) Chipset Host Bridge (rev 04)
00:01.0 PCI bridge: Intel Corporation
(Brookdale) Chipset AGP Bridge (rev 04)
00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #3) (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)
mkbootdisk创建启动软盘, 启动盘可以唤醒系统,
比如当MBR(master boot record主启动记录)坏掉的时候.
mkbootdisk命令其实是一个Bash脚本,
由Erik Troan所编写, 放在/sbin目录中. chroot修改ROOT目录. 一般的命令都是从$PATH中获得的,
相对的, 默认根目录是 /.
这个命令将会把根目录修改为另一个目录(并且也将把工作目录修改到那).
这个命令对于安全目的非常有用,
举个例子, 某些情况下, 系统管理员希望限制一些特定的用户,
比如那些telnet上来的用户,
将他们限定到文件系统上一个安全的地方(有时候,
这被称为将一个guest用户限制在"chroot监牢"中).
注意, 在使用chroot命令后,
系统的二进制可执行文件的目录就不再可用了.
chroot /opt将会使得原来的/usr/bin变为/opt/usr/bin.
同样, chroot /aaa/bbb /bin/ls将会使得ls命令以/aaa/bbb作为根目录,
而不是之前的/.
如果使用alias XX 'chroot /aaa/bbb ls',
并把这句放到用户的~/.bashrc文件中的话,
这样可以有效地限制运行命令"XX"时,
命令"XX"可以使用文件系统的范围. 当从启动盘恢复的时候(chroot到/dev/fd0),
或者当系统从死机状态恢复过来并作为lilo选项的时候,
chroot命令都是非常方便的.
其它的应用还包括从不同的文件系统进行安装(一个rpm选项)或者从CDROM上运行一个只读文件系统.
只能以root身份调用, 小心使用.
由于正常的$PATH不再被关联,
所以可能需要将一些特定的系统文件拷贝到chroot之后的目录中,
lockfile这个工具是procmail包的一部分(www.procmail.org).
它可以创建一个锁定文件,
锁定文件是一种用来控制访问文件, 设备或资源的标记文件.
锁定文件就像一个标记一样被使用, 如果特定的文件, 设备,
或资源正在被一个特定的进程所使用("busy"),
那么对于其它进程来说, 就只能进行受限访问(或者不能访问).
1&lockfile /home/bozo/lockfiles/$0.lock
2&# 创建一个以脚本名字为前缀的写保护锁定文件. 锁定文件用在一些特定的场合,
比如说保护系统的mail目录以防止多个用户同时修改,
或者提示一个modem端口正在被访问,
或者显示Netscape的一个实例正在使用它的缓存.
脚本可以做一些检查工作,
比如说一个特定的进程可以创建一个锁定文件,
那么只要检查这个特定的进程是否在运行,
就可以判断出锁定文件是否存在了.
注意如果脚本尝试创建一个已经存在的锁定文件的话,
那么脚本很可能被挂起.
一般情况下, 应用对于锁定文件的创建和检查都放在/var/lock目录中.
脚本可以使用下面的方法来检测锁定文件是否存在.
1&appname=xyzip
2&# 应用"xyzip"创建锁定文件"/var/lock/xyzip.lock".
4&if [ -e "/var/lock/$appname.lock" ]
...flockflock命令不像lockfile那么有用.
它在一个文件上设置一个"咨询性"的锁,
(译者注: "咨询性"的锁有时也称为"建议性"的锁,
这种锁只对协同进程起作用, 还有一种锁叫"强制性"锁,
这种锁加锁的对象读写操作都会由内核做检查,
更多的细节请参考flock(1), flock(2),
/usr/src/linux/Documentation/locks.txt和mandatory.txt),
然后在锁持续的期间可以执行一个命令.
这样可以避免这个命令完成前有另外的进程试图在这个文件上设置锁.
1&flock $0 cat $0 > lockfile__$0
上面这行表示脚本正处于列出自身内容到标准输出的过程中,
3&#+ 设置一把锁锁住脚本文件自身. 与lockfile不同,
flock不会自动创建一个锁定文件. mknod创建块或者字符设备文件(当在系统上安装新硬盘时, 必须这么做).
MAKEDEV工具事实上具有mknod的全部功能,
而且更容易使用. MAKEDEV创建设备文件的工具.
必须在/dev目录下,
并且以root身份使用.
root# ./MAKEDEV
这是mknod的高级版本. tmpwatch自动删除在指定时间内未被访问过的文件.
通常都是被cron调用,
用来删掉旧的log文件. 备份类dump, restoredump命令是一个精巧的文件系统备份工具,
通常都用在比较大的安装版本和网络上.
它读取原始的磁盘分区并且以二进制形式来写备份文件.
需要备份的文件可以保存到各种各样的存储设备上, 包括磁盘和磁带.
restore命令用来恢复
dump所产生的备份. fdformat对软盘进行低级格式化. 系统资源类ulimit设置系统资源的使用上限.
通常情况下都是使用-f选项来调用,
-f用来设置文件尺寸的限制(ulimit
-f 1000就是将文件大小限制为1M).
-c(译者注: 这里应该是作者笔误,
作者写的是-t)选项来限制coredump尺寸(ulimit
-c 0就是不要coredump).
一般情况下,
ulimit的值应该设置在/etc/profile和(或)~/.bash_profile中(请参考Appendix G). 合理的使用ulimit命令可以保护系统免受可怕的fork炸弹的迫害.
1&#!/bin/bash
2&# 这个脚本只是为了展示用.
3&# 你要自己为运行这个脚本的后果负责 -- 它*将*凝固你的系统.
5&while true
这个脚本调用自身 . . .
#+ fork无限次 . . .
#+ 直到系统完全不动, 因为所有的资源都耗尽了.
这就像令人郁闷的"魔术师不断变出雨伞"的场景.
这里不会真正的退出, 因为这个脚本不会终止.
当这个脚本超过预先设置的限制时,
在/etc/profile中的ulimit -Hu
XX(XX就是需要限制的用户进程)可以终止这个脚本的运行.
quota显示用户或组的磁盘配额. setquota从命令行中设置用户或组的磁盘配额. umask设定用户创建文件时缺省的权限mask(掩码).
也可以用来限制特定用户的默认文件属性.
所有用户创建的文件属性都是由umask所指定的.
传递给umask命令的值(8进制)定义了文件的屏蔽权限.
比如, umask
022将会使得新文件的权限最多为755(777与022进行"与非"操作).
当然, 用户随后可以使用chmod来修改指定文件的属性.
用户一般都将设置umask值得地方放在/etc/profile或(和)~/.bash_profile中(请参考Appendix G). 例子 13-10. 用umask将输出文件隐藏起来
1&#!/bin/bash
2&# rot13a.sh: 与"rot13.sh"脚本相同, 但是会将输出写到"安全"文件中.
4&# 用法: ./rot13a.sh filename
./rot13a.sh <filename
./rot13a.sh同时提供键盘输入(stdin)
8&umask 177
文件创建掩码.
被这个脚本所创建的文件
#+ 将具有600权限.
12&OUTFILE=decrypted.txt
结果保存在"decrypted.txt"中
#+ 这个文件只能够被
这个脚本的调用者(或者root)所读写.
16&cat "$@" | tr 'a-zA-Z' 'n-za-mN-ZA-M' > $OUTFILE
^^ 从stdin 或文件中输入.
^^^^^^^^^^ 输出重定向到文件中.
19&exit 0rdev取得root device, swap space, 或video mode的相关信息, 或者对它们进行修改.
一般情况下, rdev的功能都是被lilo所使用,
但是在建立一个ram disk的时候, 这个命令也很有用.
小心使用, 这是一个危险的命令.
模块类lsmod显示所有安装的内核模块.
bash$ lsmod
2 (autoclean)
0 (unused)
0 [opl3 sb uart401]
6 [sb sound]
2 [serial_cs]
pcmcia_core
0 [serial_cs ds i82365]
使用cat /proc/modules可以得到同样的结果. insmod强制安装一个内核模块(如果可能的话,
使用modprobe来代替).
必须以root身份调用. rmmod强制卸载一个内核模块. 必须以root身份调用. modprobe模块装载器, 一般情况下都是在启动脚本中自动调用. 必须以root身份来运行. depmod创建模块依赖文件, 一般都是在启动脚本中调用. modinfo输出一个可装载模块的信息. bash$ modinfo hid
/lib/modules/2.4.20-6/kernel/drivers/usb/hid.o
description: "USB HID support drivers"
"Andreas Gal, Vojtech Pavlik <vojtech@suse.cz>"
杂项类env使用设置过的或修改过(并不是修改整个系统环境)的环境变量来运行一个程序或脚本.
使用[varname=xxx]形式可以在脚本中修改环境变量.
如果没有指定参数, 那么这个命令将会显示所有设置的环境变量.
在Bash或其它Bourne shell的衍生物中,
是可以在同一命令行上设置多个变量的.
1&var1=value1 var2=value2 commandXXX
2&# $var1和$var2只设置在'commandXXX'的环境中.
当不知道shell或解释器路径的时候,
脚本的第一行(#!"sha-bang"行)可以使用env.
1&#! /usr/bin/env perl
3&print "This Perl script will run,\n";
4&print "even when I don't know where to find Perl.\n";
6&# 在不知道perl程序路径的时候,
7&# 这么写有利于跨平台移植.
8&# 感谢, S.C.
ldd显示一个可执行文件和它所需要共享库之间依赖关系. bash$ ldd /bin/ls
libc.so.6 => /lib/libc.so.6 (0x)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x)watch以指定的时间间隔来重复运行一个命令. 默认的时间间隔是2秒, 但是可以使用-n选项进行修改.
1&watch -n 5 tail /var/log/messages
2&# 每隔5秒钟显示系统log文件(/var/log/messages)的结尾. strip从可执行文件中去掉调试符号的引用. 这样做可以减小可执行文件的尺寸, 但是就不能调试了.
这个命令一般都用在Makefile中,
但是很少用在shell脚本中. nm列出未strip过的, 经过编译的, 2进制文件的全部符号. rdist远程分布客户端: 在远端服务器上同步, 克隆, 或者备份一个文件系统. 注意事项[1]这是在Linux机器上或者在带有磁盘配额的UNIX系统上的真实情况. [2]如果正在被删除的特定用户已经登录了主机, 那么userdel命令将会失败. [3]关于烧录CDR的更多细节, 可以参考Alex
Withers的文章, 创建
CD, 这篇文章是1999年10月在Linux
Journal上发表的. [4]mke2fs的-c选项也会进行磁盘坏块检查.
[5]因为只有root用户才具有对/var/lock目录的写权限,
一般的用户脚本不能在那里设置一个锁定文件.
[6]单用户Linux系统的操作更倾向于使用简单的备份工具,
比如tar. [7]NAND"与非"是一种逻辑操作.
事实上, 这种操作与减法很相像. 前一页首页下一页混杂命令上一级分析一个系统脚本

我要回帖

更多关于 三星s7edge吧 的文章

 

随机推荐