linux-鸟哥私房菜,基础命令全掌握

目录

日期

关机重启

实例

用户及权限

改变权限命令

档案属性与目录

查看环境变量

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 [-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命令大全_秃了也弱了。的博客-CSDN博客

寻找指令

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

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃了也弱了。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值