免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1163 | 回复: 0
打印 上一主题 下一主题

鸟哥的Linux私房菜学习笔记五 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-05 15:26 |只看该作者 |倒序浏览
学习 Shell Scripts
1. 如同前面 bash command 提到的,指令与参数间的多个空白会被忽略掉;
2. 而空白行也将被忽略掉!,并且 [tab] 也是不会被理会的!
3. 如果读取到一个 Enter 符号 ( CR )),就尝试开始执行该行命令;
4. 至于如果一行的内容太多,则可以使用 \[Enter] 来延伸至下一行;
5. 此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略!
Shell script 的预设变数($0, $1...):
/path/to/scriptname opt1 opt2 opt3 opt4 ...
       $0                                            $1         $2         $3         $4  ...
条件判断式:
if [ 条件判断式 ]; then
        当条件判断式成立时,可以进行的指令工作内容;
fi
if [ 条件判断式 ]; then
        当条件判断式成立时,可以进行的指令工作内容;
else
        当条件判断式不成立时,可以进行的指令工作内容;
fi
if [ 条件判断式一 ]; then
         当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
         当条件判断式二成立时,可以进行的指令工作内容;
else
         当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
利用 case ..... esac 判断
case $变量名称 in
  "第一个变量内容")
        程序段
        ;;
  "第二个变量内容")
        程序段
        ;;
  *)
        不包含第一个变量内容与第二个变量内容的其它程序执行段
        exit 1
        ;;
esac
循环 (loop):while do done, until do done,for...do....done
while [ condition ]
do
          程序段落
done
『当 condition 条件成立时,就进行循环,直到 condition 的条件不成立才停止
until [ condition ]
do
          程序段落
done
当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。
for (( 初始值; 限制值; 执行步阶 ))
do
         程序段
done
for var in con1 con2 con3 ...
do
          程序段
