目录

​日期​

​关机重启​

​实例​

​用户及权限​

​改变权限命令​

​档案属性与目录​

​查看环境变量​

​ls查看文件列表​

​cp复制文件​

​文件查看操作​

​cat​

​nl​

​more (一页一页翻动)​

​less (一页一页翻动)​

​head​

​tail​

​od​

​touch​

​vi​

​寻找指令​

​which​

​whereis​

​find(重要)​

​档案压缩与打包​

​compress​

​gzip​

​bzip2​

​tar​

​认识shell​

​命令​

​获取变量​

​单引号双引号​

​` 符号的作用​

​列出目前的 shell 环境下的所有环境变量与其内容​

​env​

​set​

​设置字符编码等​

​read​

​数组​

​其他 ​

​ 命令执行的判断依据: ; , &&, ||​

​与档案系统及程序的限制关系: ulimit​

​命令取别名:alias​

​历史命令:history​

​登录讯息显示数据: /etc/issue, /etc/motd​

​stty​

​快捷键​

​输出重定向​

​管线命令 (pipe) |​

​grep​

​sort​

​wc​

​学习shell scripts​

​test判断​

​利用判断符号 [ ]​

​变量​

​利用 if .... then​

​利用 case ..... esac 判断​

​利用 function 功能​

​循环 (loop)​

​shell script 的追踪与 debug​

​linux账号与身份管理​

​有效群组(effective group)与初始群组(initial group)​

​新增用户:useradd​

​修改密码​

​usermod​

​删除用户​

​使用者功能:chfn, chsh修改用户信息​

​finger [-s] username    查询用户信息​

​查询用户的各种id​

​groupadd 添加组​

​groupmod修改群组​

​groupdel 删除群组​

​gpasswd 修改群组密码​

​su​

​sudo 是怎样工作的​

​如果想修改sudu   要使用  visudo​

​查询使用者: w, who, last, lastlog​

​使用者对谈: talk, mesg, wall​

​使用者邮件信箱: mail​

​一些检查工具​

​删除账号​

​linux磁盘配额​

​linux磁盘与档案系统管理​

​例行性命令的建立​

​仅进行一次的工作排程: at​

​使用者的设定: crontab(定时任务)​

​程序与资源管理​

​将『目前』的工作丢到背景中『暂停』:[ctrl]-z​

​观察目前的背景工作状态: jobs​

​将背景工作拿到前景来处理:fg​

​让工作在背景下进行: bg​

​管理背景当中的工作: kill​

​ps​

​top​

​pstree​

​free​

​uname​

​uptime   开机多久了。​

​netstat​

​sar​

​nice​

​fuser​

​lsof​

​开机关机流程与loader​


日期


显示日期:date

显示日历:cal 、 cal 2019 、cal 6 2019

计算器:bc


关机重启


-k : 不要真的关机,只是发送警告讯息出去!

-r : 在将系统的服务停掉之后就重新开机

-h : 将系统的服务停掉后,立即关机。

-n : 不经过 init 程序,直接以 shutdown 的功能来关机

-f : 关机并开机之后,强制略过 fsck 的磁盘检查

-F : 系统重新开机之后,强制进行 fsck 的磁盘检查

-c : 取消已经在进行的 shutdown 指令内容。


实例


root@linux ~]# shutdown -h now
立刻关机,其中 now 相当于时间为 0 的状态
[root@linux ~]# shutdown -h 20:25
系统在今天的 20:25 分会关机
[root@linux ~]# shutdown -h +10
系统再过十分钟后自动关机
[root@linux ~]# shutdown -r now
系统立刻重新开机
[root@linux ~]# shutdown -r +30 'The system will reboot'
再过三十分钟系统会重新开机,并显示后面的讯息。
[root@linux ~]# shutdown -k now 'This system will reboot'
仅发出警告信件的参数!系统并不会关机啦!吓唬人!


用户及权限

一个用户可以有多个组。

所有的系统上的账号与一般身份使用者,还有那个 root 的相关信息,都是记录在 /etc/passwd 这个档案内的。

密码记录在 /etc/shadow 这个档案下。 

Linux 所有的群组名称都纪录在 /etc/group 内!

注意:只有给目录的其他成员权限,附成r-x权限以上,其他成员才可以进入该目录;r--这样没有可执行权限,是无法进入目录的!文件可以!

x 在目录当中是与『能否进入该目录』有关, 至于那个 w 则具有相当重要的权限,因为他可以让使用者删除、更新、新建档案或目录

改变权限命令


chgrp :改变档案所属群组

chown :改变档案所属人

chmod :改变档案的属性、 SUID、等等的特性


chgrp [-R] dirname/filename 

chown [-R] 账号名称 档案或目录

chown [-R] 账号名称:群组名称 档案或目录


chmod [-R] xyz 档案或目录

chmod [ugoa] [+-=] [rwx] 档案或目录  (user、group、other)



umask

0022  (后面三个数是默认权限,减去的权限)

umask -S

u=rwx,g=rx,o=rx

umask 指定的是『该默认值需要减掉的权限!』



s 与 t 的权限,是为了让一般使用者在执行某些程序的时候, 能够暂时的具有该程序拥有者的权限。

当一个指令具有 SUID 的功能时,则当其它人使用这个指令时,该程序将具有指令拥有者的权限。

• 4 为 SUID

• 2 为 SGID 

• 1 为 Sticky bit

chmod 4755 filename 前面数字代表权限


档案属性与目录


mkdir -p /home/t/tt/ttt   :递归建立文件夹若上级不存在则创建

mkdir -m 711 test2    :可以直接指定文件夹的权限

rmdir [-p]  : 删除文件夹(-p递归删除空文件夹) 这个命令只能删除空文件夹


查看环境变量


echo $PATH    每个目录之间用:连接

PATH="$PATH":/root    添加环境变量


ls查看文件列表


ls -al 可以查看隐藏文件

ls [-aAdfFhilRS] 目录名称

ls [--color={none,auto,always}] 目录名称

ls [--full-time] 目录名称

参数:

-a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~

-A :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~

-d :仅列出目录本身,而不是列出目录内的档案数据

-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)

-F :根据档案、目录等信息,给予附加数据结构,例如:

*:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;

-h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来;

-i :列出 inode 位置,而非列出档案属性;

-l :长数据串行出,包含档案的属性等等数据;

-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)

-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;

-R :连同子目录内容一起列出来;

-S :以档案容量大小排序!

-t :依时间排序

--color=never :不要依据档案特性给予颜色显示;

--color=always :显示颜色

--color=auto :让系统自行依据设定来判断是否给予颜色

--full-time :以完整时间模式 (包含年、月、日、时、分) 输出

--time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime)而非内容变更时间 (modification time)


• modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据指的是档案的内容,而不是档案的属性喔!

• status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像是权限与属性被更改了,都会更新这个时间啊~

• access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。

cp复制文件


cp [-adfilprsu] 来源档(source) 目的檔(destination)

cp [options] source1 source2 source3 .... directory

参数:

-a :相当于 -pdr 的意思;

-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;

-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;

-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!

-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;

-p :连同档案的属性一起复制过去,而非使用预设属性;

-r :递归持续复制,用于目录的复制行为;

-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;

-u :若 destination 比 source 旧才更新 destination !


文件查看操作


• cat 由第一行开始显示档案内容

• tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

• nl 显示的时候,顺道输出行号!

• more 一页一页的显示档案内容

• less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

• head 只看头几行

• tail 只看尾巴几行

• od 以二进制的方式读取档案内容!


cat


cat [-AEnTv]

参数:

-A :相当于 -vET 的整合参数,可列出一些特殊字符~

-E :将结尾的断行字符 $ 显示出来;

-n :打印出行号;

-T :将 [tab] 按键以 ^I 显示出来;

-v :列出一些看不出来的特殊字符


nl


nl [-bnw] 档案

参数:

-b :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号;

-b t :如果有空行,空的那一行不要列出行号;

-n :列出行号表示的方法,主要有三种:

-n ln :行号在屏幕的最左方显示;

-n rn :行号在自己字段的最右方显示,且不加 0 ;

-n rz :行号在自己字段的最右方显示,且加 0 ;

-w :行号字段的占用的位数。


more (一页一页翻动)


more (一页一页翻动)

• 空格键 (space):代表向下翻一页;

• Enter :代表向下翻『一行』;

• /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;

• :f :立刻显示出文件名以及目前显示的行数;

• q :代表立刻离开 more ,不再显示该档案内容。


less (一页一页翻动)


less (一页一页翻动)

• 空格键 :向下翻动一页;

• [pagedown]:向下翻动一页;

• [pageup] :向上翻动一页;

• /字符串 :向下搜寻『字符串』的功能;

• ?字符串 :向上搜寻『字符串』的功能;

• n :重复前一个搜寻 (与 / 或 ? 有关!)

• N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

• q :离开 less 这个程序;


head


head [-n number] 档案

参数:

-n :后面接数字,代表显示几行的意思


tail


tail [-n number] 档案

参数:

-n :后面接数字,代表显示几行的意思


od


od [-t TYPE] 档案

参数:

-t :后面可以接各种『类型 (TYPE)』的输出,例如:

a :利用预设的字符来输出;

c :使用 ASCII 字符来输出

d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;

f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;

o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;

x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;


• modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据指的是档案的内容,而不是档案的属性喔!

• status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像是权限与属性被更改了,都会更新这个时间啊~

• access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。

touch


touch [-acdmt] 档案

参数:

-a :仅修订 access time;

-c :仅修改时间,而不建立档案;

-d :后面可以接日期,也可以使用 --date="日期或时间"

-m :仅修改 mtime ;

-t :后面可以接时间,格式为[YYMMDDhhmm]

touch -d "2 days ago" bashrc

touch -t 0507150202 bashrc


vi

vi命令大全_秃了也弱了。的博客

which


which [-a] command

参数:

-a :将所有可以找到的指令均列出,而不止第一个被找到的指令名称


whereis


寻找特定档案:

whereis [-bmsu] 档案或目录名

参数:

-b :只找 binary 的档案(可执行)

-m :只找在说明文件 manual 路径下的档案

-s :只找 source 来源档案

-u :没有说明档的档案!


find(重要)


find [PATH] [option] [action]

参数:

1. 与时间有关的参数:

-atime n :n 为数字,意义为在 n 天之前的『一天之内』被 access 过的档案;

-ctime n :n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的档案;

-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的档案;

-newer file :file 为一个存在的档案,意思是说,只要档案比 file 还要新,就会被列出来~

2. 与使用者或群组名称有关的参数:

-uid n :n 为数字,这个数字是使用者的账号 ID,亦即 UID ,这个 UID 是记录在

/etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。

-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在

/etc/group,相关的介绍我们会第四篇说明~

-user name :name 为使用者账号名称喔!例如 dmtsai

-group name:name 为群组名称喔,例如 users ;

-nouser :寻找档案的拥有者不存在 /etc/passwd 的人!

-nogroup :寻找档案的拥有群组不存在于 /etc/group 的档案!

当您自行安装软件时,很可能该软件的属性当中并没有档案拥有者,这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

3. 与档案权限及名称有关的参数:

-name filename:搜寻文件名称为 filename 的档案;

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有:

c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB还要大的档案,就是『 -size +50k 』

-type TYPE :搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案 (f),装置档案 (b, c), 目录 (d), 连结档 (l), socket (s),及 FIFO (p) 等属性。

-perm mode :搜寻档案属性『刚好等于』 mode 的档案,这个 mode 为类似 chmod的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !

-perm -mode :搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,

当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,

因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

-perm +mode :搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------也会被列出来,因为他有 -rw.... 的属性存在!

4. 额外可进行的动作:

-exec command :command 为其它指令,-exec 后面可再接额外的指令来处理搜寻到的结果。

-print :将结果打印到屏幕上,这个动作是预设动作!

范例:

范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的档案列出

[root@linux ~]# find / -mtime 0

# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,

# 有变动过内容的档案都会被列出来!那如果是三天前的 24 小时内?

# find / -mtime 3 ,意思是说今天之前的 3*24 ~ 4*24 小时之间

# 有变动过的档案都被列出的意思!同时 -atime 与 -ctime 的用法相同。

范例二:寻找 /etc 底下的档案,如果档案日期比 /etc/passwd 新就列出

[root@linux ~]# find /etc -newer /etc/passwd

# -newer 用在分辨两个档案之间的新旧关系是很有用的!

范例三:搜寻 /home 底下属于 dmtsai 的档案

[root@linux ~]# find /home -user dmtsai

# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时,

# 就可以利用这个指令将属于某个使用者的所有档案都找出来喔!

范例四:搜寻系统中不属于任何人的档案

[root@linux ~]# find / -nouser

# 透过这个指令,可以轻易的就找出那些不太正常的档案。

# 如果有找到不属于系统任何人的档案时,不要太紧张,

# 那有时候是正常的~尤其是您曾经以原始码自行编译软件时。

范例五:找出档名为 passwd 这个档案

[root@linux ~]# find / -name passwd

# 利用这个 -name 可以搜寻档名啊!

范例六:搜寻档案属性为 f (一般档案) 的档案

[root@linux ~]# find /home -type f

# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的档案,

# 例如 socket 与 FIFO 档案,可以用 find /var -type p 或 -type s 来找!

范例七:搜寻档案当中含有 SGID/SUID/SBIT 的属性

[root@linux ~]# find / -perm +7000

# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,

# 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限,

# 因此,就是 +7000 ~瞭乎?

范例八:将上个范例找到的档案使用 ls -l 列出来~

[root@linux ~]# find / -perm +7000 -exec ls -l {} \;

# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,

# 而那个 {} 代表的是『由 find 找到的内容』的意思~所以, -exec ls -l {}

# 就是将前面找到的那些档案以 ls -l 列出长的数据!至于 \; 则是表示

# -exec 的指令到此为止的意思~意思是说,整个指令其实只有在

# -exec (里面就是指令下达) \;

# 也就是说,-exec 最后一定要以 \; 结束才行!这样了解了吗?!

范例九:找出系统中,大于 1MB 的档案

[root@linux ~]# find / -size +1000k

# 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB,

# 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧!


档案压缩与打包


• *.Z compress 程序压缩的档案;

• *.bz2 bzip2 程序压缩的档案;

• *.gz gzip 程序压缩的档案;• *.tar tar 程序打包的数据,并没有压缩过;

• *.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩


compress


compress [-dcr] 档案或目录

参数:

-d :用来解压缩的参数

-r :可以连同目录下的档案也同时给予压缩呢!

-c :将压缩数据输出成为 standard output (输出到屏幕)


gzip


gzip [-cdt#] 檔名

zcat 檔名.gz (查看压缩的文件内容)

参数:

-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;

-d :解压缩的参数;

-t :可以用来检验一个压缩档的一致性~看看档案有无错误;

-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6 ~


bzip2


bzip2 [-cdz] 檔名

bzcat 檔名.bz2(查看压缩的文件内容)

参数:

-c :将压缩的过程产生的数据输出到屏幕上!

-d :解压缩的参数

-z :压缩的参数

-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!


tar


tar [-cxtzjvfpPN] 档案与目录 ....

参数:

-c :建立一个压缩档案的参数指令(create 的意思);

-x :解开一个压缩档案的参数指令!

-t :查看 tarfile 里面的档案!

特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!

因为不可能同时压缩与解压缩。

-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

-v :压缩的过程中显示档案!这个常用,但不建议用在背景执行过程!

-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!

例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成

『 tar -zcvPf tfile sfile』才对喔!

-p :使用原档案的原来属性(属性不会依据使用者而变)

-P :可以使用绝对路径来压缩!

-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中!

--exclude FILE:在压缩的过程中,不要将 FILE 打包!


认识shell

命令取别名:

alias lm='ls -al'   :lm指定为ls -al

万用字符  * 

命令


command [-options] parameter1 parameter2 ...

指令 选项 参数(1) 参数(2)

说明:

0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』

1. command 为指令的名称,例如变换路径的指令为 cd 等等;

2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h;

有时候完整参数名称会输入 -- 符号,例如 --help;

3. parameter1 parameter2.. 为依附在 option 后面的参数,

或者是 command 的参数;

4. command, -options, parameter1.. 这几个咚咚中间以空格来区分,

不论空几格 shell 都视为一格;

5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 <CR> 字符,

他代表着一行指令的开始启动。

6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号,

使指令连续到下一行。注意! \ 后就立刻接特殊字符。

7. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。


获取变量



变量后面可以接 #, ##, %, %%, /, // , 而他们存在的意义并不相同的

a=1

echo $a

echo ${a}

1. 变量与变量内容以等号『=』来连结;

2. 等号两边不能直接接空格符;

3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;

4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意, 双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;

5. 必要时需要以跳脱字符『 \ 』来将特殊符号 ( 如 Enter, $, \, 空格符, ' 等 ) 变成一般符号;

6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『` command` 』;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)

7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称 如:『"$PATH":/home』继续累加内容;

8. 若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量, 如『export PATH』;

9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;

10. 取消变量的方法为:『unset 变量名称』。


单引号双引号


单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是

一般字符 ,而不会有特殊符号。

[root@linux ~]# name=VBird

[root@linux ~]# echo $name

VBird

[root@linux ~]# myname="$name its me"

[root@linux ~]# echo $myname

VBird its me

[root@linux ~]# myname='$name its me'

[root@linux ~]# echo $myname

$name its me


` 符号的作用


