1.1 什么是shell
shell是核心程序(kernel)之外的指令解析器,是一个程序同时一中命令语言和程序设计语言。
shell的类型:ash,bash,sh,ksh,csh,tcsh
-/etc/shells
-echo $SHELL
程序在shell中运行
shell中可以运行子shell
#!/bin/bash
echo "hello word"
chmod +x xx.txt
./xx.txt
1.2存取权限与安全
文件和目录的权限(-rwrr--r--)
setuid(suid/guid)(chmod u+s,g+s file)
chown 和 chgrp (chown user file/chgrp group file)
unmask(unmask nnn)
符号链接(ln [-s] source_path target_path)
ls -lh 查看各个文件占用的空间大小
chmod [who] operator [permission] filename
who(u,g,o,a) u:用户, g:全部用户, o:其他用户,a:全部
operator(+,-,=) +:增加 - :减少 = :设定某个权限
permission(r,w,x,s,t)
r:可读,w:可写,可更改,x:执行
s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。
[hadoop@localhost ~]$ ls -lh
总用量 32K
drwxr-xr-x. 2 hadoop hadoop 4.0K 4月 7 01:08 公共的
第一列:第一个字符表示文件的类型:目录或者文件,连接等
第2,3,4位表示:当前用户对此文件的权限:读,写,执行
第5,6,7位表示:所属组的权限:执行,读
最后三位表示:其他用户对此文件用户的权限
第二列:文件硬链接数或目录子目录数
如果一个文件不是目录那么这一字段表示,这个文件所具有的硬链接数,即这个文件总共有多少个文件名.查看第一个文件:
-rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg
第2字段的值为1,说明这个文件只有anaconda-ks.cfg这一个文件名.即只有一个指向该链接的硬链接.
如果我用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2:
[root@localhost ~]# ln anaconda-ks.cfg anaconda-ks.cfg.hardlink
[root@localhost ~]# ls -l
总用量 4071
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg.hardlink
此时,anaconda-ks.cfg 和anaconda-ks.cfg.hardlink 称为互为硬链接.他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件.
用ls -i anaconda-ks.cfg可以查看它的文件节点(inode)
互为硬链接的文件具有相同的文件节点. 以下是验证实验:
[root@localhost ~]# ls -i anaconda-ks.cfg
18102 anaconda-ks.cfg
[root@localhost ~]# ls -i anaconda-ks.cfg.hardlink
18102 anaconda-ks.cfg.hardlink
可以看到,这两个文件具有相同的文件节点号:18102
如果你知道一个文件有多个文件名,如何查找他的其他文件名分布在什么地方呢?
可以先用ls -i 获得它的节点号,然后用find查找, 如/etc/sysconfig/networking/devices/ifcfg-eth0就具有多个文件名,我要查找与它互为硬链接的文件:
[root@localhost ~]# ls -i /etc/sysconfig/networking/devices/ifcfg-eth0
147181 /etc/sysconfig/networking/devices/ifcfg-eth0
得到它的节点号为 147181
再用find查找:
[root@localhost ~]# find /etc -inum 147181
/etc/sysconfig/networking/devices/ifcfg-eth0
/etc/sysconfig/networking/profiles/default/ifcfg-eth0
这样就得到了同一个文件的不同文件名的位置.
*************************************
如果是一个目录,第2字段的含义:
**************************************
如果是一个目录,则第2字段表示该目录所含子目录的个数.
新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录.为什么新建的目录下面会有两个子目录呢?
因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"..",这两个默认子目录是隐藏的.用ls -a可以看到.
每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加.
--------------------------------------------------------
第三列:文件的拥有者
第四列: 文件拥有者所在的组
第五列:文件文件大小(以字节为单位)
第六列:文件创建月份
第七列: 文件创建日期
第八列: 文件创建时间
文件创建的时间可以通过touch命令来修改.如:
#touch testfile
可以把testfile的创建时间修改为当前时间.
touch的详细用法请看链接文档:
#man touch
另外,一个文件还有最后访问时间,最后修改时间等属性.
这些属性可以用ls 的其它参数显示出来.
第九列:文件名
如果是一个符号链接,那么会有一个 "->" 箭头符号,后面根一个它指向的文件名.
如果想改变一个文件的权限,必须是root用户或者文件的拥有者
chown [-cfhvR] [--help] [--version] user[:group] file...
user : 新的档案拥有者的使用者 ID
group : 新的档案拥有者的使用者群体(group)
-c : 若该档案拥有者确实已经更改,才显示其更改动作
-f : 若该档案拥有者无法被更改也不要显示错误讯息
-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案
-v : 显示拥有者变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本
chown 和 chgrp (chown user file/chgrp group file)
改变文件所属的用户或者组
chown [-R] owner filename
chown ower.group filename
chown .group filename
chgrp [-R] group filename
umask
umask的值共有4位,分别代表:gid/uid,属主,组权,其它用户权限。一般用的是后3位。
umask设置的是权限“补码”:如上umask值为022,则对应目录权限为7-0=7,7-2=5,7-2=5,即用777减去umask的相应位上的值;而对应的文件权限是用666减去umask的相应位上的值
修改umask的值
输入:umask 024,则可直接修改以后新建的目录和文件的默认权限为:553,642。
//在文件 /etc/profile里可以设置umask值
符号链接
硬链接
软连接
ln [-s] source_path target_path
1.Linux链接概念
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。
【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
2.通过实验加深理解
[root@localhost ~]$ touch f1 #创建一个测试文件f1
[root@localhost ~]$ ln f1 f2 #创建f1的一个硬连接文件f2
[root@localhost ~]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
[root@localhost ~]$ ls -li # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。
[root@localhost ~]$ echo "I am f1 file" >>f1
[root@localhost ~]$ cat f1
I am f1 file
[root@localhost ~]$ cat f2
I am f1 file
[root@localhost ~]$ cat f3
I am f1 file
[root@localhost ~]$ rm -f f1
[root@localhost ~]$ cat f2
I am f1 file
[root@localhost ~]$ cat f3
cat: f3: No such file or directory
通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效
3.总结
可以做一些相关的测试,可以得到以下全部结论:
1).删除符号连接f3,对f1,f2无影响;
2).删除硬连接f2,对f1,f3也无影响;
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
别名的使用
Linux 提供的命令别名功能很有用.比如我经常使用ll | more 命令,而不是直接使用ll.但又不想敲那么多的字符.那么,可以给ll | more设置别名:
[root@localhost ~]# alias lm='ll | more'
试试命令lm,它的效果跟ll | more一样! 再比如DOS下的清屏命令是cls,而Linux下是clear.如果在Linux下也想使用cls,可以给它设置一个别名:
[root@localhost ~]# alias cls='clear'
直接输入alias,可以查看当前设置的命令别名:
[root@localhost ~]# alias
alias cls='clear'
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias lm='ll | more'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot -- show-tilde'
如果想取消命令别名,使用unalias即可
[root@localhost ~]# unalias cls
[root@localhost ~]# unalias lm
[root@localhost ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
命令替换
myfile的内容两个文件名:pram findfile
ls `cat myfile` -al
后台运行
在后台执行程序
nohup /root/start.sh &
使用 jobs 查看任务 jobs -l
管道
cat xx.txt | more
模式匹配
ls *.txt -l
特殊字符
双引号:用来使shell无法认出空格,制表符和其他大多数的特殊字符。
单引号:用来使shell无法认出所有特殊字符。
反引号(`):用来替换命令。
反斜杠:用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值。
分号:用于在同一行上放多个命令。
&:命令后台执行。
括号():创建成组的命令。
竖杠(|):管道标示符。
< >&:表示重定向。
* ? [ ] !:表示模式匹配。
#:表示注释(除第一行外)。
空格,制表符,换行符:当做空白。