完整的计算机分层



程序程序程序程序程序程序程序程序
library 库(没有入口的程序仅供调用)(库调用)
内核(进程管理 内存管理 文件系统管理 网络功能管理  硬件驱动 安全机制)(上层可以通过系统调用获取功能)
硬件组成(提供各种硬件功能如:运算 网络 存储 I/O)






关于linux操作系统

linux的基本原则

1    由单一的程序组成:组合小程序完成复杂的任务

2    一切皆文件

3    尽量避免捕获用户接口

4    配置文件保存为纯文本



命令实现过程:

命令  ->shell   ->内核


密码设置的规则

1    使用4种类别字符中的3种

2    足够长度 至少7位

3    使用随机字符串

4    定期更换

5    循环周期够长



ls
-l:长格式
 文件类型:
  -:普通文件 (f)
  d: 目录文件
  b: 块设备文件 (block)
  c: 字符设备文件 (character)
  l: 符号链接文件(symbolic link file)
  p: 命令管道文件(pipe)
  s: 套接字文件(socket)
 文件权限:9位,每3位一组,每一组:rwx(读,写,执行), r--
 文件硬链接的次数
 文件的属主(owner)
 文件的属组(group)
 文件大小(size),单位是字节
 时间戳(timestamp):最近一次被修改的时间
  访问:access
  修改:modify,文件内容发生了改变
  改变:change,metadata,元数据
-h:做单位转换
-a: 显示以.开头的隐藏文件
 . 表示当前目录
 .. 表示父目录
-A
-d: 显示目录自身属性
-i: index node, inode
-r: 逆序显示
-R: 递归(recursive)显示

cd: change directory
家目录,主目录, home directory
cd ~USERNAME: 进入指定用户的家目录
cd -:在当前目录和前一次所在的目录之间来回切换


1:用户命令(/bin, /usr/bin, /usr/local/bin)
2:系统调用
3:库用户
4:特殊文件(设备文件)
5:文件格式(配置文件的语法)
6:游戏
7:杂项(Miscellaneous)
8: 管理命令(/sbin, /usr/sbin, /usr/local/sbin)



目录管理:
ls、cd、pwd、mkdir、rmdir、tree

文件管理:
touch、stat、file、rm、cp、mv、nano

日期时间:
date、clock、hwclock、cal


cut:
-d: 指定字段分隔符,默认是空格
-f: 指定要显示的字段
 -f 1,3
 -f 1-3

文本排序:sort
-n:数值排序
-r: 降序
-t: 字段分隔符
-k: 以哪个字段为关键字进行排序
-u: 排序后相同的行只显示一次
-f: 排序时忽略字符大小写

uniq:
-c: 显示文件中行重复的次数
-d: 只显示重复的行

文本统计:wc (word count)
-l
-w
-c
-L

查看文本:
cat、tac、more、less、head、tail



命令行编辑:
光标跳转:
Ctrl+a:跳到命令行首
Ctrl+e:跳到命令行尾
Ctrl+u: 删除光标至命令行首的内容
Ctrl+k: 删除光标至命令行尾的内容
Ctrl+l: 清屏

命令历史:
查看命令历史:history
-c:清空命令历史
-d OFFSET [n]: 删除指定位置的命令
-w:保存命令历史至历史文件中


环境变量
PATH:命令搜索路径
HISTSIZE: 命令历史缓冲区大小

命令历史的使用技巧:
!n:执行命令历史中的第n条命令;
!-n:执行命令历史中的倒数第n条命令;
!!: 执行上一条命令;
!string:执行命令历史中最近一个以指定字符串开头的命令
!$:引用前一个命令的最后一个参数;
Esc, .
Alt+.



文件名通配, globbing
*: 任意长度的任意字符
?:任意单个字符
[]:匹配指定范围内的任意单个字符
[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]: 大写字母
[:alpha:]: 大小写字母
[:digit:]: 数字
[:alnum:]: 数字和大小写字母.





/etc/passwd
account: 登录名
password: 密码
UID:
GID:基本组ID
comment: 注释
HOME DIR:家目录
SHELL:用户的默认shell



用户管理:
useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage

组管理:
groupadd, groupdel, groupmod, gpasswd

权限管理:
chown, chgrp, chmod, umask


/etc/passwd:
用户名:密码:UID:GID:注释:家目录:默认SHELL

/etc/group:
组名:密码:GID:以此组为其附加组的用户列表

/etc/shadow:
用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:






useradd  [options]  USERNAME
-u UID
-g GID(基本组)
-G GID,...  (附加组)
-c "COMMENT"
-d /path/to/directory
-s SHELL
-m -k
-M
-r: 添加系统用户



