linux截取命令
脚本在ubuntu下测试有问题dpkg-reconfigure dash更改默认的shell
cut ,grep等这些截取命令通过是对ASCII格式码一行一行的数据进行处理,并不是对整个block段进行处理的
环境变量档案的加载顺序
先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦
会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取
~/.bash_profile 及 ~/.bashrc 等档案
**一般把自定义的alias,变量等放到 ~/.bashrc下因为这样每次shell执行的时候都会去读取这个文件 ~/.bashrc**
跳脱字符 '\' 有什么作用
\ 这个跳脱字符dos下叫转义字符,会把比如Enter回车键, $ 等这些特殊字符转换为普通字符,加上 \ 后再Enter后命令不会再执行了
// dos下去掉 \r
cat /home/test/dostxt | tr -d '\r' > dostxt-noM
CRLF -- Carriage-Return Line-Feed 回车换行。
CR:回车,ASCII 13, \r,
LF:换行,LF, ASCII 10, \n。
DOS(windows)下使用 \r\n 换行, linux使用 \n 换行。
DOS(windows)断行字符 ^M$, linux仅有 $
如果linux下shell文件包含^M字符,则无法执行,需要去掉 \r
正如我们常说的linux实际上是指linux kernel核心,因此dos也就是windows的核心,windows是在dos的核心上架构起来的
ls -al / |split -l 10 - lsroot
-rw-r--r-- 1 root root 483 Dec 1 17:36 lsrootaa
-rw-r--r-- 1 root root 494 Dec 1 17:36 lsrootab
-rw-r--r-- 1 root root 277 Dec 1 17:36 lsrootac
- 的用法
- 代表stdin/stdout ,当没有标准stdin/stdout时,那个-就代表标准stdin/stdout[ls -al / 的执行输出结果]
root@test-month:/tmp/umaskdemo# tar cvf - ccxx/ |tar xvf -
ccxx/
ccxx/
xargs用法 [对stdout标准输出再执行某些命令进行操作]
xargs 可以读入 stdin的数据,并且以空格符或断行字符作为分辨将 stdin 的资料分隔成为 arguments.如果所要处理的stdin有空格或换行等特殊字符的时候要加-0参数
-0: 如上所说有空格或换行等特殊字符的时候保留
-p: 执行命令前询问
-i: -i与{}搭配 把前边输出的小处理块放到{}中
为什么需要xargs?
例子1 : /tmp/umaskdemo中寻找 -f 的文件并删除
rm -rf `find /tmp/umaskdemo -type f`
or
find /tmp/umaskdemo -type f -exec rm -rf {} \;#这里的 \ 即跳脱字符\不能少, ; 分号表示结束也不能少
这样如果/tmp/umaskdemo下文件比较少的时候没有问题,如果一旦文件非常多可能会出错,因为rm 只能接受有限数量的参数。如果您的参数列表超出该限制怎么办
说明: xargs 这个命令也是后置引用的一个强有力的替换.在一般使用过多参数的命令替换失败的时候,用xargs来替换它一般都能成功
改进如下:
//每次处理四个文件,并询问
find /tmp/umaskdemo -type f |xargs -pn4 rm -rf
root@test-month:/tmp/umaskdemo# find /tmp/umaskdemo -type f |xargs -pn2 rm -rf
rm -rf /tmp/umaskdemo/a5 /tmp/umaskdemo/a3 ?...y
rm -rf /tmp/umaskdemo/a6 /tmp/umaskdemo/a2 ?...y
rm -rf /tmp/umaskdemo/a1 /tmp/umaskdemo/a4 ?...n
//快速重命名大量文件
ls |xargs -i mv {} {}.bak
-rw-r--r-- 1 root root 23 Dec 2 11:23 cc.txt.bak
-rw-r--r-- 1 root root 43 Dec 2 11:23 xx.txt.bak
只改文件名
find /tmp/umaskdemo -type f |xargs -i mv {} {}buffer
root@test-month:/tmp/umaskdemo# file * |cut -d ':' -f1 |xargs wc -l
3 cc.txt
3 xx.txt
6 total
root@test-month:/tmp/umaskdemo# cat xx.txt
/bin tao shou kun
root@test-month:/tmp/umaskdemo# cat xx.txt |xargs
/bin tao shou kun
root@test-month:/tmp/umaskdemo# cat xx.txt |xargs -E 'shou'
/bin tao
root@test-month:/tmp/umaskdemo# cat xx.txt |xargs -p
/bin/echo /bin tao shou kun ?...y
/bin tao shou kun
xargs的理解:
代码:
echo "--help"|cat --> --help
echo "--help"|xargs cat -->等于 cat --help 回车
管道符 | 所传递给程序的不是你简单地在程序名后面输入的参数,它们会被
程序内部的读取功能如scanf和gets等接收,而xargs则是将内容作为普通的参数传递给程序
管道符后不加xargs相当于先将xargs后面的命令回车执行一下再从键盘里输入管道符前面命令执行的结果内容
加上xargs 相当于直接从键盘输入管道符前面命令执行的结果内容再回车
root@test-month:/tmp/umaskdemo# find ./ -type f |cat
./xx.txt.bak
./cc.txt.bak
root@test-month:/tmp/umaskdemo# find ./ -type f |xargs cat
/bin tao shou kun
linux is very good
hello
nux a
linux is good
hi
linux正则表达式 Regular_Expression
正则表达式与shell 通配符[又叫万用符]有很多都用一个字符来表示如 * ?等,下边列出其区别
万用符
符号 | 说明
---|---
- | 代表0个或多个字符[a-zA-Z0-9..],及@等特殊字符
? | 代表一定有一个[a-zA-Z]但不包括@等特殊字符
\ | 跳脱字符用来转义
| | 管道命令
; | 连续下达命令即第一个执行完再执行;后边的
&& | 表示前边成功再执行后边的,用在命令行,区别与shell script
|| | 表示前边失败才执行后边的,用在命令行,区别与shell script
~ | 家目录
$ | 表示引用变量
& | 在背景下工作
! | 表示非的意思 ls -al a[!1-5] ,即不是a1 ,a2这样的
/ | 路径分割符
' | 单引号
" | 双引号,可以输出变量
`` | 先执行命令如 cd /lib/modules/`uname -r`/kernel 可以用$代替 cd /lib/modules/$(uname -r)/kernel
[] | 写shell作为条件判断的情况很常用
{} | 区块的组合如 echo ${variable} 即 echo $variable,再如 find / -type f -exec rm -rf {} ;再如 cp -a /tmp/{demo,aa} /tmp/test : 把/tmp下的aa文件及demo目录拷贝到/tmp/test目录下
() | 用在shell的起始与结束 如shell中计算时候会用 total=$(($firstnu*$secnu))
正则表达式 Regular Expression
基础符号 | 说明
---|---
[] | 表示范围集合[ae]表示有a或e,[a-z]表示范围,取a-z中的一个字符
^ | 分情况: 1用在集合[]中表示非 [^a-zA-Z] 表示非字母 2 用在其它地方表示开头如 ^[^a-zA-Z] 表示以数字开头, ^# 表示以#开头
$ | 表示结尾,如空白行表示为 ^$,即只有开始结束符号,中间没有东东
. | 表示任意一个字符,[a-zA-Z0-9]及$%&等 '^g.$d' -> gd, gxd x表示任意字符 echo god|grep '^g.d$'
'' | 为了表达加了单引号, 表示重复前一个RE字符0次或N次, 'good' -> god, good ,goood
'.*' | 为了表达加了单引号,组合起来表示任意字符,连续n个都可以
{} | 表示连续个RE的范围 'go{2,5}d' ,表示g后边连续2个到5个o再接一个d字符{2,}表示两个以上
延伸符号要用在支持延伸符号的工具上如 egrep(grep -E) ,awk,sed等
延伸符号 | 说明
---|---
- | 表示一个或一个以上前一个RE字符 'go+d' -->god ,good, goood....
? | 表示0个或一个 'go?d' --> gd,god
| | 表示二选一 'gd|good|dog' 表示有gd ,或有good,或有dog的行
() | 表示群组的概念 'g(la|oo)d' --> glad 或 good
echo 1120ooo09101000 |grep '[0-9]\{8\}'
[0-9]\{8\}:数字出现8次,这个数字是0-9中的任意一个数字,而不是0-9中某个数字重复出现8次
再理解一下:[0-9]\{8\}可以看作是 [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] 八个数字,而每个数字都是[0-9]随机一个
sed 用法
-i :表示直接修改源文件,而不输出到屏幕(比较危险要注意)
root@changda:/tmp# ifconfig eth0|grep 'inet addr'|cut -d ':' -f2
198.199.103.232 Bcast
root@changda:/tmp# ifconfig eth0|grep 'inet addr' | sed -e 's/^.*addr://g' |sed -e 's/Bcast.*$//g'
198.199.103.232 #这后边会有个空格
root@changda:/tmp# ifconfig eth0|grep 'inet addr'|awk '{print $2}'|sed -e 's/addr://g'
198.199.103.232 #后边没有空格
root@changda:/tmp# cat /etc/manpath.config |grep 'MAN'|grep -v '^#'
cat /etc/manpath.config |grep 'MAN'|grep -v '^#'
cat /etc/manpath.config |grep 'MAN'|sed 's/#.*$//g' | sed '/^$/d' # 删除匹配行
删除匹配行
sed -i '/匹配字符串/d' filename # //之间为匹配字符串
awk 用法(用在分段上,不像cut要分割,这个直接用在分段上)
root@changda:/tmp# cat /etc/passwd |awk 'BEGIN {FS=":"} $3 < 10 {print $1 "----" $3}'
root----0
daemon----1
bin----2
sys----3
sync----4
games----5
man----6
lp----7
mail----8
news----9
root@changda:/tmp# cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}; NR>=2{total=$2+$3+$4
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 20000 23000 64000.00
Bird2 43000 42000 41000 126000.00
命令很长时用;或回车上边的命令也可以写成下边的
cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}; NR>=2{total=$2+$3+$4;printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
1. awk中的{}动作,如果需要多个指令辅助时,可用;或Enter
2. 逻辑运算中用==而不是=
3. 格式化输出的时候,printf设定当中用\n来换行
4. awk中的变量不需要加入$不像bash shell中的变量要加$
实例:
迁移网站的时候一次迁移很多,要当天迁的网站列表 如下
显示行号
ll -rt|grep 'Dec 15'|grep -v '\./'|cat -n|grep '[a-z]\{1,20\}\..*\{1,7\}'|awk '{print $10}'
精简
ll -rt|grep 'Dec 15'|grep -v '\./'|awk '{print $9}'
去掉末尾的/,如 crusher.com/
ll -rt|grep 'Dec 15'|grep -v '\./'|awk '{print $9}'|sed -e 's/\///g'
又写了一次
ll -rt|grep 'Dec 15'|grep -v '\.\/'| awk '{print $9}'|sed -e 's/\///g'
diff的用法
diff file.new file.old
root@changda:/tmp# diff expatch.new expatch.old
2c2
< echo "postmap -q - regexp:header_checks < header_checks This's right"
---
> echo "postmap -q - regexp:header_checks < header_checks"
4c4
< echo "postmap -q - regexp:body_checks < body_checks This's right"
---
> echo "postmap -q -regexp:body_checks < body_checks"
6d5
< this is a new line
root@changda:/tmp# diff expatch.old expatch.new
2c2#前一个文件的第2行与第二个文件的第二行比有变化
< echo "postmap -q - regexp:header_checks < header_checks"
---
> echo "postmap -q - regexp:header_checks < header_checks This's right"
4c4 #前一个文件的第四行与第二个文件的第四行比有变化
< echo "postmap -q -regexp:body_checks < body_checks"
---
> echo "postmap -q - regexp:body_checks < body_checks This's right"
5a6 #第一个文件第一行的位置增加下边这一行
> this is a new line #表示前边文件比后边文件少一行
diff的normal显示格式有三个
a --add 表示增加一行与另一个文件一样
c --change 表示本行有变化
d --delete表示删除这一行与另一个文件一样
实现并排输出两个文件
root@changda:/tmp# diff expatch.new expatch.old -y -W 50
echo "check your post echo "check your post
echo "postmap -q - re | echo "postmap -q - re
postmap -q - regexp:h postmap -q - regexp:h
echo "postmap -q - re | echo "postmap -q -reg
postmap -q - regexp:b postmap -q - regexp:b
this is a new line <
|表示不同的地方
< 表示前边文件比后边文件多一行[记忆:<反而是多,反着记]
> 表示前边文件比后边文件少一行[记忆:>反而是少,反着记]
上下文输出格式
root@changda:/tmp# diff expatch.new expatch.old -c
*** expatch.new 2016-12-14 02:33:57.388111560 +0000
--- expatch.old 2016-12-14 02:15:59.658071134 +0000
***************
*** 1,6 ****
echo "check your postfix's body and header drop settings"
! echo "postmap -q - regexp:header_checks < header_checks This's right"
postmap -q - regexp:header_checks < header_checks
! echo "postmap -q - regexp:body_checks < body_checks This's right"
postmap -q - regexp:body_checks < body_checks
- this is a new line
--- 1,5 ----
echo "check your postfix's body and header drop settings"
! echo "postmap -q - regexp:header_checks < header_checks"
postmap -q - regexp:header_checks < header_checks
! echo "postmap -q -regexp:body_checks < body_checks"
postmap -q - regexp:body_checks < body_checks
上边列出第一个文件:6行[1,6]行的内容
下边列出第二个文件:5行[1,5]行的内容
!表示两者不同
-表示上边文档减去一行与下边一样即比下边文件多一行
+表示上边文档加一行与下边一样即比下边文件少一行
统一格式输出:
root@changda:/tmp# diff expatch.new expatch.old -u
--- expatch.new 2016-12-14 02:33:57.388111560 +0000
+++ expatch.old 2016-12-14 02:15:59.658071134 +0000
@@ -1,6 +1,5 @@
echo "check your postfix's body and header drop settings"
-echo "postmap -q - regexp:header_checks < header_checks This's right"
+echo "postmap -q - regexp:header_checks < header_checks"
postmap -q - regexp:header_checks < header_checks
-echo "postmap -q - regexp:body_checks < body_checks This's right"
+echo "postmap -q -regexp:body_checks < body_checks"
postmap -q - regexp:body_checks < body_checks
-this is a new line
@@这之间是说第一个文件从1到6行,第二个文件是从1到5行@@
行前没有特殊标记的是一样的
-表示这一行所在的文件比下边+号所在的文件内容多一些字符
+表示这一行所在的文件比上边-号所在的文件这一行少一些字符
-表示上边文件比下边文件多这一行
diff打补丁
root@changda:/tmp# diff -Naur expatch.old expatch.new > expatch.patch
补丁内容就是diff file1 file2 -u 达成的
root@changda:/tmp# cat expatch.patch
--- expatch.old 2016-12-14 02:15:59.658071134 +0000
+++ expatch.new 2016-12-14 02:33:57.388111560 +0000
@@ -1,5 +1,6 @@
echo "check your postfix's body and header drop settings"
-echo "postmap -q - regexp:header_checks < header_checks"
+echo "postmap -q - regexp:header_checks < header_checks This's right"
postmap -q - regexp:header_checks < header_checks
-echo "postmap -q -regexp:body_checks < body_checks"
+echo "postmap -q - regexp:body_checks < body_checks This's right"
postmap -q - regexp:body_checks < body_checks
+this is a new line
打补丁
patch -p0 < expatch.patch #也可以不要参数因为就是要把补丁打到当前文件夹的文件中
更新的时候肯定是没有新文件expatch.new的,把这个文件删除了演示
root@changda:/tmp# patch < expatch.patch
patching file expatch.old
patch的用法
tmp/old/passwd , tmp/new/passwd
cd /tmp:
patch -p1 < /tmp/test.patch
p1代表pass几层目录的意思,如果在最深一层目录,则-p参数可以省略,直接用patch即可
diff的时候要在相对相同的路径下,比如这里都在/tmp目录下建立new /old目录
Shell Scripts学习
Shell中调用 引用 包含另一个脚本或文档的三种方法
- 使用source ,如source /etc/lsb/init-functions
- 使用., 如 . /etc/lsb/init-functions
- 若是可执行文件用sh sh /etc/init.d/atd
- 注意source与.同时具有重新加载的意思 . ~/.bashrc source ~/.bashrc
root@changda:/etc/init.d# service nginx
Usage: /etc/init.d/nginx {start|stop|force-quit|restart|reload|status|configtest}
见 /etc/init.d/nginx* 这其实是一个shell scripts,里边用case列出用户输入的参数情况并加以判断
test后边跟的参数如 -nt , -lt , -r ,-w ,-x,-g, -u, -a, -o, !,-z ,-n, == ,!=,-e ,-f ,-d ,-S,-p,-b,-c等这些用在shell编程中都可以用,不加test
//前边的为true才会执行&&后边的,前边为false,则执行||后边的
root@changda:/tmp/scrpits# [ sh13.sh -nt sh12.sh ]&&echo "yes"||echo "no"
yes
**直接输入sh13.sh这样就是直接在当前目录下寻找sh13.sh了**
root@changda:/tmp/scrpits# [ -r sh10.sh -a -x sh10.sh ]&&echo "yes"||echo "no"
no
root@changda:/tmp/scrpits# [ -r sh10.sh -o -x sh10.sh ]&&echo "yes"||echo "no"
yes
root@changda:/tmp/scrpits# [ -r sh10.sh ]&&echo "yes"||echo "no"
yes
root@changda:/tmp/scrpits# [ ! -r sh10.sh ]&&echo "yes"||echo "no"
no
当前目录有一级子目录的文件权限遍历
#! /bin/sh
read -p "input a directory:" dir
if [ "$dir" == "" ] || [ ! -d "$dir" ]; then
echo "The directory $dir is not exist"
exit 1
fi
filelist=`ls $dir`
for filename in $filelist
do
if [ -d "$filename" ]; then
subfilelist=`ls $filename`
for subfilename in $subfilelist
do
perm=""
test -r "$dir/$filename/$subfilename"&&perm="$perm readable"
test -w "$dir/$filename/$subfilename"&&perm="$perm writable"
test -x "$dir/$filename/$subfilename"&&perm="$perm executable"
echo "The file $dir/$filename/$subfilename's permission is [$perm]"
done
continue
fi
perm=""
test -r "$dir/$filename"&&perm="$perm readable"
test -w "$dir/$filename"&&perm="$perm writable"
test -x "$dir/$filename"&&perm="$perm executable"
echo "The file $dir/$filename's permission is [$perm]"
done
格式化输出 /etc/passwd
root@changda:/tmp/scrpits# cat -n /etc/passwd|cut -d ":" -f1|awk '{print "The " $1 " account is " $2 }'
The 1 account is root
The 2 account is daemon
The 3 account is bin
The 4 account is sys
The 5 account is sync
The 6 account is games
.
..
...
//用shell scripts
#! /bin/bash
accounts=`cat /etc/passwd |cut -d ":" -f1`
declare -i i=0
for account in $accounts
do
i=$(($i+1))
#declare -i i=$i+1 这样也可以
echo "The $i account is \"$account\" "
done
Linux帐号与身份管理
useradd 用法
新建帐户全部参数默认
root@changda:/home# useradd -m vbird11
root@changda:/home# ll
total 20
drwxr-xr-x 5 root root 4096 Dec 6 14:54 ./
drwxr-xr-x 22 root root 4096 Nov 9 09:24 ../
drwxr-xr-x 2 vbird11 vbird11 4096 Dec 6 14:54 vbird11/
drwxrwxrwx 2 root root 4096 Dec 6 12:54 wwwlogs/
drwxr-xr-x 4 root root 4096 Dec 6 12:54 wwwroot/
root@changda:/home# grep vbird11 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird11:x:1003:1003::/home/vbird11:
/etc/shadow:vbird11:!:17141:0:99999:7::: #密码部分显示为!即不能登录
/etc/group:vbird11:x:1003:
passwd vibrd11 更改vbird11的密码,更改成功后就可以vibrd11登录系统了
/etc/passwd中 vbird11:x:1003:1003::/home/vbird11:/bin/bash #shell默认是/bin/bash可以省略
若改为 vbird11:x:1003:1003::/home/vbird11:/usr/sbin/nologin 则就登录不了了
新建帐户指定参数
useradd -m -u 700 -g users vbird2
root@changda:/etc/skel# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:700:100::/home/vbird2:
/etc/shadow:vbird2:!:17141:0:99999:7:::
新建立一个帐户可能修改的地方有:
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
/home/username
因此帐户管理是非常复杂的过程
useradd使用的参考档案
1. /etc/passwd中的值会参考 /etc/default/useradd
2. 群组参考依据
- ubuntu等在没有指定initial group的情况下,默认建立一个与主帐户相同的群组名称作为initial group
- suSE等会以/etc/default/useradd内的group的设定值作为initial group
3. 家目录的内容参考 `/etc/skel/星 ` 里边的,直接拷贝过去 #星代表(*)
4. uid/gid是参考 /etc/login.defs里边的
/etc/gshadow使用
/etc/gshadow这个文件也很重要,如在/etc/group中直接添加成员,在用groups的时候不会显示这个群组
这个 /etc/gshadow 的密码提供,大的功能是在于『 让那些不在群组中的成员,临时加入该群组用的。 』
实际上使用的情况是很少的~而如果真的要操作这样的环境,那就得要熟悉 newgrp
的用法啰!而且还要提供某个群组的密码出来,真是不好管理。不如直接使用chown uid:gid 更改方便
usermod使用
usermod -d /home/vbird3 -m vbird3 这个在ubuntu下不能重新建立家目录
usermod -md /home/vbird11demo vbird11 而可以修改已经存在的家目录,相当于mv动作
userdel 使用
先查找相关的东东
root@changda:/home# find / -user vbird11
/home/vbird11demo
/home/vbird11demo/.profile
/home/vbird11demo/.bash_logout
/home/vbird11demo/.cloud-locale-test.skip
/home/vbird11demo/.bashrc
/home/vbird11demo/.cache
/home/vbird11demo/.cache/motd.legal-displayed
/home/vbird11demo/.bash_history
/sys/fs/cgroup/systemd/user/1003.user/64.session
/sys/fs/cgroup/systemd/user/1003.user/64.session/tasks
/sys/fs/cgroup/systemd/user/1003.user/64.session/cgroup.procs
find: `/proc/23970/task/23970/fd/5': No such file or directory
find: `/proc/23970/task/23970/fdinfo/5': No such file or directory
find: `/proc/23970/fd/5': No such file or directory
find: `/proc/23970/fdinfo/5': No such file or directory
/run/user/1003
先删除这些地方的东东再
再 userdel -r vbird11 就可以了
一般使用者功能 : chfn , chsh
//centos测试结果,ubuntu没有结果
[root@changda vbird1]# chsh -l
/bin/sh
/bin/bash
/sbin/nologin
在vibrd11这个帐户下
vbird11@changda:~$ chsh -s /bin/dash
Password:
chsh: PAM: Authentication failure
失败,不知道什么原因,ubuntu下有问题,而centos下测试可以
chfn这个依赖于finger这个程序,这个程序不安全,系统默认没有安装就不完了,有需要再玩吧
vbird11@changda:~$ id vbird11
uid=1003(vbird11) gid=1003(vbird11) groups=1003(vbird11)
groups这个指当前帐户vbird11所在的所有有效群组
groupadd 使用
-g : group的id
-r : 建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关
root@changda:/tmp# grep group3 /etc/group /etc/gshadow
/etc/group:group3:x:1023:
/etc/gshadow:group3:!::
root@changda:/tmp# grep group3 /etc/group /etc/gshadow
/etc/group:group3:x:1023:
/etc/gshadow:group3:!::
groupmod使用
root@changda:/tmp# groupmod -g 1028 -n group3demo group3
root@changda:/tmp# grep group3 /etc/group /etc/gshadow
/etc/group:group3demo:x:1028:
/etc/gshadow:group3demo:!::
groupdel使用
groupdel group3demo
若usergrou2下还有用户比如vbird3则这时候会提示错误
root@changda:/tmp# groupdel group2
groupdel: cannot remove the primary group of user 'vbird3'
若要删除1 删除vbird3 ,2 更改vbird3的initial group
gpasswd的使用
root@changda:/tmp# groupadd testgroup
root@changda:/tmp# gpasswd testgroup
Changing the password for group testgroup
...
把testgroup的所有权交给vbird11 并把vbird1,vbird11这两个用户加进这个testgroup中来
gpasswd -A vbird11 -M vbird1,vbird11 testgroup
然后以vbird11登录
vbird11@changda:~$ gpasswd -a vbird3 testgroup
Adding user vbird3 to group testgroup
cat /etc/group显示如下:
testgroup:x:1005:vbird1,vbird11,vbird3
则三个用户都在这个组中了,这个testgroup就是所谓的这些帐户的有效群组了
---------------------------ubuntu-----------------------------------
这个时候登录 vbird11这个帐户
touch todaydemo
-rw-rw-r-- 1 vbird11 vbird11 0 Dec 7 09:04 todaydemo
//这时候貌似显示不出来另一个所在组testgroup
vbird11@changda:~$ groups
vbird11
执行这一句后显示了
vbird11@changda:/tmp$ newgrp testgroup
vbird11@changda:/tmp$ groups
testgroup vbird11
touch todaydemo1
-rw-rw-r-- 1 vbird11 testgroup 0 Dec 7 09:08 todaydemo1
但再换回来的时候出错了,只能在root下才能恢复了
vbird11@changda:/tmp$ newgrp vbird11
Password:
crypt: Invalid argument
环境如下:网上好像说是版本的Bug,但不确定
-------------------------ubuntu-------------------------------------
centos下测试
把vbird1用户加到组vbird3中成为头目
gpasswd -A vbird1 vbird3
[vbird1@changda tmp]$ groups
vbird3 vbird1
[vbird1@changda tmp]$ newgrp vbird3
[vbird1@changda tmp]$ touch sh2.sh
[vbird1@changda tmp]$ ll
total 4
drwxr-xr-x 2 root root 4096 Dec 7 05:08 scripts
-rw-rw-r-- 1 vbird1 vbird1 0 Dec 7 06:20 sh1.sh
-rw-r--r-- 1 vbird1 vbird3 0 Dec 7 06:20 sh2.sh
[vbird1@changda tmp]$ newgrp vbird1 #再切换回来,没有问题
[vbird1@changda tmp]$ touch sh3.sh
[vbird1@changda tmp]$ ll
total 4
drwxr-xr-x 2 root root 4096 Dec 7 05:08 scripts
-rw-rw-r-- 1 vbird1 vbird1 0 Dec 7 06:20 sh1.sh
-rw-r--r-- 1 vbird1 vbird3 0 Dec 7 06:20 sh2.sh
-rw-rw-r-- 1 vbird1 vbird1 0 Dec 7 06:23 sh3.sh
-------------------------------------------------------------------------
vbird11@changda:/tmp$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
passwd 用法
-l :锁定密码
-S :查看状态
-u : 解锁密码
root@changda:~# passwd -l vbird11
passwd: password expiry information changed.
这时再登录vbird11提示ssh服务拒绝密码
su与sudo的用法
su Enter
env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
su - Enter
env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
可以看到两者的PATH不一样,前者的PATH还是vbird11的,后者的相关设定是root的
root@changda:~# su vbird11
su -c 后边直接跟命令
$ su - -c "head -n 3 /etc/shadow"
Password:
sudo 用法 临时取得root权限
[vbird1@changda tmp]$ sudo cat /etc/shadow
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for vbird1:
vbird1 is not in the sudoers file. This incident will be reported.
需要修改/etc/sudoers这个文档 root 操作
visudo命令 ,即是vi 但在ubuntu下不是,比较坑爹
添加
使用者账号 登入的主机 = (可以变换的身份) 可以下达的指令
root ALL=(ALL) ALL
vbird1 ALL=(ALL) ALL
这时vbrid1用户再执行 sudo cat /etc/shadow就可以看到内容了
PAM 模块:/etc/nologin, /etc/securetty
比如www,mysql用户可以进行系统程序的工作,但是不能登录系统
mysql:x:1000:1000::/home/mysql:/sbin/nologin
www:x:1001:1001::/home/www:/sbin/nologin
mysql:!:17030:0:99999:7:::
www:!:17030:0:99999:7:::
PAM (Pluggable Authentication Modules, 嵌入式模块)
PAM是怎么玩的呢? 以 /usr/bin/passwd 这支程序来作为简单的说明
1. 使用者开始执行 /usr/bin/passwd 这支程序,并输入密码
2. passwd 开始呼叫 PAM 模块,PAM 模块会搜寻 passwd 程序的 PAM 相关设定档案, 这个设定档 一般是在 /etc/pam.d/ 里面的与程序同名的档案
3. 经由 /etc/pam.d/passwd 设定文件的数据,取用 PAM 所提供的相关模块来进行验证
4. 将验证结果回传给 passwd 这支程序,而 passwd 这支程序会根据 PAM 回传的结果决定下一个动作
5. 至于更多的环境相关设定则放置在 /etc/security/*
比如我们限制vbird1这个用户建立文档的大小
修改limits.conf 添加一行
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
vbird1 hard fsize 10240
则再次vbird1登录的时候
[vbird1@changda ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) 10240 #已经变了
pending signals (-i) 7993
登录用户之间的通信
1 talk 这个不好玩
2 write vbird1 回车 输入 vbird1这边立即收到信息,若不想收到 mesg n 即可
3 wall 给所有登录者发送信息
添加帐户的时候最好用useradd,如果要手动建立则以下命令要在建立后检查有没有错误
pwck 检查/etc/passwd中有没有错误
grpck 检查群组
pwconv 『将 /etc/passwd 内的账号与密码,移动到 /etc/shadow 当中
pwunconv 『将 /etc/shadow 内的密码栏数据写回 /etc/passwd
建立alex这上帐号属于alexgroup用户说明为“Alex Tsai" ,同时要在users组当中,要求建立的时候有家目录
groupadd alexgroup
useradd -c "Alex Tsai" -g alexgroup -G users -m alex
Linux磁盘配额(Quota)
/etc/mtab文件
我们是以编辑 /etc/fstab 后,再重新挂载 filesystem 的方法来让系统的 filesystem 支持 quota 的
[root@changda ~]# quotacheck -avug
quotacheck: Can't find filesystem to check or filesystem not mounted with quota option
作者不建立用/分区容易出问题,但我是用vps做的测试,装系统的时候默认只有一个/分区,所以用/分区进行演示
vi /etc/fstab 添加 usrquota,grpquota中间没有空格
LABEL=DOROOT / ext4 errors=remount-ro,usrquota,grpquota 0 1
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0
[root@changda ~]# cat /etc/mtab
/dev/vda1 / ext4 rw,errors=remount-ro,usrquota,grpquota 0 0
proc /proc proc rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
[root@changda ~]# quotacheck -avug
quotacheck: Cannot remount filesystem mounted on / read-only so counted values might not be right.
Please stop all programs writing to filesystem or use -m flag to force checking.
[root@changda ~]# quotacheck -avugm
quotacheck: Scanning /dev/root [/] quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
done
quotacheck: Checked 5635 directories and 35378 files
quotacheck: Old file not found.
quotacheck: Old file not found.
这时在 / 出现了 aquota.group和 aquota.user
[root@changda /]# ll
total 104
-rw------- 1 root root 7168 Dec 8 01:45 aquota.group
-rw------- 1 root root 8192 Dec 8 01:45 aquota.user
drwxr-xr-x 2 root root 4096 Oct 31 17:12 bin
drwxr-xr-x 4 root root 4096 Oct 31 17:13 boot
[root@changda /]# quotaon -avug
/dev/root [/]: group quotas turned on
/dev/root [/]: user quotas turned on
[root@changda /]# edquota -u quser1 #修改 soft 与hard 45M 50M
Disk quotas for user quser1 (uid 701):
Filesystem blocks soft hard inodes soft hard
/dev/root 16 45000 50000 6 0 0
quser2同样用quser1的配额限制
[root@changda /]# edquota -p quser1 quser2
[root@changda /]# edquota -t
Filesystem Block grace period Inode grace period
/dev/root 1days 7days
查看是否配置成功
[root@changda /]# quota -vu quser1 quser2
Disk quotas for user quser1 (uid 701):
Filesystem blocks quota limit grace files quota limit grace
/dev/root 16 45000 50000 6 0 0
Disk quotas for user quser2 (uid 702):
Filesystem blocks quota limit grace files quota limit grace
/dev/root 16 45000 50000 6 0 0
编辑群组使用空间
[root@changda /]# edquota -g qgroup
Filesystem blocks soft hard inodes soft hard
/dev/root 32 80000 90000 10 0 0
查看是否成功
[root@changda /]# quota -vg qgroup
Disk quotas for group qgroup (gid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/root 32 80000 90000 10 0 0
设置开机启动最后加一行即可
vi /etc/rc.d/rc.local
++ /sbin/quotaon -avug
查看整个filesystem的quota
[root@changda /]# repquota -av
*** Report for user quotas on device /dev/root
Block grace time: 24:00; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 823688 0 0 36834 0 0
vbird1 -- 20 0 0 10 0 0
vbird2 -- 16 0 0 6 0 0
quser1 -- 16 45000 50000 6 0 0
quser2 -- 16 45000 50000 6 0 0
Statistics:
Total blocks: 8
Data blocks: 1
Entries: 5
Used average: 5.000000
[root@changda /]# repquota -aug
*** Report for user quotas on device /dev/root
Block grace time: 24:00; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 823736 0 0 36834 0 0
vbird1 -- 20 0 0 10 0 0
vbird2 -- 16 0 0 6 0 0
quser1 -- 16 45000 50000 6 0 0
quser2 -- 16 45000 50000 6 0 0
*** Report for group quotas on device /dev/root
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 821068 0 0 36792 0 0
tty -- 24 0 0 2 0 0
mail -- 4 0 0 5 0 0
man -- 128 0 0 32 0 0
lock -- 4 0 0 1 0 0
nobody -- 92 0 0 1 0 0
users -- 16 0 0 5 0 0
utmp -- 2412 0 0 4 0 0
vbird1 -- 24 0 0 9 0 0
vbird3 -- 0 0 0 1 0 0
qgroup -- 32 80000 90000 10 0 0
用quser1登录的时候建立文件
[quser1@changda ~]$ cp latest.tar.gz 1
[quser1@changda ~]$ cp latest.tar.gz 2
[quser1@changda ~]$ cp latest.tar.gz 3
当建立到第四个的时候提示错误信息了 超过50M了
[quser1@changda ~]$ cp latest.tar.gz 4
vda1: warning, user block quota exceeded.
** Report for user quotas on device /dev/root
Block grace time: 24:00; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 823756 0 0 36834 0 0
vbird1 -- 7828 0 0 11 0 0
vbird2 -- 16 0 0 6 0 0
quser1 +- 46864 45000 50000 23:59 12 0 0
quser2 -- 16 45000 50000 6 0 0
再开一篇---->Linux鸟哥私房菜 笔记四
本文由 dealdot <dealdot#163.com> 创作, Full Stack Developer @ DeepBlue
本文最后编辑时间为: Apr 9, 2017 at 16:53 pm
转载请注明来源