用户管理
添加用户
useradd sxt01
所有的系统账户都是在home目录下的
drwx------ 2 sxt01 sxt01 4096 Dec 10 06:38 sxt01
可以去home目录下去进行查询
对于两个账户共享同样的东西,可以通过创建组的形式,让两个账户共享相同的东西,具有这样的权限
添加组的命令
groupadd sxtshare
一个用户可以同属于多个组的
[root@node11 /]# id sxt01
uid=502(sxt01) gid=502(sxt01) groups=502(sxt01)
[root@node11 /]# usermod -a -G sxtshare sxt01
[root@node11 /]# id sxt01
uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)
[root@node11 /]#
或者:
[root@node11 /]# id sxt01
uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)
[root@node11 /]# id sxt02
uid=503(sxt02) gid=503(sxt02) groups=503(sxt02)
[root@node11 /]# usermod -a -G sxtshare sxt01
[root@node11 /]# id sxt01
uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)
[root@node11 /]# usermod -a -G sxtshare sxt02
[root@node11 /]# id sxt02
uid=503(sxt02) gid=503(sxt02) groups=503(sxt02),504(sxtshare)
[root@node11 /]#
让哪一个用户:
给用户赋予权限,并让其归属于哪一个组:
chown sxt01:sxtshare share
修改权限,通过加或者减权限,前边的chmod是指修改权限。
chmod u/g/o/a +/- rwx
组加上写的权限
chmod g+w share/
修改之后:
drwxr-xr-x 2 root sxtshare 4096 Dec 10 19:40 test
Root持有test这个目录,sxtshare持有test这个目录
这两个的区别是什么:chmod的区别和chown的区别是什么?
[root@node11 /]# chmod g+w test/
在实际开发过程中,修改权限之后,需要将用户退出,修改完权限之后再进入。
修改权限的方式:
chown :sxtshare sxt01.txt
登录一个用户:
ssh sxt01@node11
Chmod:修改权限:
Chmod修改权限的方式有两种:
字符修改的方式和数值的修改方式
字符修改权限的方式:
字符修改又分为对user的权限修改,对other的权限修改,对group的权限修改,对all的权限修改。
其中在操作的时候,可以对一个用户修改多个权限,但是不能对多个用户修改多个权限。
比如可以同时对sxt01.txt添加权限:
Chmod u+xrw sxt01.txt
但是不能使用:
Chmod u+xrw g+xrw sxt01.txt
在Linux系统中:
Chmod是修改权限的使用方式
Chown是修改属性的方式,也就是这个文件或者这个目录属于哪个用户哪个组的。
在修改权限的时候:
111—>rwx—>7
是这样的,从右到左依次是:111—>xrw—>7
在进行计算的时候,从左往右依次是:user用户,group组,other权限,最后边是all组。
在进行计算的时候,如果只是user权限,并且是user权限的write,read,executive,那么就是7,如果只是read,那么就是5,如果只是executive,那么就是1
修改权限的时候:最前边是持有者所具有的权限,中间是组里的其他用户的权限,最后边是其他用户可以拥有的权限。
目录一般会给的权限有:
755是目录的默认权限
给文件给权限的时候,
755是目录的默认权限
644是文件的默认权限
Su命令式切换用户
Root用户切换任何用户是免密的。
添加用户使用:
Useradd sxt01
Useradd sxt02
然后在后边输入密码
修改用户权限:
Chmod 770 文件名
添加组使用:
Groupadd sxtswap
Linux系统和Windows系统的区别是:
Linux系统全部是命令行的形式
Windows系统是图形化界面
Linux系统中软件的安装
编译型语言,解释型语言
编译安装有:
rpm安装
Yum安装
程序系统的运行需要调用内核
JDK的下载与安装:
苹果系统是Unix系统内核
Redhat的安装:使用rpm包
安装的过程就是复制黏贴的过程
包的安装没有解决依赖的问题
程序的安装,基于包的安装
yum是基于仓库的安装
安装的三种方式:
编译安装
包的安装
通过rpm包的查找安装
还有一种是绿色的,解压就可以使用
Maven是一个仓库,将包放在某一个文件夹中
Make编译
使用yum安装的命令:
yum install gcc
以上是编译安装
包的安装
rpm包的安装
rpm -i jdk-7u67-linux-x64.rpm
rpm包的查询与过滤
rpm -qa | grep jdk
查询一个文件在哪里?
whereis route
查询并且去计算
ls -l | wc -l
Yum:是一种C/S架构
Yum的使用
脚本编程:
Bash的使用:
Bash:是一个 启动器,解释器
解释器:用户交互输入
source test.txt
source:就是让命令去执行
Source和.的区别:
[root@node12 ~]# type "."
. is a shell builtin
[root@node12 ~]# type "source"
source is a shell builtin
[root@node12 ~]#
其实两个的用法,作用等都是相同的。
ps是进程状态
[root@node12 ~]# pstree
init─┬─auditd───{auditd}
├─crond
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─nginx───nginx
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─sshd───bash
│ └─sshd───bash───bash───pstree
└─udevd───2*[udevd]
[root@node12 ~]#
要让一个脚本文件去执行,需要加上/bin/bash,使得这个文件可执行。
为什么能够执行,是因为有/bin/bash
#是几个注释,对于bash而言是一个注释,但是对于内核解释器而言,#!一个命令
以上就是脚本
以下是函数和方法
这个命令:echo $$;是打印当前的进程号
文本流,重定向
重定向的不是程序,而重定向的是I/O
[root@node12 ~]# cd /proc/7351/fd [root@node12 fd]# ll total 0 lrwx------ 1 root root 64 Dec 9 20:53 0 -> /dev/pts/0 lrwx------ 1 root root 64 Dec 9 20:53 1 -> /dev/pts/0 lrwx------ 1 root root 64 Dec 9 20:53 2 -> /dev/pts/0 lrwx------ 1 root root 64 Dec 9 20:53 255 -> /dev/pts/0 lr-x------ 1 root root 64 Dec 9 20:53 3 -> /test [root@node12 fd]# |
ps:是用来打印当前Linux进程的
查询进程并且过滤:
ps -fe | grep nginx
重定向:
TCP连接是双向的,有两个I/O,有输入和输出
查询进程,使用grep进行过滤
ps -fe | grep nginx
重定向:
[root@node12 fd]# exec 1>& 8
-bash: 8: Bad file descriptor
[root@node12 fd]# exec 8>& 1
[root@node12 fd]# exec 1>& /dev/pts/1
或者:
将重定向正确输出:
[root@node12 fd]# exec 1>& /dev/pts/0
重定向:
将错误重定向输出:
[root@node12 ~]# ls -l /god 2> ls1.out
分别将正确的和错误的输出:
[root@node12 ~]# ls -l / /god 1> ls2.out 2> ls3.out
将正确输出和错误输出追加到同一个文件中:
[root@node12 ~]# ls -l / /god 1>ls9.out 2>&1
默认情况下就是将正确输出和错误输出重定向到一个文件中:
[root@node12 ~]# ls -l / /god >&ll0.out
总之:
输出流有标准输出和错误输出
标准输出为1
错误输出为2
一个>是覆盖,两个>是追加
Echo是指输出:
[root@node12 ~]# echo "hello linux"
hello linux
[root@node12 ~]# echo $$
16177
[root@node12 ~]# read sxt
asdfghjkl
[root@node12 ~]# echo $sxt
asdfghjkl
[root@node12 ~]#
Read是指readline
输入重定向操作
<<<会重定向将一个输入放到一个流里边去
[root@node12 ~]# read sdf 0<<<"hello sxt"
[root@node12 ~]# echo sdf
sdf
[root@node12 ~]# echo $sdf
hello sxt
[root@node12 ~]#
重定向第二种:
[root@node12 ~]# read sxt 0<<ooxx
> sdfsflkjdsls
> sldkjfls
> sjkdlfsdkf
> \sjkdfds
> \jsjdfs
> ooxx
[root@node12 ~]# echo $sxt
sdfsflkjdsls
[root@node12 ~]#
这种情况是首位呼应的
<<<是指将一行字符串放到一个流中,打印输出
<<是指将多行字符串放到一个流中,打印输出
[root@node12 ~]# cat test.sh
cat 0<<ooxx
jflksjdfsld
jlkgjdslkfjs
jalkjflkdsjf9088432098583094
jofajdsflksd
ooxx
[root@node12 ~]# . test.sh
jflksjdfsld
jlkgjdslkfjs
jalkjflkdsjf9088432098583094
jofajdsflksd
[root@node12 ~]#
变量和作用域
在定义变量和函数的时候,当函授执行只有,变量才会生效
[root@node12 ~]# ooss(){
> sxt1=100
> sxt2=200
> echo $sxt1
> echo $sxt2
> }
[root@node12 ~]# echo $sxt1
[root@node12 ~]# echo $sxt2
[root@node12 ~]# ooss
100
200
[root@node12 ~]# echo $sxt1
100
[root@node12 ~]# echo $sxt2
200
[root@node12 ~]# ooss
100
200
[root@node12 ~]#
脚本的书写与传参:
[root@node12 ~]# ./sxt1.sh a b c d e f g h i j k l m n
a
b
c
d
e
a1
14
a b c d e f g h i j k l m n
a b c d e f g h i j k l m n
[root@node12 ~]# cat sxt1.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
echo $11
echo $#
echo $*
echo $@
[root@node12 ~]#
打印进程id
Echo $$
管道接more是为了显示的
[root@node12 ~]# echo $BASHPID | more
16532
[root@node12 ~]#
赋值
[root@node12 ~]# vi sxt02.sh
[root@node12 ~]# cat sxt02.sh
echo $sxt02
[root@node12 ~]# sxt02=good
[root@node12 ~]# echo $sxt02
good
[root@node12 ~]# source sxt02.sh
good
[root@node12 ~]# /bin/bash sxt02.sh
[root@node12 ~]# export sxt02
[root@node12 ~]# /bin/bash sxt02.sh
good
[root@node12 ~]#
父进程与子进程
检查程序上次退出是的状态,是正确的退出还是错误的退出。
echo $?
读取第8行的内容
[root@node12 ~]# head -8 /etc/profile | tail -1
# /etc/profile.d/ to make custom changes to your environment, as this
[root@node12 ~]#
Linux系统中输出,计算,以及重定向
[root@node12 ~]# echo $?
2
[root@node12 ~]# y=$((8+7))
[root@node12 ~]# echo $y
15
[root@node12 ~]# a=1
[root@node12 ~]# b=2
[root@node12 ~]# echo $(a+b)
-bash: a+b: command not found
[root@node12 ~]# echo $a
1
[root@node12 ~]# echo $b
2
[root@node12 ~]# test 3 -gt 2
[root@node12 ~]# echo $?
0
[root@node12 ~]# test 3 -gt 8
[root@node12 ~]# echo $?
1
[root@node12 ~]# test 3 -gt 8 && echo ok
[root@node12 ~]# test 3 -gt 2 && echo ok
ok
[root@node12 ~]# [3 -gt 2 ] && echo ok
-bash: [3: command not found
[root@node12 ~]# [ 3 -gt 2 ] && echo ok
ok
[root@node12 ~]#
查看一个用户是否添加成功了:
①推出去登录
②查看这个用户的元数据
[root@node12 ~]# chmod +x userAdd.sh
[root@node12 ~]# ./userAdd.sh ooxx
user add ok...
[root@node12 ~]# echo $?
0
[root@node12 ~]# id ooxx
uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)
[root@node12 ~]# cat userAdd.sh
#!/bin/bash
useradd $1
echo $1 | passwd --stdin $1 >& /dev/null
echo "user add ok..."
[root@node12 ~]#
重新修改之后:
[root@node12 ~]# vi userAdd.sh
[root@node12 ~]# ./userAdd.sh ooxx
[root@node12 ~]# echo $?
0
[root@node12 ~]# id ooxx
uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)
[root@node12 ~]# vi userAdd.sh
[root@node12 ~]# ./userAdd.sh oxox
[root@node12 ~]# echo $?
1
[root@node12 ~]# ./userAdd.sh
args ...error...
[root@node12 ~]# cat userAdd.sh
#!/bin/bash
[ $# -eq 1 ] || echo "args ...error..." && exit 1
useradd $1
echo $1 | passwd --stdin $1 >& /dev/null
echo "user add ok..."
[root@node12 ~]#
添加用户等脚本编程中,能尽量使用&&的时候就尽量使用&&,避免使用||
[root@node12 ~]# cat userAdd.sh
#!/bin/bash
[ ! $# -eq 1 ] && echo "args ...error..." && exit 1
useradd $1
echo $1 | passwd --stdin $1 >& /dev/null
echo "user add ok..."
[root@node12 ~]# ./userAdd.sh ooxx
useradd: user 'ooxx' already exists
user add ok...
[root@node12 ~]# echo $?
0
[root@node12 ~]# id ooxx
uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)
[root@node12 ~]#
这个例子是为了避免在执行脚本的时候会传进去好几个参数的案例
以下的例子是为了避免在传参进行创建用户的时候,这个用户存在
[root@node12 ~]# cat userAdd.sh
#!/bin/bash
[ ! $# -eq 1 ] && echo "args ...error..." && exit 1
id $1 >& /dev/null && echo "user exist..." && exit 2
useradd $1
echo $1 | passwd --stdin $1 >& /dev/null
echo "user add ok..."
[root@node12 ~]# ./userAdd.sh ooox
user add ok...
[root@node12 ~]# echo $?
0
[root@node12 ~]# ./userAdd.sh ooox
user exist...
[root@node12 ~]# echo $?
2
[root@node12 ~]#
验证是否有权限添加新的用户
[root@node12 ~]# cat userAdd.sh
#!/bin/bash
[ ! $# -eq 1 ] && echo "args ...error..." && exit 1
id $1 >& /dev/null && echo "user exist..." && exit 2
useradd $1 && echo $1 | passwd --stdin $1 >& /dev/null && echo "user add ok..."
&& exit 0echo "wo ye bu zhi dao ..." && exit 8
[root@node12 ~]# cp userAdd.sh /tmp
[root@node12 ~]# ll /home/
total 16
drwx------ 3 ooox ooox 4096 Dec 11 12:00 ooox
drwx------ 3 oxox oxox 4096 Dec 11 11:58 oxox
drwx------ 2 sxt01 sxt01 4096 Dec 9 08:06 sxt01
drwx------ 2 sxt02 sxt02 4096 Dec 9 08:06 sxt02
[root@node12 ~]# su ooox
[ooox@node12 root]$ cd /tmp
[ooox@node12 tmp]$ ll
total 8
drwxr-xr-x 2 root root 4096 Dec 11 07:11 hsperfdata_root
-rwxr-xr-x 1 root root 246 Dec 11 12:07 userAdd.sh
-rw-------. 1 root root 0 Nov 4 04:11 yum.log
[ooox@node12 tmp]$ ./userAdd.sh oooo
./userAdd.sh: line 5: /usr/sbin/useradd: Permission denied
wo ye bu zhi dao ...
[ooox@node12 tmp]$
使用if进行命令行的形式写脚本:
[root@node12 ~]# if ls -l / >& /dev/null;then echo "ok" ; else echo "no ok" ; f
I
ok
[root@node12 ~]# if [ 3 -gt 2 ]; then echo ok;fi
ok
[root@node12 ~]#
使用while进行命令行写脚本:
[root@node12 ~]# mkdir /god
[root@node12 ~]# while ls -l /god ; do echo ok; rm -fr /god ;done
total 0
ok
ls: cannot access /god: No such file or directory
[root@node12 ~]#
For循环语句在脚本中的使用:
[root@node12 ~]# help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
Execute commands for each member in a list.
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
Exit Status:
Returns the status of the last command executed.
[root@node12 ~]# for ((i=0;i<4;i++)); do echo $i ; done
0
1
2
3
[root@node12 ~]#
算数表达式中使用(()),这时候不需要在写之前加上$取值
[root@node12 ~]# for i in bjsxt tysxt szsxt shsxt gssxt; do echo $i ; done
bjsxt
tysxt
szsxt
shsxt
gssxt
[root@node12 ~]# for i in bjsxt tysxt szsxt [shsxt gssxt]; do echo $i ; done
bjsxt
tysxt
szsxt
[shsxt
gssxt]
[root@node12 ~]# for i in bjsxt tysxt szsxt {shsxt gssxt}; do echo $i ; done
bjsxt
tysxt
szsxt
{shsxt
gssxt}
[root@node12 ~]#
反引号的级别高于for的级别
[root@node12 ~]# for i in ls ; do echo $i ;done
ls
[root@node12 ~]# for i in ` ls ` ; do echo $i ; done
}
$
anaconda-ks.cfg
echo
httpd-2.2.15-59.el6.centos.x86_64.rpm
install.log
install.log.syslog
ll0.out
ls1.out
ls2.out
ls3.out
ls3.out[root@node12
ls5.out
ls6.out
ls9.out
ls.out
sh01.sh
soft
sxt02.sh
sxt1=100
sxt1.sh
sxt2=200
sxt.txt
test.sh
test.txt
userAdd.sh
[root@node12 ~]#
案例练习:
Df:查看磁盘的分配情况
du -s:求和
du -a:统计给出的目录下所有文件以及所有目录的大小
du -sh ./:查看指定目录下文件的大小
[root@node12 ~]# du -sh ./
164M ./
[root@node12 ~]#
找出一行中的最大的文件
[root@node12 ~]# cat findMax.sh
#!/bin/bash
oldIFS=$IFS
IFS=$'\n'
for i in `du -a $1 | sort -rn`;do
echo $i
fileName=$(echo $i | awk '{print $2}')
if [ -f $fileName ];then
echo $fileName
exit 0
fi
done
IFS=$oldIFS
echo " n f "
exit 1
[root@node12 ~]# ./findMax.sh ./
167716 ./
166776 ./soft
123884 ./soft/jdk-7u67-linux-x64.rpm
./soft/jdk-7u67-linux-x64.rpm
[root@node12 ~]#
求最大的值
[root@node12 ~]# ./test.sh
a 1
b 2
c 3
num:3
[root@node12 ~]# cat readFile.txt
a 1
b 2
c 3
[root@node12 ~]# cat test.sh
#!/bin/bash
#这个是对词做切分
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat readFile.txt` ;do
echo $i
((num++))
done
echo num:$num
#用完了之后需要恢复
IFS=$oldIF
[root@node12 ~]# ./test.sh
a 1
b 2
c 3
num:3
[root@node12 ~]#
统计文件的行数:
[root@node11 ~]# wc -l /etc/profile
82 /etc/profile
[root@node11 ~]# cat /etc/profile | wc -l
82
[root@node11 ~]#
在循环语句中for的第二种使用方法:
[root@node12 ~]# cat readFile.txt
a 1
b 2
c 3
[root@node12 ~]# cat test.sh
#!/bin/bash
#这个是对词做切分
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat readFile.txt` ;do
echo $i
((num++))
done
echo num:$num
#用完了之后需要恢复
IFS=$oldIF
echo "---------------------------------"
#使用步进的方式进行书写
num=0
lines=`cat readFile.txt | wc -l`
for ((i=1;i<=lines ; i++));do
line=`head -$i readFile.txt | tail -1`
echo $line
((num++))
done
echo num:$num
[root@node12 ~]# ./test.sh
a 1
b 2
c 3
num:3
---------------------------------
a 1
b 2
c 3
num:3
[root@node12 ~]#
通过改变流的指向的方式进行改变流的输入
[root@node12 ~]# cat readFile.txt
a 1
b 2
c 3
[root@node12 ~]# cat haha.sh
#!/bin/bash
#在这里只是改变了一个指向
exec 0< readFile.txt
read line
echo $line
read line
echo $line
read line
echo $line
[root@node12 ~]# ./haha.sh
a 1
b 2
c 3
[root@node12 ~]#
Shell脚本编程中的总结:
1,花括号 mkdir -p sdfsdf/{a,b,c}sdfsdf
2,波浪线 cd ~god
3,变量&参数 $ $$ ${}(.....)
4,命令替换 ls -l `echo $path`
5,算术扩展 num=$((3+4))
6,word拆分,$IFS
7,路径 *(零到多个任意字符)?
8,引用删除 echo "hello"
*,重定向 >
man bash
$@和$*的区别:
[root@node12 ~]# cat readFile.txt
a 1
b 2
c 3
[root@node12 ~]# cat test.sh
#!/bin/bash
#这个是对词做切分
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat readFile.txt` ;do
echo $i
((num++))
done
echo num:$num
#用完了之后需要恢复
IFS=$oldIF
echo "---------------------------------"
#使用步进的方式进行书写
num=0
lines=`cat readFile.txt | wc -l`
for ((i=1;i<=lines ; i++));do
line=`head -$i readFile.txt | tail -1`
echo $line
((num++))
done
echo num:$num
#以下是while循环语句
echo "++++++++++++++++++++++++++"
num=0
while read line ;do
echo $line
((num++))
done < readFile.txt
echo "=================================="
num=0
exec 0< readFile.txt
while read line;do
echo $line
done
echo num:$num
echo "*************************************"
export num=0
#管道后边的内容是在子进程中的
cat readFile.txt | while read line ;do
echo $line
((num++))
done
echo num:$num
echo "##################################"
echo $@
echo $*
echo "@"
for i in "$@";do
echo $i
done
echo "*"
for i in "$*";do
echo $i
done
[root@node12 ~]# ./test.sh a b c d e f
a 1
b 2
c 3
num:3
---------------------------------
a 1
b 2
c 3
num:3
++++++++++++++++++++++++++
a 1
b 2
c 3
==================================
a 1
b 2
c 3
num:0
*************************************
a 1
b 2
c 3
num:0
##################################
a b c d e f
a b c d e f
@
a
b
c
d
e
f
*
abcdef
[root@node12 ~]#