常用shell命令

echo

-e参数会解释引号(双引号和单引号)里面的不可打印字符:

\a:响铃
\b:退格
\n:换行
\r:回车
\t:制表符

$ echo "Hello\nWorld"
Hello\nWorld
$ echo -e "Hello\nWorld"
Hello
World

一般的转义不需要-e参数:

$ echo "$date"

$ echo "\$date"
$date

-n参数用于取消回车符(注意第二行$符位置):

$ echo -n hello world
hello world$

{}扩展

$ echo d{a,e,i,u,o}g
dag deg dig dug dog

$ echo {a..c}
a b c

$ echo {0..8..2}
0 2 4 6 8

单引号和双引号区别:

美元符号$、反引号`和反斜杠\。这三个字符在双引号之中,依然有特殊含义,会被 Bash 自动扩展

$ echo "$SHELL"   #$表示变量
/bin/bash

$ echo "`date`"     #``表示执行命令
Mon Jan 27 13:33:18 CST 2020

$ echo "I'd say: \"hello!\""     #\表示转义
I'd say: "hello!"

#单引号中无效
$ echo '$USER'
$USER

$ echo '\\'
\\

通配符在引号中无效:

$ echo '*'
*

env

显示所有环境变量:

$ env
# 或者
$ printenv

set

显示所有变量(包括环境变量和自定义变量),以及所有的 Bash 函数:

$ set

变量相关

如果变量的值本身也是变量,可以使用${!varname}的语法,读取最终的值:

$ myvar=USER
$ echo ${myvar}
USER
$ echo ${!myvar}
ruanyf

export

向子shell输出变量:

# 输出变量 $foo
$ export foo=bar

# 新建子 Shell
$ bash

# 读取 $foo
$ echo $foo
bar

# 修改继承的变量
$ foo=baz

# 退出子 Shell
$ exit

# 读取 $foo,子shell不影响父shell
$ echo $foo
bar

history

查看bash命令的历史:

$ history

其本质是输出$HISTFILE指向的文件的全部内容:

$ echo $HISTFILE
/home/me/.bash_history

在history命令中显示时间戳:

$ export HISTTIMEFORMAT='%F %T  '
$ history
1  2013-06-09 10:40:12   cat /etc/issue
2  2013-06-09 10:40:12   clear

如果不希望保存本次操作的历史,可以设置HISTSIZE等于0:

export HISTSIZE=0

如果HISTSIZE=0写入用户主目录的~/.bashrc文件,那么就不会保留该用户的操作历史。如果写入/etc/profile,整个系统都不会保留操作历史。

history命令的-c参数可以清除操作历史:

$ history -c

cd

返回前一次目录用-

# 当前目录是 /path/to/foo
$ cd bar

# 重新回到 /path/to/foo
$ cd -

脚本中的特殊变量

$0:脚本文件名,即script.sh。
$1~$9:对应脚本的第一个参数到第九个参数。
$#:参数的总数。
$@:全部的参数,参数之间使用空格分隔。
$*:全部的参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。

getopts

getopts命令用在脚本内部,用于取出脚本所有的带有前置连词线-的参数(配置项参数):

getopts optstring name

第一个参数optstring是字符串,给出脚本所有的连词线参数。比如,某个脚本可以有三个配置项参数-l-h-a,其中只有-a可以带有参数值,而-l-h是开关参数,那么getopts的第一个参数写成lha:,顺序不重要。注意,a后面有一个冒号,表示该参数带有参数值。getopts的第二个参数name是一个变量名,用来保存当前取到的配置项参数,即lha
比如使用getopts命令配合while循环处理参数:

while getopts 'lha:' OPTION; do
  case "$OPTION" in
    l)
      echo "linuxconfig"
      ;;

    h)
      echo "h stands for h"
      ;;

    a)
      avalue="$OPTARG"   #如果某个连词线参数带有参数值,比如-a foo,那么处理a参数的时候,环境变量$OPTARG保存的就是参数值。
      echo "The value provided is $OPTARG"
      ;;
    ?)        #如果用户输入了没有指定的参数(比如-x),那么OPTION等于?。
      echo "script usage: $(basename $0) [-l] [-h] [-a somevalue]" >&2
      exit 1
      ;;
  esac
done
shift "$(($OPTIND - 1))"   #变量$OPTIND在getopts开始执行前是1,然后每次执行就会加1。

basename命令用于去掉文件名的目录和后缀。
变量$OPTIND在getopts开始执行前是1,然后每次执行就会加1。等到退出while循环,就意味着连词线参数全部处理完毕。这时,$OPTIND - 1就是已经处理的连词线参数个数,使用shift命令将这些参数移除,保证后面的代码可以用$1$2等处理命令的主参数。

source

正常的执行脚本文件,是类似于bash *.sh,其实是调用子shell。而source命令不会调用子shell,所以常用于加载配置文件:

#!/bin/bash

source ./lib.sh

function_from_lib

source有一个简写形式,可以使用一个点.来表示:

$ . .bashrc

test语句

test语句的三种写法:

# 写法一
test expression

# 写法二
[ expression ]

# 写法三     
[[ expression ]]   #只有该形式支持正则判断

文件状态判断语句(以第二种写法为例):

[ -a file ]:如果 file 存在,则为true
[ -d file ]:如果 file 存在并且是一个目录,则为true
[ -e file ]:如果 file 存在,则为true
[ -f file ]:如果 file 存在并且是一个普通文件,则为true

字符串判断语句:

[ string ]:如果string不为空(长度大于0),则判断为真。
[ -n string ]:如果字符串string的长度大于零,则判断为真。
[ -z string ]:如果字符串string的长度为零,则判断为真。
[ string1 = string2 ]:如果string1和string2相同,则判断为真。
[ string1 == string2 ] 等同于[ string1 = string2 ]。
[ string1 != string2 ]:如果string1和string2不相同,则判断为真。
[ string1 '>' string2 ]:如果按照字典顺序string1排列在string2之后,则判断为真。
[ string1 '<' string2 ]:如果按照字典顺序string1排列在string2之前,则判断为真。

整数关系判断语句:

[ integer1 -eq integer2 ]:如果integer1等于integer2,则为true。
[ integer1 -ne integer2 ]:如果integer1不等于integer2,则为true。
[ integer1 -le integer2 ]:如果integer1小于或等于integer2,则为true。
[ integer1 -lt integer2 ]:如果integer1小于integer2,则为true。
[ integer1 -ge integer2 ]:如果integer1大于或等于integer2,则为true。
[ integer1 -gt integer2 ]:如果integer1大于integer2,则为true。

正则判断语句:

[[ string1 =~ regex ]]

逻辑判断语句(也需要使用[[...]]):

AND运算:符号&&,也可使用参数-a。
OR运算:符号||,也可使用参数-o。
NOT运算:符号!。

算术判断语句((...))

if ((3 > 2)); then
  echo "true"
fi

w

查看登录用户正在使用的进程信息,可以看到root用户有三个终端进程:

$ w
 17:25:21 up 15 min,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    ****.****.****.****   17:09    0.00s  0.02s  0.00s w
root     pts/1    ****.****.****.****   17:24   11.00s  0.00s  0.00s -bash
root     pts/2    ****.****.****.****   17:24   17.00s  0.01s  0.01s -bash

chgrp

改变文件所属群组:

[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
     都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r--r--  1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log      (在/etc/group中不存在testing群组)
chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~

chown

改变文件拥有者:

[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log   #需要保证在/etc/passwd文件中存在bin用户
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

last

我们的Linux在使用者登入时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码。

mv

移动文件(剪切)&&文件更名:

$ mv b.txt test   #把当前目录下b.txt文件移动到当前目录下的test目录中
$ cd test
$ ls
b.txt
$ mv b.txt a.txt   #将当前目录下的b.txt改名为a.txt
$ ls
a.txt

cp

文件复制:

范例一:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖
# 重复作两次动作,由於 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
# 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢!

范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp   #通常,目的文件的拥有者就是操作者
# 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:

[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!

basename&&dirname

[root@www ~]# basename /etc/sysconfig/network
network         <== 很简单!就取得最后的档名~
[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig  <== 取得的变成目录名了!

查看文件的命令

cat  由第一行开始显示文件内容
tac  从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl   显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od   以二进位的方式读取文件内容!

umask

目前使用者在创建文件或目录时候的权限默认值:

[root@www ~]# umask
0022             <==与一般权限有关的是后面三个数字!
[root@www ~]# umask -S
u=rwx,g=rx,o=rx

该用户一般情况下创建的文件权限为666-022=644
该用户一般情况下创建的目录权限为777-022=755:

[root@www ~]# touch test1
[root@www ~]# mkdir test2
[root@www ~]# ll 
-rw-r--r-- 1 root root     0 Sep 27 00:25 test1
drwxr-xr-x 2 root root  4096 Sep 27 00:25 test2

特殊权限:

Setuid权限(仅对文件生效):

[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

Setgid权限(对文件和目录均生效):

[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate

对于文件而言:

SGID 对二进位程序有用;
程序运行者对於该程序来说,需具备 x 的权限;
运行者在运行的过程中将会获得该程序群组的支持!

对于目录而言:

使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

Sticky bit权限(仅对目录生效):

$ ls -ld /tmp
drwxrwxrwt. 5 root root 4096 Nov  9 11:09 /tmp
当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

SUID/SGID/SBIT 权限配置:
在3位权限描述符之前添加:

4 为 SUID
2 为 SGID
1 为 SBIT

file

判断文件格式:

[root@www ~]# file ~/.bashrc
/root/.bashrc: ASCII text  <==告诉我们是 ASCII 的纯文字档啊!

which

搜索命令:

[root@www ~]# which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称

范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名
[root@www ~]# which ifconfig
/sbin/ifconfig            <==用 root 可以找到正确的运行档名喔!

find

查找文件命令:

-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与帐号名称对应的数字。
-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在/etc/group。
-user name :name 为使用者帐号名称。
-group name:name 为群组名称。
-name filename:搜寻文件名称为 filename 的文件;
   -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.... 的属性存在!

比如查找具有setuid位的root文件:

$ find / -user root -perm -4000 2>/dev/null

mount

将文件系统挂载到某个目录上:

范例一:用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6

也可以把一个目录挂载到另一个目录上:

范例七:将 /home 这个目录暂时挂载到 /mnt/home 底下(需要--bind):
[root@www ~]# mkdir /mnt/home
[root@www ~]# mount --bind /home /mnt/home
[root@www ~]# ls -lid /home/ /mnt/home
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home/
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /mnt/home

[root@www ~]# mount -l
/home on /mnt/home type none (rw,bind)      #单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称

gzip

压缩与解压缩(-d):

范例一:将 /etc/man.config 复制到 /tmp ,并且以 gzip 压缩
[root@www ~]# cd /tmp 
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config      (-v可以显示出原文件/压缩文件的压缩比等资讯;)
man.config:      56.1% -- replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz  <==gzip压缩比较佳

zcat

读取gzip压缩文件的内容:

范例二:由於 man.config 是文字档,请将范例一的压缩档的内容读出来!
[root@www tmp]# zcat man.config.gz
# 由於 man.config 这个原本的文件是是文字档,因此我们可以尝试使用 zcat  去读取!
# 此时萤幕上会显示 man.config.gz 解压缩之后的文件内容!

范例三:将范例一的文件解压缩
[root@www tmp]# gzip -d man.config.gz
# 不要使用 gunzip 这个命令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。

bzip2

压缩比比gzip好,格式差不多:

范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@www tmp]# bzip2 -z man.config       #与gzip不同,压缩需要使用-z参数
# 此时 man.config 会变成 man.config.bz2 !

范例二:将范例一的文件内容读出来!
[root@www tmp]# bzcat man.config.bz2
# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!

范例三:将范例一的文件解压缩
[root@www tmp]# bzip2 -d man.config.bz2

tar

文件打包命令(配合-j-z参数可以进行压缩/解压缩):

[root@www ~]# tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩
[root@www ~]# tar [-j|-z] [tv] [-f 创建的档名]             <==察看档名
[root@www ~]# tar [-j|-z] [xv] [-f 创建的档名] [-C 目录]   <==解压缩
选项与参数:
-c  :创建打包文件,可搭配 -v 来察看过程中被打包的档名(filename)
-t  :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了;
-x  :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
      特别留意的是, -c, -t, -x 不可同时出现在一串命令列中。
-j  :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-z  :透过 gzip  的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-v  :在压缩/解压缩的过程中,将正在处理的档名显示出来!
-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项罗!
-C 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

其他后续练习会使用到的选项介绍:
-p  :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档
-P  :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包! 

比如,打包并压缩/etc:

[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names  <==注意这个警告信息,去除根目录/,防止解压缩后为绝对路径,覆盖了/etc/下的文件
/etc/
....中间省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 这个选项,因此正在作用中的档名就会显示在萤幕上。
# 如果你可以翻到第一页,会发现出现上面的错误信息!底下会讲解。
# 至於 -p 的选项,重点在於『保留原本文件的权限与属性』之意。

[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 显示的信息会跟上面一模一样罗!

常用命令如下:

压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

vi常用快捷键

h 或 向左箭头键(←)    光标向左移动一个字符
j 或 向下箭头键(↓)    光标向下移动一个字符
k 或 向上箭头键(↑)    光标向上移动一个字符
l 或 向右箭头键(→)    光标向右移动一个字符
[Ctrl] + [f]    屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b]    屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
0 或功能键[Home]    这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
<space>   向后移动一个字符
<enter>   向下移动一行
G   移动到这个档案的最后一行(常用)
nG  n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
x, X    在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
dd  删除游标所在的那一整列(常用)
ndd n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)
yy  复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用)
p, P    p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
u   复原前一个动作。(常用)
[Ctrl]+r    重做上一个动作。(常用)

~/.bash_history

~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中。

finger

用来查看用户信息:

[root@www ~]# finger [-s] username
选项与参数:
-s  :仅列出用户的账号、全名、终端机代号与登陆时间等等;
-m  :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)

范例一:观察 vbird1 的用户相关账号属性
[root@www ~]# finger vbird1
Login: vbird1                           Name: (null)
Directory: /home/vbird1                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

范例三:找出目前在系统上面登陆的用户与登陆时间
[vbird1@www ~]$ finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone
root      root       tty1           Feb 26 09:53
vbird1               tty2           Feb 26 15:21

id

用于查询用户的uid或者gid等信息:

[root@www ~]# id [username]

范例一:查阅 root 自己的相关 ID 信息!
[root@www ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),
10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh
# 上面信息其实是同一行的数据!包括会显示 UID/GID 以及支持的所有群组!
# 至于后面那个 context=... 则是 SELinux 的内容,先不要理会他!

范例二:查阅一下 vbird1 吧~
[root@www ~]# id vbird1
uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) context=root:system_r:
unconfined_t:SystemLow-SystemHigh

[root@www ~]# id vbird100
id: vbird100: No such user  <== id 这个命令也可以用来判断系统上面有无某账号!

ACL

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限配置。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

setfacl

[root@www ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m :配置后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除所有的 ACL 配置参数;
-k :移除默认的 ACL 参数,关于所谓的『默认』参数于后续范例中介绍;
-R :递归配置 acl ,亦即包括次目录都会被配置起来;
-d :配置『默认 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值

针对vbird1用户配置acl:

# 1. 针对特定使用者的方式:
# 配置规范:『 u:[使用者账号列表]:[rwx] 』,例如针对 vbird1 的权限规范 rx :
[root@www ~]# touch acl_test1
[root@www ~]# ll acl_test1
-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
[root@www ~]# setfacl -m u:vbird1:rx acl_test1
[root@www ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 权限部分多了个 + ,且与原本的权限 (644) 看起来差异很大!但要如何查阅呢?

[root@www ~]# setfacl -m u::rwx acl_test1
[root@www ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 无使用者列表,代表配置该文件拥有者,所以上面显示 root 的权限成为 rwx 了!

getfacl

查看设置的ACL:

[root@www ~]# getfacl filename
选项与参数:
getfacl 的选项几乎与 setfacl 相同!所以鸟哥这里就免去了选项的说明啊!

# 请列出刚刚我们配置的 acl_test1 的权限内容:
[root@www ~]# getfacl acl_test1
# file: acl_test1   <==说明档名而已!
# owner: root       <==说明此文件的拥有者,亦即 ll 看到的第三使用者字段
# group: root       <==此文件的所属群组,亦即 ll 看到的第四群组字段
user::rwx           <==使用者列表栏是空的,代表文件拥有者的权限
user:vbird1:r-x     <==针对 vbird1 的权限配置为 rx ,与拥有者并不同!
group::r--          <==针对文件群组的权限配置仅有 r 
mask::r-x           <==此文件默认的有效权限 (mask)
other::r--          <==其他人拥有的权限啰!

mask权限代表使用者或群组所配置的权限必须要存在于 mask 的权限配置范围内才会生效。可以设置mask权限:setfacl -m m:r acl_test1

w&&who

查看目前已登陆用户信息:

[root@www ~]# w
 13:13:56 up 13:00,  1 user,  load average: 0.08, 0.02, 0.01
USER   TTY    FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
root   pts/1  192.168.1.100   11:04    0.00s  0.36s  0.00s -bash
vbird1 pts/2  192.168.1.100   13:15    0.00s  0.06s  0.02s w
# 第一行显示目前的时间、启动 (up) 多久,几个用户在系统上平均负载等;
# 第二行只是各个项目的说明,
# 第三行以后,每行代表一个使用者。如上所示,root 登陆并取得终端机名 pts/1 之意。

[root@www ~]# who
root     pts/1        2009-03-04 11:04 (192.168.1.100)
vbird1   pts/2        2009-03-04 13:15 (192.168.1.100)

lastlog

查看所有账号最后一次登录信息(通过/var/log/lastlog文件):

[root@www ~]# lastlog
Username    Port   From           Latest
root        pts/1  192.168.1.100  Wed Mar  4 11:04:22 +0800 2009
bin                                        **Never logged in**
....(中间省略)....
vbird1      pts/2  192.168.1.100  Wed Mar  4 13:15:56 +0800 2009
....(以下省略)....

&

将命令丢到后台:

[root@www ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 8429
[root@www ~]# 

ctrl-z

将『目前』的工作丢到后台中『暂停』:

[root@www ~]# vi ~/.bashrc
# 在 vi 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+  Stopped                 vim ~/.bashrc
[root@www ~]#   <==顺利取得了前景的操控权!
[root@www ~]# find / -print
....(输出省略)....
# 此时萤幕会非常的忙碌!因为萤幕上会显示所有的档名。请按下 [ctrl]-z 暂停
[2]+  Stopped                 find / -print

jobs

查看目前后台工作情况:

范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@www ~]# jobs -l
[1]- 10314 Stopped                 vim ~/.bashrc
[2]+ 10833 Stopped                 find / -print

其中 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了!

fg

将后台工作拿到前台来:

[root@www ~]# jobs
[1]- 10314 Stopped                 vim ~/.bashrc
[2]+ 10833 Stopped                 find / -print
[root@www ~]# fg      <==默认取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
[root@www ~]# fg %1   <==直接规定取出的那个工作号码!再按下[ctrl]-z

bg

让工作在后台下的状态变成运行中:

范例二:让该工作在背景下进行,并且观察他!!
[root@www ~]# jobs ; bg %3 ; jobs
[1]-  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[3]+  Stopped                 find / -perm +7000 > /tmp/text.txt
[3]+ find / -perm +7000 > /tmp/text.txt &  <==用 bg%3 的情况!
[1]+  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[3]-  Running                 find / -perm +7000 > /tmp/text.txt &

nohup

上述用&的方法其实是放到shell的后台中,如果这个shell连接断了,工作也就没了。所以如果想把工作放到系统的后台,则需要使用nohup...&

ps

-l:仅观察自己的 bash 相关程序:

范例一:将目前属於您自己这次登陆的 PID 与相关资讯列示出来(只与自己的 bash 有关)
[root@www ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash
4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    00:00:00 ps

aux:观察系统所有程序:

范例二:列出目前所有的正在内存当中的程序:
[root@www ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2064   616 ?        Ss   Mar11   0:01 init [5]
root         2  0.0  0.0      0     0 ?        S<   Mar11   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Mar11   0:00 [ksoftirqd/0]
.....(中间省略).....
root     13639  0.0  0.2   5148  1508 pts/1    Ss   11:44   0:00 -bash
root     14232  0.0  0.1   4452   876 pts/1    R+   15:52   0:00 ps aux
root     18593  0.0  0.0   2240   476 ?        Ss   Mar14   0:00 /usr/sbin/atd

top

相对于 ps 是截取一个时间点的程序状态, top 则可以持续侦测程序运行的状态:

范例一:每两秒钟升级一次 top ,观察整体资讯:
[root@www ~]# top -d 2        #下面的数据会两秒刷新一次
top - 17:03:09 up 7 days, 16:16,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.5%us,  0.5%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    742664k total,   681672k used,    60992k free,   125336k buffers
Swap:  1020088k total,       28k used,  1020060k free,   311156k cached
    <==如果加入 k 或 r 时,就会有相关的字样出现在这里喔!
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND     
14398 root      15   0  2188 1012  816 R  0.5  0.1   0:00.05 top
    1 root      15   0  2064  616  528 S  0.0  0.1   0:01.38 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0

-p:通过PID指定观察某程序。

netstat

[root@www ~]# netstat -[atunlp]
选项与参数:
-a  :将目前系统上所有的连线、监听、Socket 数据都列出来
-t  :列出 tcp 网络封包的数据
-u  :列出 udp 网络封包的数据
-n  :不以程序的服务名称,以埠号 (port number) 来显示;
-l  :列出目前正在网络监听 (listen) 的服务;
-p  :列出该网络服务的程序 PID 

dmesg

分析内核产生的信息。

/proc/*

其中存储的是内存中的数据:

[root@www ~]# ll /proc
dr-xr-xr-x  5 root      root              0 Mar 11 08:46 1
dr-xr-xr-x  5 root      root              0 Mar 11 00:46 10
dr-xr-xr-x  5 root      root              0 Mar 11 00:46 11
....(中间省略)....
-r--r--r--  1 root      root              0 Mar 20 12:11 uptime
-r--r--r--  1 root      root              0 Mar 20 12:11 version
-r--r--r--  1 root      root              0 Mar 20 12:11 vmstat
-r--r--r--  1 root      root              0 Mar 20 12:11 zoneinfo

各个程序的 PID 都是以目录的型态存在于 /proc 当中。 举例来说,我们启动所运行的第一支程序 init 他的 PID 是 1 , 这个 PID 的所有相关资讯都写入在 /proc/1/*当中。

lsof

列出被程序所开启的文件档名

[root@www ~]# lsof [-aUu] [+d]
选项与参数:
-a  :多项数据需要『同时成立』才显示出结果时!
-U  :仅列出 Unix like 系统的 socket 文件类型;
-u  :后面接 username,列出该使用者相关程序所开启的文件;
+d  :后面接目录,亦即找出某个目录底下已经被开启的文件!

范例一:列出目前系统上面所有已经被开启的文件与装置:
[root@www ~]# lsof
COMMAND PID  USER   FD  TYPE  DEVICE   SIZE     NODE NAME
init      1  root  cwd   DIR     3,2   4096        2 /
init      1  root  rtd   DIR     3,2   4096        2 /
init      1  root  txt   REG     3,2  38620  1426405 /sbin/init
....(底下省略)....
# 注意到了吗?是的,在默认的情况下, lsof 会将目前系统上面已经开启的
# 文件全部列出来~所以,画面多的吓人啊!您可以注意到,第一个文件 init 运行的
# 地方就在根目录,而根目录,嘿嘿!所在的 inode 也有显示出来喔!

/var/log/secure

基本上,只要牵涉到『需要输入帐号口令』的软件,那么当登陆时 (不管登陆正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形介面登陆所使用的 gdm 程序、 su, sudo 等程序、还有网络连线的 ssh, telnet 等程序, 登陆资讯都会被记载在这里。

/var/log/messages

这个文件相当的重要,几乎系统发生的错误信息 (或者是重要的资讯) 都会记录在这个文件中; 如果系统发生莫名的错误时,这个文件是一定要查阅的登录文件之一。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容