在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!

ls -l `locate crontab`  :先执行后面的语句在执行前面的。


列出目前的 shell 环境下的所有环境变量与其内容

env


[root@linux ~]# env

HOSTNAME=linux.dmtsai.tw <== 这部主机的主机名称

SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序?

TERM=xterm <== 这个终端机使用的环境是什么类型

HISTSIZE=1000 <== 这个就是『记录指令的笔数』在 FC4 预设可记录 1000 笔

USER=root <== 使用者的名称啊!

LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:

or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0

0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=

00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3

1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00

;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示

ENV=/root/.bashrc <== 使用的个人环境设定档

MAIL=/var/spool/mail/root <== 这个使用者所取用的 mailbox 位置

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:

/root/bin <== 不再多讲啊!是执行文件指令搜寻路径

INPUTRC=/etc/inputrc <== 与键盘按键功能有关。可以设定特殊按键!

PWD=/root <== 目前使用者所在的工作目录 (利用 pwd 取出!)

LANG=en_US.UTF-8 <== 这个与语系有关,底下会再介绍!

HOME=/root <== 这个使用者的家目录啊!

_=/bin/env <== 上一次使用的指令的最后一个参数(或指令本身)


set

这个指令除了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来喔!


[root@linux ~]# set

BASH=/bin/bash <== bash 的主程序放置路径

BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release"

[5]="i386-redhat-linux-gnu") <== bash 的版本啊!

BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊!

COLORS=/etc/DIR_COLORS.xterm <== 使用的颜色纪录档案

COLUMNS=115 <== 在目前的终端机环境下,使用的字段有几个字符长度

HISTFILE=/root/.bash_history <== 历史命令记录的放置档案,隐藏档

HISTFILESIZE=1000 <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。

HISTSIZE=1000 <== 目前环境下,可记录的历史命令最大笔数。

HOSTTYPE=i386 <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件

IFS=$' \t\n' <== 预设的分隔符

LINES=35 <== 目前的终端机下的最大行数

MACHTYPE=i386-redhat-linux-gnu <== 安装的机器类型

MAILCHECK=60 <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!

OLDPWD=/home <== 上个工作目录。我们可以用 cd - 来取用这个变量。

OSTYPE=linux-gnu <== 操作系统的类型!

PPID=20046 <== 父程序的 PID (会在后续章节才介绍)

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'

<== 上面这个是命令提示字符!与底下也有关。

PS1='[\u@\h \W]\$ ' <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的



[root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的!

RANDOM=13586 <== 随机数啊!上面已经提过啰~

SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系

name=VBird <== 刚刚设定的自订变量也可以被列出来喔!

$ <== 目前这个 shell 所使用的 PID

? <== 刚刚执行完指令的回传值。


echo $$  :获取shell的pid


echo $? :?获取到上一个指令的返回码(0为成功,其他为失败)。


export a : a变量可以在shell子程序中使用了。


locale -a  :查询支持的语言(非常多)


设置字符编码等


[root@linux ~]# LANG <==主语言的环境

[root@linux ~]# LC_CTYPE <==字符辨识的编码

[root@linux ~]# LC_NUMERIC <==数字系统的显示讯息

[root@linux ~]# LC_TIME <==时间系统的显示数据

[root@linux ~]# LC_COLLATE <==字符串的比较与排序等

[root@linux ~]# LC_MONETARY <==币值格式的显示等

[root@linux ~]# LC_MESSAGES <==讯息显示的内容,如菜单、错误讯息等

[root@linux ~]# LC_ALL <==语言环境的整体设定


read


要读取来自键盘输入的变量,就是用 read 这个指令了

read [-pt] variable

参数:

-p :后面可以接提示字符!

-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!

范例:

范例一:让使用者由键盘输入一内容,将该内容变成 atest 变量

[root@linux ~]# read atest

This is a test

[root@linux ~]# echo $atest

This is a test

范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串做成 named 变量

[root@linux ~]# read -p "Please keyin your name: " -t 30 named

Please keyin your name: VBird Tsai

[root@linux ~]# echo $named

VBird Tsai


数组


范例:设定上面提到的 var[1] ~ var[3] 的变数。

[root@linux ~]# var[1]="small min"

[root@linux ~]# var[2]="big min"

[root@linux ~]# var[3]="nice min"

[root@linux ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"


其他 


* 万用字符,代表 0 个或多个字符(或数字)

? 万用字符,代表『一定有』一个字母

# 批注,这个最常被使用在 script 当中,视为说明!

\ 跳脱符号,将『特殊字符或万用字符』还原成一般字符

| 分隔两个管线命令的界定;

; 连续性命令的界定(注意!与管线命令并不相同)

~ 使用者的家目录

$ 亦即是变量之前需要加的变量取代值

& 将指令变成背景下工作

! 逻辑运算意义上的『非』 not 的意思!

/ 路径分隔的符号

>, >> 输出导向,分别是『取代』与『累加』

' 单引号,不具有变量置换的功能

" 具有变量置换的功能!

` ` 两个『 ` 』中间为可以先执行的指令!

( ) 在中间为子 shell 的起始与结束

[ ] 在中间为字符的组合

{ } 在中间为命令区块的组合!


 命令执行的判断依据: ; , &&, ||


sync; sync; shutdown -h now   ;表示上个命令执行完了执行下一个,用来分割命令。

ls /tmp && touch /tmp/testingagin    &&表示上一个命令执行成功了,再执行下一个

ls /tmp/vbirding || touch /tmp/vbirding   ||表示上一个命令执行成功了,就不执行下一个了。否则执行失败了才执行下一个

ls /tmp/vbirding || echo "not exist" && echo "exist"  第一个执行成功,就执行第三条,否则执行第二条。


与档案系统及程序的限制关系: ulimit


ulimit [-SHacdflmnpstuv] [配额]

参数:

-H :hard limit ,严格的设定,必定不能超过设定的值;

-S :soft limit ,警告的设定,可以超过这个设定值,但是会有警告讯息,

并且,还是无法超过 hard limit 的喔!也就是说,假设我的 soft limit

为 80 , hard limit 为 100 ,那么我的某个资源可以用到 90 ,

可以超过 80 ,还是无法超过 100 ,而且在 80~90 之间,会有警告讯息的意思。

-a :列出所有的限制额度;

-c :可建立的最大核心档案容量 (core files)

-d :程序数据可使用的最大容量

-f :此 shell 可以建立的最大档案容量 (一般可能设定为 2GB)单位为 Kbytes

-l :可用于锁定 (lock) 的内存量

-p :可用以管线处理 (pipe) 的数量

-t :可使用的最大 CPU 时间 (单位为秒)

-u :单一使用者可以使用的最大程序(process)数量。


命令取别名:alias


直接输入alias 可以查看当前取的别名。

alias lm='ls -l | more'    设置别名

unalias lm  取消别名


历史命令:history



echo $HISTSIZE  查看记录历史最大笔数

[root@linux ~]# history [n]

[root@linux ~]# history [-c]

[root@linux ~]# history [-raw] histfiles

参数:

n :数字,意思是『要列出最近的 n 笔命令列表』的意思!

-c :将目前的 shell 中的所有 history 内容全部消除

-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,则预设写入 ~/.bash_history

-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;

-w :将目前的 history 记忆内容写入 histfiles 中!



history其他用法:

[root@linux ~]# !number

[root@linux ~]# !command

[root@linux ~]# !!

参数:

number :执行第几笔指令的意思;

command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;

!! :就是执行上一个指令(相当于按↑按键后,按 Enter)

范例:

[root@linux ~]# history

66 man rm

67 alias

68 man history

69 history

[root@linux ~]# !66 <==执行第 66 笔指令

[root@linux ~]# !! <==执行上一个指令,本例中亦即 !66

[root@linux ~]# !al <==执行最近以 al 为开头的指令(上头列出的第 67 个)


登录讯息显示数据: /etc/issue, /etc/motd


cat /etc/issue

Fedora Core release 4 (Stentz)

Kernel \r on an \m

\d 本地端时间的日期;

\l 显示第几个终端机接口;

\m 显示硬件的等级 (i386/i486/i586/i686...);

\n 显示主机的网络名称;

\o 显示 domain name;

\r 操作系统的版本 (相当于 uname -r)

\t 显示本地端时间的时间;

\s 操作系统的名称;

\v 操作系统的版本。

vi /etc/motd   可以修改登录提示信息

Hello everyone,

Our server will be maintained at 2005/10/10 0:00 ~ 24:00.


stty


stty [-a]

参数:

-a :将目前所有的 stty 参数列出来;

如果出现 ^ 表示 [Ctrl] 那个按键的意思。举例来说, intr = ^C 表示利用 [ctrl] + c 来达成的。 几个重要的代表意义是:

• eof : End of file 的意思,代表『结束输入』。

• erase : 向后删除字符,

• intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;

• kill : 删除在目前指令列上的所有文字;

• quit : 送出一个 quit 的讯号给目前正在 run 的程序;

• start : 在某个程序停止后,重新启动他的 output

• stop : 停止目前屏幕的输出;

• susp : 送出一个 terminal stop 的讯号给正在 run 的程序。

stty erase ^h  设置erase快捷键为ctrl+h


快捷键


Ctrl + C 终止目前的命令

Ctrl + D 输入结束(EOF),例如邮件结束的时候;

Ctrl + M 就是 Enter 啦! Ctrl + S 暂停屏幕的输出

Ctrl + Q 恢复屏幕的输出

Ctrl + U 在提示字符下,将整列命令删除

Ctrl + Z 『暂停』目前的命令


输出重定向


• 1> :是将正确的数据输出到指定的地方去

• 2> :是将错误的数据输出到指定的地方去

如果只有 > 则预设是以 1> 来进行数据的!

find /home -name testing > list_right 2> list_error

find /home -name testing > list_right 2> /dev/null    /dev/null是垃圾回收,所有定向到这里的数据都会消失

find /home -name testing > list 2> list <==错误写法

find /home -name testing > list 2>&1 <==正确写法  错误输出和正确输出写在同一个文件里


管线命令 (pipe) |

上一条命令的结果作为上一条命令的参数

grep


grep [-acinv] '搜寻字符串' filename 参数:

-a :将 binary 档案以 text 档案的方式搜寻数据

-c :计算找到 '搜寻字符串' 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!


sort


sort [-fbMnrtuk] [file or stdin]

参数:

-f :忽略大小写的差异,例如 A 与 a 视为编码相同;

-b :忽略最前面的空格符部分;

-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

-n :使用『纯数字』进行排序(预设是以文字型态来排序的);

-r :反向排序;

-u :就是 uniq ,相同的数据中,仅出现一行代表;

-t :分隔符,预设是 tab 键;

-k :以那个区间 (field) 来进行排序的意思,


wc


wc [-lwm]

参数:

-l :仅列出行;

-w :仅列出多少字(英文单字);

-m :多少字符;


学习shell scripts


在 shell script 的撰写同样需要用到这些注意事项的:

1. 如同前面 bash command 提到的,指令与参数间的多个空白会被忽略掉;

2. 而空白行也将被忽略掉!,并且 [tab] 也是不会被理会的!

3. 如果读取到一个 Enter 符号 ( CR )),就尝试开始执行该行命令;

4. 至于如果一行的内容太多,则可以使用 \[Enter] 来延伸至下一行;

5. 此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略!


运行可以有底下几个方法:


• 将 shell.sh 加上可读与执行 (rx) 的权限,然后就能够以 ./shell.sh 来执行了;

• 直接以 sh shell.sh 的方式来直接执行即可。



[root@linux scripts]# vi sh01.sh

#!/bin/bash

# Program:

# This program is used to show "Hello World !" in screen.

# History:

# 2005/08/23 VBird First release

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo -e "Hello World ! \a \n"

exit 0


test判断


1. 关于某个档名的『类型』侦测(存在与否),如 test -e filename

-e   该『档名』是否存在?(常用)

-f   该『档名』是否为档案(file)?(常用)

-d   该『文件名』是否为目录(directory)?(常用)

-b   该『文件名』是否为一个 block device 装置?

-c   该『文件名』是否为一个 character device 装置?

-S   该『档名』是否为一个 Socket 档案?

-p   该『档名』是否为一个 FIFO (pipe) 档案?

-L   该『档名』是否为一个连结档?

2. 关于档案的权限侦测,如 test -r filename

-r   侦测该文件名是否具有『可读』的属性?

-w   侦测该档名是否具有『可写』的属性?

-x   侦测该档名是否具有『可执行』的属性?

-u   侦测该文件名是否具有『SUID』的属性?

-g   侦测该文件名是否具有『SGID』的属性?

-k   侦测该文件名是否具有『Sticky bit』的属性?

-s   侦测该档名是否为『非空白档案』?

3. 两个档案之间的比较,如: test file1 -nt file2

-nt   (newer than)判断 file1 是否比 file2 新

-ot   (older than)判断 file1 是否比 file2 旧

-ef   判断 file2 与 file2 是否为同一档案,可用在判断 hard link 的判定上。 主要意义在判定,两个档案是否均指向同一个 inode 哩!

4.关于两个整数之间的判定,例如 test n1 -eq n2

-eq   两数值相等 (equal)

-ne   两数值不等 (not equal)

-gt   n1 大于 n2 (greater than)

-lt   n1 小于 n2 (less than)

-ge   n1 大于等于 n2 (greater than or equal)

-le   n1 小于等于 n2 (less than or equal)

5. 判定字符串的数据

test -z string   判定字符串是否为 0 ?若 string 为空字符串,则为 true

test -n string   判定字符串是否非为 0 ?若 string 为空字符串,则为 false。注: -n 亦可省略

test str1 = str2   判定 str1 是否等于 str2 ,若相等,则回传 true

test str1 != str2   判定 str1 是否不等于 str2 ,若相等,则回传 false

6. 多重条件判定,例如: test -r filename -a -x filename

-a   (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。

-o   (or)两状况任何一个成立!例如 test -r file -o -x file,则 file具有 r 或 x 权限时,就可回传 true。

!   反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true


利用判断符号 [ ]


[ "$HOME" == "$MAIL" ]

[□"$HOME"□==□"$MAIL"□]

 ↑       ↑  ↑       ↑

注意:

• 在中括号 [] 内的每个组件都需要有空格键来分隔;

• 在中括号内的变量,最好都以双引号来设定;

• 在中括号内的常数,最好都以单或双引号来设定。


变量


/path/to/scriptname opt1 opt2 opt3 opt4 ...

$0                  $1   $2   $3   $4 ...

$0为shell名称。

$1为第一个变量,$2为第二个变量。。。


利用 if .... then



if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

fi

• && 代表 AND ;

• || 代表 or ;


if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

else

当条件判断式不成立时,可以进行的指令工作内容;

fi


if [ 条件判断式一 ]; then

当条件判断式一成立时,可以进行的指令工作内容;

elif [ 条件判断式二 ]; then

当条件判断式二成立时,可以进行的指令工作内容;

else

当条件判断式一与二均不成立时,可以进行的指令工作内容;

fi


利用 case ..... esac 判断


case $变量名称 in

    "第一个变量内容")

        程序段

        ;;

    "第二个变量内容")

        程序段

        ;;

    *)

        不包含第一个变量内容与第二个变量内容的其它程序执行段

        exit 1

        ;;

esac

例如:

case $1 in

    "hello")

        echo "Hello, how are you ?"

        ;;

    "")

        echo "You MUST input parameters, ex> $0 someword"

        ;;

    *)

        echo "Usage $0 {hello}"

        ;;

esac


利用 function 功能


function fname() {

程序段

}

要注意的是,在shell script 当中, function 的设定一定要在程序的最前面

执行:fname;

函数参数:fname 1 2 -----在function里面获取$1 $2 $3。。。


循环 (loop)


『当 condition 条件成立时,就进行循环,直到 condition 的条件不成立才停止』

while [ condition ]

do

程序段落

done

『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。』

until [ condition ]

do

程序段落

done


计算1+。。。+100

s=0

i=0

while [ "$i" != "100" ]

do

i=$(($i+1))

s=$(($s+$i))

done

echo "The result of '1+2+3+...+100' is ==> $s"


for...do....done

for (( 初始值; 限制值; 执行步阶 ))

do

程序段

done


for var in con1 con2 con3 ...

do

程序段

done


可以循环文件:

filelist=`ls $dir`

for filename in $filelist


shell script 的追踪与 debug


sh [-nvx] scripts.sh

参数:

-n :不要执行 script,仅查询语法的问题;

-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;

-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!


linux账号与身份管理


/etc/passwd  存的是账号信息

root:x:0:0:root:/root:/bin/bash

账号名称:密码:UID:GID:使用者信息说明栏:家目录:Shell

/etc/shadow  存的是账号密码

root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7:::

账号名称:密码:最近更动密码的日期:密码不可被更动的天数:密码需要重新变更的天数:密码需要变更期限前的警告期限:密码过期的恕限时间:账号失效日期:保留

/etc/group  存的是群组信息

root:x:0:root

群组名称:群组密码:GID:支持的账号名称(可多个,用逗号隔开)

/etc/gshadow  存的是群组密码

root:::root

群组名称:密码:群组管理员的账号:该群组的所属账号(与 /etc/group 内容相同)


有效群组(effective group)与初始群组(initial group)


在某个群组加入用户:

在 /etc/group 这个档案中,找到 users 那一行,并且将 dmtsai 这个账号加入第四栏, 这样 dmtsai 才能够支持 users 这个群组啊。

groups  查看当前用户的所在群组(显示的第一个为有效群组)。


如果一个用户有两个群组,切换群组:newgrp users   就可以切换users为有效群组了。

注意:这个切换群组是以一个新的shell切换的。。。可以直接用exit退出。


新增用户:useradd



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 新增使用者时,这个使用者的 /etc/shadow密码栏会是不可登入的 (以 !! 为开头),因此还需要使用 passwd来给予 vbird1 密码后,才算新增完毕!

默认数据是在/etc/default/useradd里面:

GROUP=100 <==预设的群组

HOME=/home <==预设的家目录所在目录

INACTIVE=-1 <==在 /etc/shadow 内的第 7 栏

EXPIRE= <==在 /etc/shadow 内的第 8 栏

SHELL=/bin/bash <==预设的 shell

SKEL=/etc/skel <==使用者家目录的内容数据参考目录

注意:

与密码还有 UID/GID 有关的设定档则是在 /etc/login.defs 里面

MAIL_DIR /var/spool/mail <==使用者预设邮件信箱放置目录

PASS_MAX_DAYS 99999 <==/etc/shadow 内的第 5 栏

PASS_MIN_DAYS 0 <==/etc/shadow 内的第 4 栏

PASS_MIN_LEN 5 <==密码最短的字符长度,建议可以改到 6 以上

PASS_WARN_AGE 7 <==/etc/shadow 内的第 6 栏

UID_MIN 500 <==使用者最小的 UID,意即小于 500 的 UID 为系统保留

UID_MAX 60000 <==使用者能够用的最大 UID

GID_MIN 500 <==使用者自订群组的最小 GID,小于 500 为系统保留

GID_MAX 60000 <==使用者自订群组的最大 GID

CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动建立使用者家目录?


修改密码


passwd [useraccount]


usermod


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 [-r] username

参数:

-r :连同使用者的家目录也一起删除


使用者功能:chfn, chsh修改用户信息


chsh [-ls]   修改用户的bash

参数:

-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!

-s :设定修改自己的 Shell 啰

chsh -l

chsh -s /bin/csh


chfn [-foph]    修改个人信息

参数:

-f :后面接完整的大名;

-o :您办公室的房间号码;

-p :办公室的电话号码;

-h :家里的电话号码!


finger [-s] username    查询用户信息


finger [-s] username    查询用户信息

参数:

-s :使用长串数据输出格式。


查询用户的各种id


id [username]

查询用户的各种id:

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),10(wheel)


groupadd 添加组


groupadd [-g gid] [-r]

参数:

-g :后面接某个特定的 GID ,用来直接给予某个 GID ~

-r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。


groupmod修改群组


groupmod [-g gid] [-n group_name]

参数:

-g :修改既有的 GID 数字;

-n :修改既有的群组名称


groupdel 删除群组


groupdel [groupname]

注意:要删除的群组下面有用户的话,不能删除


gpasswd 修改群组密码


参数:

:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)

-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)

-M :将某些账号加入这个群组当中!

-r :将 groupname 的密码移除

-R :让 groupname 的密码栏失效,所以 newgrp 就不能使用了!



关于群组管理员(Group administrator)做的动作:

[someone@linux ~]$ gpasswd [-ad] user groupname

参数:

-a :将某位使用者加入到 groupname 这个群组当中!

-d :将某位使用者移除出 groupname 这个群组当中。


su


su [-lcm] [username]

参数:

- :如果执行 su - 时,表示该使用者想要变换身份成为 root ,且使用 root 的

环境设定参数档,如 /root/.bash_profile 等等。

-l :后面可以接使用者,例如 su -l dmtsai ,这个 -l 好处是,可使用欲变换身份者

他的所有相关环境设定档。

-m :-m 与 -p 是一样的,表示『使用目前的环境设定,而不重新读取新使用者的设定档。』

-c :仅进行一次指令,所以 -c 后面可以加上指令喔!


sudo 是怎样工作的


• 当使用者执行 sudo 时,系统会主动的去寻找 /etc/sudoers 档案,判断该使用者是否有执行sudo 的权限;

• 若使用者具有可执行 sudo 的权限后,便让使用者『输入使用者自己的密码』来确认;

• 若密码输入成功,便开始进行 sudo 后续接的指令;

• 不过, root 执行 sudo 时,不需要输入密码;

• 若欲切换的身份与执行者身份相同,那也不需要输入密码。



sudo [-u [username|#uid]] command

参数:

-u :后面可以接使用者账号名称,或者是 UID。例如 UID 是 500 的身份,可以:

-u #500 来作为切换到 UID 为 500 的那位使用者。

范例一:一般身份使用者使用 sudo 在 /root 底下建立目录:

[dmtsai@linux ~]$ sudo mkdir /root/testing

We trust you have received the usual lecture from the local System

Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.

#2) Think before you type.

#3) With great power comes great responsibility.

Password: <==这里输入 dmtsai 自己的密码

dmtsai is not in the sudoers file. This incident will be reported.

# 瞧!因为 dmtsai 不在 /etc/sudoers ,所以他就无法执行 sudo 喔!

范例二:假设 dmtsai 已经具有 sudo 的执行权限,如何在 /root 底下建立目录?

[dmtsai@linux ~]$ sudo mkdir /root/testing

Password: <==这里输入 dmtsai 自己的密码

范例三:如何将 sudo 与 su 搭配使用?

[dmtsai@linux ~]$ sudo su -

范例四:dmtsai 想要切换身份成为 vbird 来进行 touch 时?

[dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test


如果想修改sudu   要使用  visudo


『 dmtsai ALL=(ALL) ALL 』代表的意义是:

使用者账号 登入的主机 = (可以变换的身份) 可以下达的指令


查询使用者: w, who, last, lastlog


要知道每个账号的最近登入的时间,则可以使用 lastlog 这个指令喔! lastlog 会去读取 /var/log/lastlog 档案


使用者对谈: talk, mesg, wall


w  查询在线用户。

write dmtsai  发送信息给dmtsai

mesg n   不接收消息   mesg y  接受消息


使用者邮件信箱: mail


mail username@localhost -s "邮件标题"

[vbird@linux ~]$ mail dmtsai -s "nice to meet you"

Hello, D.M. Tsai

Nice to meet you in the network.

You are so nice. byebye!

. <==这里很重要喔,结束时,最后一行输入小数点 . 即可!

Cc: <==这里是所谓的『副本』,不需要寄给其它人,所以直接 [Enter]

[vbird@linux ~]$ <==出现提示字符,表示输入完毕了!



查看信件:mail

h 将信件的标题列出来。如果想要查阅 40 封信件左右处的所有信件标头,可以输入『 h 40 』

d

删除啦~假设我要删除第 10 封信,可以『 d10 』,假如我想要删除 20-40 封信,可以

『 d20-40 』,不过,这个动作要生效的话,必须要配合 q 这个指令才行(参考底下说明)!

s

将信件储存成为档案。举例来说,我要将第 5 封信件的内容存成 ~/mail.file 的话,可以:

『 s 5 ~/mail.file 』喔!

x

或者输入 exit 都可以。这个是『不作任何动作离开 mail 程序』的意思。不论你刚刚删除

了什么信件,或者读过什么,使用 exit 都会直接离开 mail,所以刚刚进行的删除与阅读

工作都会无效。如果您只是查阅一下邮件而已的话,一般来说,建议使用这个离开啦!除非

你真的要删除某些信件。

q

相对于 exit 是不动作离开, q 则会进行两项动作: 1. 将刚刚删除的信件移出 mailbox

之外; 2. 将刚刚有阅读过的信件存入 ~/mbox ,且移出 mailbox 之外。鸟哥通常不很喜

欢使用 q 离开,因为,很容易忘记读过什么咚咚~导致信件给他移出 mailbox 说~


一些检查工具


pwck

pwck 这个指令在检查 /etc/passwd 这个账号设定文件内的信息,与实际的家目录是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外, 如果 /etc/passwd 内的数据域位错误时,会提示使用者修订。

pwconv

检查密码。

chpasswd

举例来说,我的系统当中有个使用者账号为 dmtsai ,我想要更新他的密码 (update) , 假如他的密码是 abcdefg 的话,那么我可以这样做:[root@linux ~]# echo "dmtsai:abcdefg" | chpasswd


删除账号


1. 先以 find / -user account 找出所有的账号档案,并将他删除;

2. 将 /etc/passwd 与 /etc/shadow 的相关资料删除;

3. 将 /etc/group 及 /etc/gshadow 相关资料删除;

4. 将 /home 底下关于该账号的目录删除;

5. 到 /var/spool/mail 以及 /var/spool/cron 里面将相关的使用者档案删除。


linux磁盘配额

略,很复杂

linux磁盘与档案系统管理

略,很复杂

例行性命令的建立


Linux 工作排程的种类: at, cron

• 一种是例行性的,就是每隔一定的周期要来办的事项;

• 一种是突发性的,就是这次做完以后就没有的那一种(计算机大降价....)

• at : 这个工作仅执行一次就从 Linux 系统中的排程中取消;

• cron : 这个工作将持续例行性的作下去!


仅进行一次的工作排程: at


或许要打开一下:/etc/init.d/atd restart

设置开机启动:chkconfig --level 35 atd on

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

就是说,在某个时间点『再加几个时间后』才进行。


使用者的设定: crontab(定时任务)


crontab [-u username] [-l|-e|-r]

参数:

-u :只有 root 才能进行这个任务,亦即帮其它使用者建立/移除 crontab;

-e :编辑 crontab 的工作内容

-l :查阅 crontab 的工作内容

-r :移除 crontab 的工作内容


程序与资源管理

程序后台运行  & 下面生成的数字为pid。

将『目前』的工作丢到背景中『暂停』:[ctrl]-z

vi过程中可以把编辑器放在背景后。

观察目前的背景工作状态: jobs


jobs [-lrs]

参数:

-l :除了列出 job number 之外,同时列出 PID

-r :仅列出正在背景 run 的工作;

-s :仅列出正在背景当中暂停 (stop) 的工作。

仔细看到那个 + - 号喔!那个 + 代表预设的取用工作。 所以说:『目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [1] 会被拿到前景当中来处理』!


将背景工作拿到前景来处理:fg


fg %jobnumber

参数:

%jobnumber :工作的号码。注意,那个 % 是可有可无的!


让工作在背景下进行: bg


范例一:一执行 find / -perm +7000 后,立刻丢到背景去暂停!

[root@linux ~]# find / -perm +7000

# 此时,请立刻按下 [ctrl]-z 暂停!

[1]+ Stopped find / -perm +7000

[root@linux ~]#

范例二:让该工作在背景下进行,并且观察他!!

[root@linux ~]# jobs ; bg %1 ; jobs

[1]+ Stopped find / -perm +7000

[1]+ find / -perm +7000 &

[1]+ Running find / -perm +7000 &


管理背景当中的工作: kill


kill 后面直接加数字与加上 % 的情况是不同的!

kill -signal %jobnumber

kill -l

参数:

-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?

signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:

-1 :重新读取一次参数的设定档 (类似 reload);

-2 :代表与由键盘输入 [ctrl]-c 同样的动作;

-9 :立刻强制删除一个工作;

-15:以正常的程序方式终止一项工作。与 -9 是不一样的。



killall [-iIe] [command name]

参数:

-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给使用者;

-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令

不能超过 15 个字符。

-I :指令名称(可能含参数)忽略大小写。



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 喔!


ps -l  中的PRI就是程序的执行顺序。 

top


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


pstree [-Aup]

参数:

-A :各程序树之间的连接以 ASCII 字符来连接;

-p :并同时列出每个 process 的 PID;

-u :并同时列出每个 process 的所属账号名称。


free


free [-b|-k|-m|-g] [-t]

参数:

-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)

k(Kbytes), 及 g(Gbytes) 来显示单位喔!

-t :在输出的最终结果,显示物理内存与 swap 的总量。


uname


uname [-asrmpi]

参数:

-a :所有系统相关的信息;

-s :系统核心名称

-r :核心的版本

-m :本系统的硬件名称

-p :CPU 的类型

-i :硬件的平台 (ix86)


uptime   开机多久了。

netstat


netstat -[atunlp]

参数:

-a :将目前系统上所有的联机、监听、Socket 数据都列出来

-t :列出 tcp 网络封包的数据

-u :列出 udp 网络封包的数据

-n :不已程序的服务名称,以埠号 (port number) 来显示;

-l :列出目前正在网络监听 (listen) 的服务;

-p :列出该网络服务的程序 PID


netstat -tulnp    找出目前系统上已在监听的网络联机及其 PID

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1598/vsftpd

kill 1598   killall vsftpd  :将上述的本地端 0.0.0.0:21 那个网络服务关闭的话?


sar


sar [-ru] [秒数] [次数]

参数:

-u :进行 CPU 资源的统计;

-r :进行主存储器目前状态的分析


nice


nice [-n] command

参数:

-n :后面接一个数值,数值的范围 -20 ~ 19。

renice [number] PID    修改nice

参数:

PID :某个程序的 ID 啊!


fuser


如果当我们要卸载某个装置时,他老是告诉我们『 device is busy 』, 那么到底是那个程序在使用这个装置呢?

fuser [-ki] [-signal] file/dir

参数:

-k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;

-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!

-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 啰!


lsof


相对于 fuser 是由档案或者装置去找出使用该档案或装置的程序,反过来说, 如何查出某个程序开启或者使用的档案与装置呢?

lsof [-Uu] [+d]

参数:

-a :多项数据需要『同时成立』才显示出结果时!

-U :仅列出 Unix like 系统的 socket 档案类型;

-u :后面接 username,列出该使用者相关程序所开启的档案;

+d :后面接目录,亦即找出某个目录底下已经被开启的档案!


开机关机流程与loader