FACL:
setfacl
-b Remove all
-m
-x
FilesystemAccessControl List 文件系统访问控制列表
利用文件扩展保存额外的访问控制权限
jerry: rw-
setfacl
-m:设定
u:UID:perm设定用户为某某权限
g:GID:perm设定组为某某权限
setfacl-m u:hadoop:rw inittab
-x:取消
u:UID
g:GID
getfacl
几个命令:
w 谁登陆了,用户还在干什么
who 登陆的用户
每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出;
sleep
whoami 当前有效的用户
last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
-n#: 显示最近#次的相关信息
lastb,/var/log/btmp文件,显示用户错误的登录尝试
-n#:
lastlog: 显示每一个用户最近一次的成功登录信息;
-uUSERNAME: 显示特定用户最近的登录信息
basename
$0:执行脚本时的脚本路径及名称
练习
hostname: 显示主机名
如果当前主机的主机名不是www.magedu.com,就将其改为www.magedu.com
如果当前主机的主机名是localhost,就将其改为www.magedu.com
如果当前主机的主机名为空,或者为(none),或者为localhost,就将其改为www.magedu.com
[ -z `hostname` ]|| [ `hostname` =='(none)' -o `hostname` == 'localhost' ] && hostnamewww.magedu.com
生成随机数
RANDOM: 0-32768
随机数生成器:熵池
/dev/random:
/dev/urandom:
写一个脚本,利用RANDOM生成10个随机数,并找出其中的最大值,和最小值;
#!/bin/bash
#
declare -i MAX=0
declare -i MIN=0
for I in {1..10};do
MYRAND=$RANDOM
[ $I -eq 1 ]&& MIN=$MYRAND
if [ $I -le 9 ];then
echo -n"$MYRAND,"
else
echo"$MYRAND"
fi
[ $MYRAND -gt $MAX] && MAX=$MYRAND
[ $MYRAND -lt $MIN] && MIN=$MYRAND
done
echo $MAX, $MIN
面向过程
控制结构
顺序结构
选择结构
循环结构
选择结构:
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
#!/bin/bash
#
case $1 in
[0-9]
echo "Adigit.";;
[a-z]
echo"Lower";;
[A-Z]
echo"Upper";;
*)
echo"other"
esac
a-z
A-Z
0-9
[abc]
只接受参数start,stop,restart,status其中之一
#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0
for I in `seq 0$#`; do
if [ $# -gt 0 ];then
case$1 in
-v|--verbose)
DEBUG=1
shift;;
-h|--help)
echo"Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose-h|--help"
exit0
;;
--add)
ADD=1
ADDUSERS=$2
shift2
;;
--del)
DEL=1
DELUSERS=$2
shift2
;;
*)
echo"Usage: `basename $0` --add USER_LIST --del USER_LIST-v|--verbose-h|--help"
exit7
;;
esac
fi
done
if [ $ADD -eq 1 ];then
for USER in `echo$ADDUSERS | sed 's@,@@g'`; do
if id $USER&> /dev/null; then
[ $DEBUG -eq 1 ]&& echo"$USER exists."
else
useradd $USER
[ $DEBUG -eq 1 ]&& echo "Adduser $USER finished."
fi
done
fi
if [ $DEL -eq 1 ];then
for USER in `echo$DELUSERS | sed 's@,@@g'`; do
if id $USER&> /dev/null; then
userdel -r $USER
[ $DEBUG -eq 1 ]&& echo"Delete $USER finished."
else
[ $DEBUG -eq 1 ]&& echo"$USER not exist."
fi
done
fi
练习:
写一个脚本showlogged.sh,其用法格式为:
showlogged.sh -v-c -h|--help
其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息;如
Logged users: 4.
They are:
root tty2 Feb 18 02:41
root pts/1 Mar 8 08:36 (172.16.100.177)
root pts/5 Mar 8 07:56 (172.16.100.177)
hadoop pts/6 Mar 8 09:16 (172.16.100.177)
#!/bin/bash
#
declare -iSHOWNUM=0
declare -iSHOWUSERS=0
for I in `seq 1$#`; do
if [ $# -gt 0 ];then
case $1 in
-h|--help)
echo "Usage:`basename $0` -h|--help-c|--count -v|--verbose"
exit 0 ;;
-v|--verbose)
let SHOWUSERS=1
shift ;;
-c|--count)
let SHOWNUM=1
shift ;;
*)
echo "Usage:`basename $0` -h|--help-c|--count -v|--verbose"
exit 8 ;;
esac
fi
done
if [ $SHOWNUM -eq1 ]; then
echo "Loggedusers: `who | wc-l`."
if [ $SHOWUSERS-eq 1 ]; then
echo "They are:"
who
fi
fi
磁盘
MBR Main BOOTRECORD 主引导记录 512字节0磁道0扇区 MBR是整个硬盘的
BootLoader 446BYTE程序引导
64byte 16bytes标识一个分区分区表
2byte MAGIC NUMBER标记MBR是否有效
终端类型:
console:控制台直接连到主机的设备()终端是软硬件的结合
pty:物理终端 (VGA) 已经被识别,但没登陆
tty#:虚拟终端 (VGA) 已经登陆了,在本地附加在控制台上面
ttyS#:串行终端
pts/#:伪终端远程登陆,图形界面窗口,伪文件系统
链接
ln [-s -v] SRCDEST
硬链接:ln
1、只能对文件创建,不能应用于目录;
2、不能跨文件系统;
3、创建硬链接会增加文件被链接的次数;
符号链接:ln -s
1、可应用于目录;
2、可以跨文件系统;
3、不会增加被链接文件的链接次数;
4、其大小为指定的路径所包含的字符个数;
du
-s整个目录大小
-h单位换算
df:
显示整个磁盘分区使用情况
设备文件:
b:按块为单位,随机访问的设备;
c:按字符为单位,线性设备;
b:硬盘
c:键盘
/dev
主设备号(majornumber)
标识设备类型
次设备号(minornumber)
标识同一种类型中不同设备
mknod 创建设备
mknod [OPTION]...NAME TYPE [MAJOR MINOR]
-mMODE 制定文件权限644
mknod mydv 66 c 0 c是字符设备
硬盘设备的设备文件名:
IDE, ATA:hd
SATA:sd
SCSI: sd
USB: sd
a,b,c,...来区别同一种类型下的不同设备
IDE:
第一个IDE口:主、从
/dev/hda,/dev/hdb
第二个IDE口:主、从
/dev/hdc,/dev/hdd
sda, sdb, sdc, ...
hda:
hda1:第一个主分区
hda2:
hda3:
hda4:
hda5:第一个逻辑分区
磁盘管理命令
查看当前系统识别了几块硬盘:
fdisk -l[/dev/to/some_device_file]
管理磁盘分区:
fdisk /dev/sda
p:显示当前硬件的分区,包括没保存的改动
n:创建新分区
e:扩展分区
p:主分区
d:删除一个分区
w:保存退出
q:不保存退出
t:修改分区类型
L:
l:显示所支持的所有类型
cat/proc/partition
partprobe 重读分区表
练习:
写一个脚本通过命令行传递一个文件路径参数给脚本:如果参数多了或少了,报错;
如果参数指定的路径对应的是目录而不是文件,报错;而后,检查路径指定的文件是否为空或不存在,如果是,则新建此文件,并在文件中生成如下内容
#!/bin/bash
#
而后,使用vim编辑器打开此文件,并让光标处于这个文件的最后一行;
写个脚本,按如下方式执行:
mkscript.sh-v|--version VERSION-a|--author AUTHOR -t|--time DATETIME -d|--descriptionDESCRIPTION -f|--file/PATH/TO/FILE -h|--help
1、此脚本能创建或打开-f选项指向的文件/PATH/TO/FILE;如果其为空文件,能自动为其生成第一行;如果文件不空,且第一行不是#!/bin/bash,则中止此脚本,并报错“The file is not a bash script.";否则,则直接使用vim 打开此文件;
提示:/PATH/TO/FILE,要判断其目录是否存在;如果不存在,则报错;
2、如果为空文件,自动生成的第一行内容为:
#!/bin/bash
3、如果为空文件,且使用了-a选项,则在文件中添加“#Author: -a选项的参数”,比如:
# Author: Jerry
4、如果为空文件,且使用了-t选项,则在文件中添加“#Date: 脚本执行-t选项后指定的时间”,比如:
# Date: 2013-03-0818:05
5、如果为空文件,且使用了-d选项,则在文件中添加“#Description: -d选项的内容”,比如:
# Description:Create a bash script filehead.
6、如果为空文件,且使用了-v选项,则在文件添加“#Version: -v后跟的参数”,比如:
# Version: 0.1
6、-h选项只能单独使用,用于显示使用帮助;
7、其它选项,显示帮助信息;
说明:
这是一个用于创建脚本的脚本,它可以自动帮助创建一个bash脚本的文件头,这样,以后使用此脚本来创建其它脚本将变得比较高效。比如:
#!/bin/bash
# Author:Jerry(jerry@magedu.com)
# Date: 2013-03-0818:05
# Description:Create a bash script filehead.
# Version: 0.1
#