/etc/login.defs

环境变量:
PATH
HISTSIZE
SHELL


/etc/shells:指定了当前系统可用的安全shell

userdel:
userdel [option] USERNAME
-r: 同时删除用户的家目录

id:查看用户的帐号属性信息
-u
-g
-G
-n

finger: 查看用户帐号信息
finger USERNAME

修改用户帐号属性:
usermod
-u UID
-g GID
-a -G GID:不使用-a选项,会覆盖此前的附加组;
-c
-d -m:
-s
-l
-L:锁定帐号
-U:解锁帐号

chsh: 修改用户的默认shell

chfn:修改注释信息



密码管理:
passwd [USERNAME]
--stdin
-l
-u
-d: 删除用户密码

pwck:检查用户帐号完整性


组管理:
创建组:groupadd
groupadd
-g GID
-r:添加为系统组

groupmod
-g GID
-n GRPNAME

groupdel

gpasswd:为组设定密码



chage
-d: 最近一次的修改时间
-E: 过期时间
-I:非活动时间
-m: 最短使用期限
-M: 最长使用期限
-W: 警告时间



chown: 改变文件属主(只有管理员可以使用此命令)
# chown USERNAME file,...
-R: 修改目录及其内部文件的属主
--reference=/path/to/somefile file,...

chown USERNAME:GRPNAME file,...
chown USERNAME.GRPNAME file,...

# chgrp GRPNAME file,...
-R
--reference=/path/to/somefile file,...

chmod: 修改文件的权限
修改三类用户的权限:
chmod MODE file,...
-R
--reference=/path/to/somefile file,...

rwxr-x---

修改某类用户或某些类用户权限:
u,g,o,a
chmod 用户类别=MODE file,...

修改某类用户的某位或某些位权限:
u,g,o,a
chmod 用户类别+|-MODE file,...





站在用户登录的角度来说,SHELL的类型:
登录式shell:
正常通常某终端登录
su - USERNAME
su -l USERNAME

非登录式shell:
su USERNAME
图形终端下打开命令窗口
自动执行的shell脚本