done
1. 第一次循环时, $var 的内容为 con1 ;
2. 第二次循环时, $var 的内容为 con2 ;
3. 第三次循环时, $var 的内容为 con3 ;
shell script 的追踪与 debug:
[root@linux ~]# sh [-nvx] scripts.sh
参数:
-n  :不要执行 script,仅查询语法的问题;
-v  :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x  :将使用到的 script 内容显示到屏幕上,这是很有用的参数!
范例:
Linux 账号与身份管理
新增与移除使用者: useradd, 相关设定档, passwd, usermod, userdel
•  useradd
[root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group] \
>  -[Mm] [-c 说明栏] [-d home] [-s shell] username
参数:
-u  :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g  :后面接的那个群组名称就是我们上面提到的 initial group 啦~该 group ID (GID) 会被放置到 /etc/passwd 的第四个字段内。
-G  :后面接的群组名称则是这个账号还可以支持的群组。这个参数会修改 /etc/group 内的相关资料喔!
-M  :强制!不要建立使用者家目录
-m  :强制!要建立使用者家目录!
-c  :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~
-d  :指定某个目录成为家目录,而不要使用默认值;
-r  :建立一个系统的账号,这个账号的 UID 会有限制 (/etc/login.defs)
-s  :后面接一个 shell ,预设是 /bin/bash 的啦~
useradd 这支程序在建立 Linux 上的账号时,至少会参考:
  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/*
这些档案,不过,最重要的其实是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有使用者家目录
• passwd
• usermod:change user account's information
[root@linux ~]# usermod [-cdegGlsuLU] username
参数:
-c  :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。
-d  :后面接账号的家目录,即修改 /etc/passwd 的第六栏;
-e  :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-g  :后面接 group name,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G  :后面接 group name,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-l  :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏!
-s  :后面接 Shell 的实际档案,例如 /bin/bash 或 /bin/csh 等等。
-u  :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料;
-L  :暂时将使用者的密码冻结,让他无法登入。其实仅改 /etc/shadow 的密码栏。
-U  :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!
• userdel
[root@linux ~]# userdel [-r] username
参数:
-r  :连同使用者的家目录也一起删除
use command "find / -user username" search the user's file
一般身份使用者常用的账号数据变更指令:chfn, chsh
[dmtsai@linux ~]$ chsh [-ls]
参数:
-l  :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s  :设定修改自己的 Shell 啰
[root@linux ~]# chfn [-foph]
参数:
-f  :后面接完整的大名;
-o  :您办公室的房间号码;
-p  :办公室的电话号码;
-h  :家里的电话号码!
查阅数据• finger
[root@linux ~]# finger [-s] username
参数:
-s  :使用长串数据输出格式。
• id
查询某人或自己的相关 UID/GID 等等的信息
新增与移除群组:groupadd,groupmod
•  groupadd
[root@linux ~]# groupadd [-g gid] [-r]
参数:
-g  :后面接某个特定的 GID ,用来直接给予某个 GID ~
-r  :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。
[root@linux ~]# groupmod [-g gid] [-n group_name]
参数:
-g :修改既有的 GID 数字;
-n :修改既有的群组名称
•  groupdel
呼呼! groupdel 自然就是在删除群组的啰~用法很简单:
[root@linux ~]# groupdel [groupname]
gpasswd:change password
密码管理: passwd
[root@linux ~]# passwd [-lunxwS] username
参数:
-l  :将 username 这个账号的密码锁住 (lock),在 /etc/shadow 内的密码栏修订~
-u  :将 -l 的 lock 解开!
-n  :后面接天数 (数字) ,最短天数;亦即是 /etc/shadow 内的第四栏;
-x  :后面接天数 (数字) ,最长天数;亦即是 /etc/shadow 内的第五栏;
-w  :后面接天数 (数字) ,警告天数;亦即是 /etc/shadow 内的第六栏;
-S  :显示目前这个 username 的相关信息。
可以使用 passwd -l 及passwd -u 来强制让一个使用者『暂时』无法使用该账号
[root@linux ~]# su [-lcm] [username]
参数:
-   :如果执行 su - 时,表示该使用者想要变换身份成为 root ,且使用 root 的环境设定参数档,如 /root/.bash_profile 等等。
-l  :后面可以接使用者,例如 su -l dmtsai ,这个 -l 好处是,可使用欲变换身份者他的所有相关环境设定档。
-m  :-m 与 -p 是一样的,表示『使用目前的环境设定,而不重新读取新使用者的设定档。』
-c  :仅进行一次指令,所以 -c 后面可以加上指令喔!
[root@linux ~]# sudo [-u [username|#uid]] command
参数:
-u  :后面可以接使用者账号名称,或者是 UID。例如 UID 是 500 的身份,可以:
      -u #500 来作为切换到 UID 为 500 的那位使用者。
使用者『输入的是自己的密码,而不是欲切换成为他的那个身份的密码, sudo 的执行权限与/etc/sudoers 这的档案有关
特殊的 shell, /sbin/nologin
PAM 模块:/etc/nologin, /etc/securetty
查询使用者: w, who, last, lastlog
使用者对谈: talk, mesg, wall
一些检查工具
•  pwck
pwck 这个指令在检查 /etc/passwd 这个账号设定文件内的信息,与实际的家目录是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致
• pwconv这个指令主要的目的是在『将 /etc/passwd 内的账号与密码,移动到 /etc/shadow 当中! 早期的 Unix』
•  chpasswd
chpasswd 是个挺有趣的指令,他可以『读入未加密前的密码,并且经过加密后, 将加密后的密码写入/etc/shadow 当中。
Linux 磁盘配额 (Quota)
基本的 quota 指令介绍:
/etc/mtab, quota, quotacheck, edquota, quotaon, quotaoff
•  quota:这个指令仅是使用来『显示(display)』目前某个群组或者某个使用者的 quota 限值
[root@linux ~]# quota [-uvsl] [username]
[root@linux ~]# quota [-gvsl] [groupname]
参数:
-u  :后面可以接 username ,表示显示出该使用者的 quota 限制值。若不接 username,表示显示出执行者的 quota 限制值。
-g  :后面可接 groupname ,表示显示出该群组的 quota 限制值。
-v  :显示每个 filesystem 的 quota 值;
-s  :可选择以 inode 或磁盘容量的限制值来显示;
-l  :仅显示出目前本机上面的 filesystem 的 quota 值。
•  quotacheck
[root@linux ~]# quotacheck [-avug] [/mount_point]
参数:
-a  :扫瞄所有在 /etc/mtab 内,含有 quota 支持的 filesystem,加上此参数后,/mount_point 可不必写,因为扫瞄所有的 filesystem 了嘛!
-u  :针对使用者扫瞄档案与目录的使用情况,会建立 aquota.user
-g  :针对群组扫瞄档案与目录的使用情况,会建立 aquota.group
-v  :显示扫瞄过程的信息;
-M  :『强制』进行 quotacheck 的扫瞄。
• edquota[root@linux ~]# edquota [-u username] [-g groupname]
[root@linux ~]# edquota -t  
•  quotaon::::这个指令是在启动 quota 的!不过,由于这个指令是启动 aquota.group 与 aquota.user 的,所以您就必须要先完成 qutoacheck 的工作了
[root@linux ~]# quotaon [-avug]
[root@linux ~]# quotaon [-vug] [/mount_point]
参数:
-u  :针对使用者启动 quota (aquota.user)
-g  :针对群组启动 quota (aquota.group)
-v  :显示启动过程的相关讯息;
-a  :根据 /etc/mtab 内的 filesystem 设定启动有关的 quota ,若不加 -a 的话,则后面就需要加上特定的那个 filesystem 喔!
•  quotaoff
[root@linux ~]# quotaoff [-a]
[root@linux ~]# quotaoff [-ug] [/mount_point]
参数:
-a  :全部的 filesystem 的 quota 都关闭 (根据 /etc/mtab)
-u  :仅针对后面接的那个 /mount_point 关闭 user quota
-g  :仅针对后面接的那个 /mount_point 关闭 group quota
Quota 从开始准备 filesystem 的支持到整个设定结束的主要的步骤大概是:
1. 设定 partition 的 filesystem 支持 quota 参数,启动 filesystem 支持 quota 最简单就是编辑 /etc/fstab ,
2. 建立 quota 记录文件:产生重要的 aquota.group 与 aquota.user
   刚刚前面讲过,整个 quota 进行磁盘限制值记录的档案是 aquota.user/aquota.group, 要建立这两个档案就必须要先利用 quotacheck 扫瞄才行喔!所以啰,接下来的步骤就是: 使用quotacheck 来扫瞄一下我们要使用的磁盘啰;
3.再来就是要启动 quota 啦!启动的方式也是很简单的!就是使用 quotaon -av 即可
4. 编辑 quota 限制值数据:[root@linux ~]# edquota -u username
   再来就是使用 edquota 来编辑每个使用者或群组的可使用空间啰;
5. 重新扫瞄与启动 quota :
   设定好 quota 之后,建议可以再进行一次 quotacheck ,然后再以 quotaon 来启动吧!
6.设定开机时启动 quota:
可以使用 vi 去编辑/etc/rc.d/rc.local ,在里面加入一行 (直接加在最后一行即可):
[root@linux ~]# vi /etc/rc.d/rc.local
/sbin/quotaon -avug
7.利用 repquota 显示更完整的 quota 结果报告:
[root@linux ~]# repquota -a [-vug]
参数:
-a :直接到 /etc/mtab 搜寻具有 quota 标志的 filesystem ,并报告 quota 的结果;
-v :输出所有的 quota 结果,而非仅下达指令者自己的 quota 限值;
-u :显示出使用者的 quota 限值 (这是默认值);
-g :显示出个别群组的 quota 限值。
例行性命令的建立
11 Linux 工作排程的种类: at, cron
1.2 系统上常见的例行性命令有哪些?
2. 仅执行一次的工作排程: at, atq, atrm
3. 循环执行的例行性命令: cron
    3.1 使用者的设定: crontab
    3.2 系统的设定: /etc/crontab
• at 的工作
  可以利用 /etc/at.allow 与 /etc/at.deny 这两个档案来进行 at 的使用限制
[root@linux ~]# at [-m] TIME
参数:
-m   :当 at 的工作完成后,以 email 的方式通知使用者该工作已完成。
TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
   HH:MM                     ex> 04:00
        在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
HH:MM YYYY-MM-DD             ex> 04:00 2005-12-03
        强制规定在某年某月的某一天的特殊时刻进行该工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm December 3
        也是一样,强制在某年某月某日的某时刻进行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
        ex> now + 5 minutes ex> 04pm + 3 days
        就是说,在某个时间点『再加几个时间后』才进行。
下达了 at 之后,才发现指令输入错误,该如何是好?呵呵!就将他移除啊! 利用 atq 与 atrm
[root@linux ~]# atq
[root@linux ~]# atrm [jobnumber]
范例一:查询目前主机上面有多少的 at 工作排程?
[root@linux ~]# atq
10      2005-09-15 23:00 a root
# 上面说的是:『在 2005/09/15 的 23:00 有一项工作,该项工作指令下达者为root』而且,该项工作的工作号码 (jobnumber) 为 10 号喔!
循环执行的例行性命令 crontab
• /etc/cron.allow:
• /etc/cron.deny:
cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录档中,如果您的 Linux 不知道有否被植入木马时, 也可以搜寻一下 /var/log/cron 这个登录档
[root@linux ~]# crontab [-u username] [-l|-e|-r]
参数:
-u  :只有 root 才能进行这个任务,亦即帮其它使用者建立/移除 crontab;
-e  :编辑 crontab 的工作内容
-l  :查阅 crontab 的工作内容
-r  :移除 crontab 的工作内容
若仅想要移除一项工作而已的话,必须要用 crontab -e 去编辑~如果想要全部的工作都移除,才使用 crontab -r 喔!
如果是『系统的例行性任务』时,只要编辑 /etc/crontab,crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文字文件』
程序与资源管理
工作管理 (job control): &, [ctrl]-z, jobs, fg, bg, kill
  要进行 bash 的 job control 必须要注意到的限制是:
•  程序必须来是 shell 的 child process
•  程序不能等待 terminal/shell 的输入(input)
• 直接将指令丢到背景中『执行』的 & :在输入一个指令后,在该指令的最后面加上一个『 & 』代表将该指令丢到背景中
• 将『目前』的工作丢到背景中『暂停』:[ctrl]-z
•  观察目前的背景工作状态: jobs
[root@linux ~]# jobs [-lrs]
参数:
-l  :除了列出 job number 之外,同时列出 PID
-r  :仅列出正在背景 run 的工作;
-s  :仅列出正在背景当中暂停 (stop) 的工作。
• 将背景工作拿到前景来处理:fg %jobnumber
• 让工作在背景下进行: bg %jobnumber
• 管理背景当中的工作: kill
[root@linux ~]# kill -signal %jobnumber
[root@linux ~]# kill -l
参数:
-l  :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
  -1 :重新读取一次参数的设定档 (类似 reload);
  -2 :代表与由键盘输入 [ctrl]-c 同样的动作;
  -9 :立刻强制删除一个工作;
  -15:以正常的程序方式终止一项工作。与 -9 是不一样的。
程序的观察::::静态的 ps 或者是动态的 top,还能以 pstree 来查阅程序树之间的关系
ps:
[root@linux ~]# ps aux
[root@linux ~]# ps -lA
[root@linux ~]# ps axjf
参数:
-A  :所有的 process 均显示出来,与 -e 具有同样的效用;
-a  :不与 terminal 有关的所有 process ;
-u  :有效使用者 (effective user) 相关的 process ;
x   :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l   :较长、较详细的将该 PID 的的信息列出;
j   :工作的格式 (jobs format)
-f  :做一个更为完整的输出。
特别说明:
由于 ps 能够支持的 OS 类型相当的多,所以他的参数多的离谱!而且有没有加上 - 差很多!详细的用法应该要参考 man ps 喔
•  top
[root@linux ~]# top [-d] | top [-bnp]
参数:
-d  :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b  :以批次的方式执行 top ,还有更多的参数可以使用喔!通常会搭配数据流重导向来将批次的结果输出成为档案。
-n  :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p  :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
          ? :显示在 top 当中可以输入的按键指令;
          P :以 CPU 的使用资源排序显示;
          M :以 Memory 的使用资源排序显示;
          N :以 PID 来排序喔!
          T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
          k :给予某个 PID 一个讯号            (signal)
          r :给予某个 PID 重新制订一个 nice 值。
•  pstree
[root@linux ~]# pstree [-Aup]
参数:
-A  :各程序树之间的连接以 ASCII 字符来连接;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。
[root@linux ~]# killall [-iIe] [command name]参数:
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给使用者;
-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
系统资源的观察:
•  free
[root@linux ~]# free [-b|-k|-m|-g] [-t]
参数:
-b  :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)k(Kbytes), 及 g(Gbytes) 来显示单位喔!
-t  :在输出的最终结果,显示物理内存与 swap 的总量。
•  uname
[root@linux ~]# uname [-asrmpi]
参数:
-a  :所有系统相关的信息;
-s  :系统核心名称
-r  :核心的版本
-m  :本系统的硬件名称
-p  :CPU 的类型
-i  :硬件的平台 (ix86)
• uptime::::::显示出目前系统已经开机多久的时间,这个 uptime 可以显示出 top 画面的最上面一行
netstat:
[root@linux ~]# netstat -[atunlp]
参数:
-a  :将目前系统上所有的联机、监听、Socket 数据都列出来
-t  :列出 tcp 网络封包的数据
-u  :列出 udp 网络封包的数据
-n  :不已程序的服务名称,以埠号 (port number) 来显示;
-l  :列出目前正在网络监听 (listen) 的服务;
-p  :列出该网络服务的程序 PID
• dmesg::show开机的时候的讯息
• sar:::主动侦测主机的资源状态, 然后绘制成为图表
[root@linux ~]# sar [-ru] [秒数] [次数]
参数:
-u  :进行 CPU 资源的统计;
-r  :进行主存储器目前状态的分析
关于程序的执行顺序:PRI(new) = PRI(old) + nice
• 一般使用者的 nice 值为 0 ~ 19 ;
• root 可用的 nice 值为 -20 ~ 19 ;
•  nice
[root@linux ~]# nice [-n] command
参数:
-n  :后面接一个数值,数值的范围 -20 ~ 19。
•  renice:::调整的是已经存在的某个 process 的话,那么就得要使用 renice
[root@linux ~]# renice [number] PID
参数:
PID :某个程序的 ID 啊!
查询已开启档案或已执行程序开启之档案:fuser
[root@linux ~]# fuser [-ki] [-signal] file/dir
参数:
-k   :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i   :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 啰!
范例:
范例一:找出目前所在目录的使用 PID 为何?
[root@linux ~]# fuser .
.:                   18852c
[root@linux ~]# ps aux | grep 18852
root     18852  0.0  0.4    5396 1588 pts/0    SN 10:12 0:00 bash
# 用这个方式就可以得到使用该目录的 PID 了。此外,为何使用 fuser
# 的输出当中,在 PID 后面会有 c 呢?他代表的意义为:
# c :在当前的目录下;
# e :可以被执行的;
# f :是一个被开启的档案
# r :代表 root directory
• lsof::查出某个程序开启或者使用的档案与装置
[root@linux ~]# lsof [-Uu] [+d]
参数:
-a  :多项数据需要『同时成立』才显示出结果时!
-U  :仅列出 Unix like 系统的 socket 档案类型;
-u  :后面接 username,列出该使用者相关程序所开启的档案;
+d  :后面接目录,亦即找出某个目录底下已经被开启的档案!
• pidof
[root@linux ~]# pidof [-sx] program_name
参数:
-s  :仅列出一个 PID 而不列出所有的 PID
-x  :同时列出该 program name 可能的 PPID 那个程序的 PID


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93267/showart_1890624.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP