目录
登录讯息显示数据: /etc/issue, /etc/motd
有效群组(effective group)与初始群组(initial group)
日期
显示日期: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
寻找指令
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
略