bash的配置文件:
全局配置
/etc/profile, /etc/profile.d/*.sh, /etc/bashrc
个人配置
~/.bash_profile, ~/.bashrc

profile类的文件:
设定环境变量
运行命令或脚本

bashrc类的文件:
设定本地变量
定义命令别名

登录式shell如何读取配置文件?
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell如何配置文件?
~/.bashrc --> /etc/basrc --> /etc/profile.d/*.sh




grep, egrep, fgrep

grep: 根据模式搜索文本,并将符合模式的文本行显示出来。
Pattern: 文本字符和正则表达式的元字符组合而成匹配条件

grep [options] PATTERN [FILE...]
-i
--color
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串


*: 任意长度的任意字符
?: 任意单个字符
[]:
[^]:

正则表达式:REGular EXPression, REGEXP
元字符:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]

匹配次数(贪婪模式):
*: 匹配其前面的字符任意次
a, b, ab, aab, acb, adb, amnb
a*b, a?b
a.*b

.*: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{1,\}
\{0,3\}

位置锚定:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行

\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

分组:
\(\)
\(ab\)*
后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2:
\3:



bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量

本地变量:
set VARNAME=VALUE: 作用域为整个bash进程;

局部变量:
local VARNAME=VALUE:作用域为当前代码段;

环境变量:作用域为当前shell进程及其子进程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
“导出”

位置变量:
$1, $2, ...

特殊变量:
$?: 上一个命令的执行状态返回值;




撤消变量:
unset VARNAME

查看当shell中变量:
set

查看当前shell中的环境变量:
printenv
env
export


bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试

条件测试的表达式:
[ expression ]
` expression `
test expression

整数比较:
-eq: 测试两个整数是否相等;比如 $A -eq $B
-ne: 测试两个整数是否不等;不等,为真;相等,为假;
-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: 大于或等于
-le:小于或等于

命令的间逻辑关系:
逻辑与: &&
 第一个条件为假时,第二条件不用再判断,最终结果已经有;
 第一个条件为真时,第二条件必须得判断;
逻辑或: ||


shell中如何进行算术运算:
1、let 算术运算表达式
let C=$A+$B
2、$[算术运算表达式]
C=$[$A+$B]
3、$((算术运算表达式))
C=$(($A+$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=`expr $A + $B`





if 条件测试格式

测试方法:
[ expression ]
` expression `
test expression




文件测试:
-e FILE:测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户对指定文件是否有读取权限;
-w
-x



练习:写一个脚本
给定一个文件:
如果是一个普通文件,就显示之;
如果是一个目录,亦显示之;
否则,此为无法识别之文件;




定义脚本退出状态码

exit: 退出脚本
exit #
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;


测试脚本是否有语法错误:
bash -n 脚本

bash -x 脚本:单步执行


bash变量的类型:
本地变量(局部变量)
环境变量
位置变量:
 $1, $2, ...
 shift
特殊变量:
 $?
 $#:参数的个数
 $*: 参数列表
 $@:参数列表





grep, sed(流编辑器), awk  

sed基本用法:
sed: Stream EDitor
行编辑器 (全屏编辑器: vi)

sed: 模式空间
默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;


sed [options] 'AddressCommand' file ...
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT
 sed -f /path/to/scripts  file
-r: 表示使用扩展正则表达式


Address:
1、StartLine,EndLine
比如1,100
$:最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行;

Command:
d: 删除符合条件的行;
p: 显示符合条件的行;
a \string: 在指定的行后面追加新行,内容为string
 \n:可以用于换行
i \string: 在指定的行前面添加新行,内容为string
r FILE: 将指定的文件的内容添加至符合条件的行处
w FILE: 将地址指定的范围内的行另存至指定的文件中;
s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
 加修饰符
 g: 全局替换
 i: 忽略字符大小写
s///: s###, s@@@
 \(\), \1, \2

l..e: like-->liker
   love-->lover

   like-->Like
   love-->Love

&: 引用模式匹配整个串


grep, egrep, fgrep: 文本查找

文件查找:
locate:
非实时,模糊匹配,查找是根据全系统文件数据库进行的;
# updatedb, 手动生成文件数据库
速度快

find:
实时
精确
支持众多查找标准
遍历指定目录中的所有文件完成查找,速度慢;

find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示

匹配标准:
-name 'FILENAME':对文件名作精确匹配
 文件名通配:
  *:任意长度的任意字符
  ?
  []
-iname 'FILENAME': 文件名匹配时不区分大小写
-regex PATTERN:基于正则表达式进行文件名匹配

-user USERNAME: 根据属主查找
-group GROUPNAME: 根据属组查找

-uid UID: 根据UID查找
-gid GID: 根据GID查找

-nouser:查找没有属主的文件
-nogroup: 查找没有属组的文件

-type
 f: 普通文件
 d
 c
 b
 l
 p
 s

-size [+|-]
 #k
 #M
 #G

组合条件:
-a
-o
-not

/tmp目录,不是目录,并且还不能套接字类型的文件
/tmp/test目录下,属主不是user1,也不是user2的文件;

-mtime
-ctime
-atime
 [+|-]#
-mmin
-cmin
-amin
 [+|-]#

-perm MODE:精确匹配
 /MODE: 任意一位匹配即满足条件
 -MODE: 文件权限能完全包含此MODE时才符合条件

 -644
 644: rw-r--r--
 755: rwxr-xr-x
 750: rwxr-x---
find ./ -perl -001


运作:
-print: 显示
-ls:类似ls -l的形式显示每一个文件的详细
-ok COMMAND {} \; 每一次操作都需要用户确认
-exec COMMAND {} \;



特殊权限
passwd:s

SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
chmod u-s FILE
 如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;
SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
chmod g-s FILE
 develop team, hadoop, hbase, hive
 /tmp/project/
  develop
Sticky: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR


字符测试:
==:测试是否相等,相等为真,不等为假
!=: 测试是否不等,不等为真,等为假
>
<
-z string: 测试指定字符串是否为空,空则真,不空则假
-n string: 测试指定字符串是否不空,不空为真,空则为假



vim编辑器

文本编辑器,字处理器
ASCII

nano, sed

vi: Visual Interface
vim: VI iMproved

全屏编辑器,模式化编辑器

vim模式:
编辑模式(命令模式)
输入模式
末行模式

模式转换:
编辑-->输入:
i: 在当前光标所在字符的前面,转为输入模式;
a: 在当前光标所在字符的后面,转为输入模式;
o: 在当前光标所在行的下方,新建一行,并转为输入模式;

I:在当前光标所在行的行首,转换为输入模式
A:在当前光标所在行的行尾,转换为输入模式
O:在当前光标所在行的上方,新建一行,并转为输入模式;

输入-->编辑:
ESC

编辑-->末行:

末行-->编辑:
ESC, ESC

一、打开文件
# vim /path/to/somefile
vim +# :打开文件,并定位于第#行
vim +:打开文件,定位至最后一行
vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首

默认处于编辑模式

二、关闭文件
1、末行模式关闭文件
:q  退出
:wq 保存并退出
:q! 不保存并退出
:w 保存
:w! 强行保存
:wq --> :x
2、编辑模式下退出
ZZ: 保存并退出

三、移动光标(编辑模式)
1、逐字符移动:
h: 左
l: 右
j: 下
k: 上
#h: 移动#个字符;

2、以单词为单位移动
w: 移至下一个单词的词首
e: 跳至当前或下一个单词的词尾
b: 跳至当前或前一个单词的词首

#w:

3、行内跳转:
0: 绝对行首
^: 行首的第一个非空白字符
$: 绝对行尾

4、行间跳转
#G:跳转至第#行;
G:最后一行

末行模式下,直接给出行号即可

四、翻屏
Ctrl+f: 向下翻一屏
Ctrl+b: 向上翻一屏

Ctrl+d: 向下翻半屏
Ctrl+u: 向上翻半屏

五、删除单个字符
x: 删除光标所在处的单个字符
#x: 删除光标所在处及向后的共#个字符

六、删除命令: d
d命令跟跳转命令组合使用;
#dw, #de, #db

dd: 删除当前光标所在行
#dd: 删除包括当前光标所在行在内的#行;

末行模式下:
StartADD,EndADDd
.: 表示当前行
$: 最后一行
+#: 向下的#行

七、粘贴命令 p
p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面;
P: 如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面;

八、复制命令 y
用法同d命令

九、修改:先删除内容,再转换为输入模式
c: 用法同d命令

十、替换:r
R: 替换模式

十一、撤消编辑操作 u
u:撤消前一次的编辑操作
连续u命令可撤消此前的n次编辑操作
#u: 直接撤消最近#次编辑操作

撤消最近一次撤消操作:Ctrl+r

十二、重复前一次编辑操作
.

十三、可视化模式
v: 按字符选取
V:按矩形选取

十四、查找
/PATTERN
?PATTERN
n
N

十五、查找并替换
在末行模式下使用s命令
ADDR1,ADDR2s@PATTERN@string@gi
1,$
%:表示全文


十六、使用vim编辑多个文件
vim FILE1 FILE2 FILE3
:next 切换至下一个文件
:prev 切换至前一个文件
:last 切换至最后一个文件
:first 切换至第一个文件

退出
:qa 全部退出

十七、分屏显示一个文件
Ctrl+w, s: 水平拆分窗口
Ctrl+w, v: 垂直拆分窗口

在窗口间切换光标:
Ctrl+w, ARROW

:qa 关闭所有窗口

十八、分窗口编辑多个文件
vim -o : 水平分割显示
vim -O : 垂直分割显示

十九、将当前文件中部分内容另存为另外一个文件
末行模式下使用w命令
:w
:ADDR1,ADDR2w /path/to/somewhere

二十、将另外一个文件的内容填充在当前文件中
:r /path/to/somefile

二十一、跟shell交互
:! COMMAND

二十二、高级话题
1、显示或取消显示行号
:set number
:set nu

:set nonu

2、显示忽略或区分字符大小写
:set ignorecase
:set ic

:set noic

3、设定自动缩进
:set autoindent
:set ai
:set noai

4、查找到的文本高亮显示或取消
:set hlsearch
:set nohlsearch

5、语法高亮
:syntax on
:syntax off

二十三、配置文件
/etc/vimrc
~/.vimrc



FACL:Filesystem Access Control List
利用文件扩展保存额外的访问控制权限

jerry: rw-

setfacl
-m: 设定
 u:UID:perm
 g:GID:perm
-x:取消
 u:UID
 g:GID

getfacl



几个命令:
w
who
每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出;
sleep

whoami

last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
-n #: 显示最近#次的相关信息
lastb,/var/log/btmp文件,显示用户错误的登录尝试
-n #:
lastlog: 显示每一个用户最近一次的成功登录信息;
-u USERNAME: 显示特定用户最近的登录信息

basename
$0: 执行脚本时的脚本路径及名称


hostname: 显示主机名




面向过程
控制结构
 顺序结构
 选择结构
 循环结构

选择结构:
if: 单分支、双分支、多分支
if CONDITION; then
 statement
 ...
fi

if CONDITION; then
 statement
 ...
else
 statement
 ...
fi

if CONDITION1; then
 statement
 ...
elif CONDITION2; then
 statement
 ...
esle
 statement
 ...
fi


case语句:选择结构

case SWITCH in
value1)
 statement
 ...
 ;;
value2)
 statement
 ...
 ;;
*)
 statement
 ...
 ;;
esac

rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm

yum repolist