Linux鸟哥私房菜 笔记三

in Linux with 0 comment

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 通配符[又叫万用符]有很多都用一个字符来表示如 * ?等,下边列出其区别

万用符

符号 | 说明
---|---

正则表达式 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等

延伸符号 | 说明
---|---


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中调用 引用 包含另一个脚本或文档的三种方法

  1. 使用source ,如source /etc/lsb/init-functions
  2. 使用., 如 . /etc/lsb/init-functions
  3. 若是可执行文件用sh sh /etc/init.d/atd
  4. 注意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鸟哥私房菜 笔记四

评论