2018-02-02 重定向和管道、用户和组权限管理

1、文件描述符

打开的文件都有一个fd: file descriptor (文件描述符),在/proc/$$/fd中,是系统自动分配的。如果在一个终端用vim打开一个f1文件,在另外一个终端进行如下操作,可以看到文件描述符

2、重定向和管道

  • set命令
[root@localhost ~]#cat t1
/bin/cat
/bin/ls
[root@localhost ~]#cat t3
[root@localhost ~]#set -C    ---禁止覆盖原有文件
[root@localhost ~]#cat t1 > t3
-bash: t3: cannot overwrite existing file
[root@localhost ~]#cat t1 >| t3    ---强行覆盖原有文件
[root@localhost ~]#cat t3
/bin/cat
/bin/ls
[root@localhost ~]#set +C    ---允许覆盖,默认是这种模式
[root@localhost ~]#hostname > t3
[root@localhost ~]#cat t3
localhost.localdomain
  • 把对的和错的都重定向到一个文件里的三种方法
[root@centos6 ~]#ls /app /err >f2 2>&1 ---比较老的写法
[root@centos6 ~]#cat f2
ls: cannot access /err: No such file or directory
/app:
fa
fb
[root@centos6 ~]#ls /app /err &> f2  ---比较新和常用的写法
[root@centos6 ~]#cat f2
ls: cannot access /err: No such file or directory
/app:
fa
fb
[root@centos6 ~]#ls /app /err >&f2
[root@centos6 ~]#cat f2
ls: cannot access /err: No such file or directory
/app:
fa
fb
  • 多个命令重定向到一个文件里,用()
[root@localhost ~]#(hostname;ls) > t3
[root@localhost ~]#cat t3
localhost.localdomain
9
anaconda-ks.cfg
ethadd.sh
install.log
install.log.syslog
t1
t3
t5
ttt
  • >软连接文件
[root@localhost ~]#ll t1
-rw-r--r--. 1 root root 17 Feb  1 20:51 t1
[root@localhost ~]#ln -s t1 t2    ---创建t1文件的软连接放到t2
[root@localhost ~]#ll t2
lrwxrwxrwx. 1 root root 2 Feb  2 00:12 t2 -> t1  ---创建成功
[root@localhost ~]#> t2    ---重定向
[root@localhost ~]#ll t1
-rw-r--r--. 1 root root 0 Feb  2 00:12 t1    ---源文件被破坏
[root@localhost ~]#ll t2
lrwxrwxrwx. 1 root root 2 Feb  2 00:12 t2 -> t1

结论:>软连接文件,会将软连接的源文件破坏。禁用

  • tr 命令
    选项 -c取反 -d删除 -s压缩连续、重复的字符 -t对齐
    这里解释一下-t 、-d选项
[root@localhost tmp]#cat abc
abcdef
[root@localhost tmp]#cat abc | tr  'abc' '1234'    ---abc只有3个字符,所以只替换前3个
123def
[root@localhost tmp]#cat abc | tr 'abcd' '123'    ---d没有替换的,就替换成之后一个3
1233ef
[root@localhost tmp]#cat abc | tr -t 'abcd' '123'    ---加上t选项,d就不替换了
123def
[root@localhost tmp]#cat abc | tr -d 'abc\n' </etc/issue    ---这里的\n只表示回车换行,不表示\n本身
CentOS relese 6.8 (Finl)Kernel \r on n \m
  • 多行重定向
[root@localhost ~]#cat >f1<<end
> a
> b
> c
> en
> end
[root@localhost ~]#cat f1
a
b
c
en
  • 发邮件
[root@centos6 ~]#mail -s "hello" root<<end ---hello是标题,root代表发给root这个用户,-s表示邮件的主题
> how are you
> and you
> end

总结:看邮件用mail,点1封邮件,quit是退出邮件。也可以将邮件内容写在一个文件里,然后用mail -s 标准输入的重定向这个文件,就可以获取文件的内容并发送出去。

  • 管道
[root@centos7 ~]#ls /err 2>&1 |tr 'a-z' 'A-Z'
LS: CANNOT ACCESS /ERR: NO SUCH FILE OR DIRECTORY
[root@centos7 ~]#ls /err |& tr 'a-z' 'A-Z'
LS: CANNOT ACCESS /ERR: NO SUCH FILE OR DIRECTORY

总结:管道只能把正确的标准输出传给后面的命令作为标准输入,不能把错误的标准输出传给后面的命令,因此要把错误的转化为争取的,上面两种方法都可以。

  • tee
[root@localhost tmp]#hostname | tee t1
localhost.localdomain
[root@localhost tmp]#cat t1
localhost.localdomain

总结:把命令的执行结果在屏幕上显示,同时重定向到文件中。如果f2文件存在,则覆盖,要想不覆盖使用-a选项进行追加。

  • less和more
    ll /etc|less ---可以分页查看,用pgup和pgdn进行上下翻页,q退出
    ll /etc/more --- 也可以分页查看,但不能翻页,到底会退出
  • 管道中的-
[root@centos6 ~]#tar -cvf - /home | tar -xvf -    

表示把home目录打包成一个文件后,通过管道传给后面,再把这个文件解包,用-代替这个文件。

3、用户和组权限管理

  • 用户和组的配置文件

/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及其相关属性
/etc/gshadow:组密码及其相关属性

[root@localhost ~]#getent group idc
idc:x:500:
[root@localhost ~]#getent gshadow idc
idc:!::

总结:这个/etc/group和/etc/gshadow这两个文件中的组成员要保持一致,idc是他们的附加组。

  • newgrp 临时切换主组
[root@localhost ~]#su - zheng
[zheng@localhost ~]$id    ---用户zheng不属于idc组
uid=501(zheng) gid=501(zheng) groups=501(zheng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[zheng@localhost ~]$newgrp idc
Password:     ---需要组密码
[zheng@localhost ~]$id
uid=501(zheng) gid=500(idc) groups=500(idc),501(zheng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

总结:一个用户要想把一个组临时切换成主组,要看这个用户是否属于这个组,如果属于这个组,则不需要组密码,否则需要组密码。

  • 新建用户的相关文件

/etc/default/useradd -新建用户的默认文件夹
/etc/skel/* -家目录的模板文件夹
/etc/login.defs -邮箱路径、密码策略、加密算法、umask等

[root@localhost ~]#cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]#cd /etc/skel/
[root@localhost skel]#ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  .mozilla
[root@localhost skel]#cat /etc/login.defs 
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR  Maildir
MAIL_DIR    /var/spool/mail    ---邮箱
#MAIL_FILE  .mail

# Password aging controls:    ---密码策略
#
#   PASS_MAX_DAYS   Maximum number of days a password may be used.
#   PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#   PASS_MIN_LEN    Minimum acceptable password length.
#   PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN           500
UID_MAX         60000

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN           500
GID_MAX         60000

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes

# The permission mask is initialized to this value. If not specified, 
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

# Use SHA512 to encrypt password.
ENCRYPT_METHOD MD5    ---加密算法

MD5_CRYPT_ENAB yes
  • useradd 创建用户
[root@localhost skel]#useradd -N tom
[root@localhost skel]#getent passwd tom
tom:x:502:100::/home/tom:/bin/bash
[root@localhost skel]#id tom
uid=502(tom) gid=100(users) groups=100(users)

总结:加上N选项,作用是不使用tom作为主组(私用组),而使用users做为主组。

[root@localhost ~]#useradd -r -s /sbin/nologin nginx
[root@localhost ~]#id nginx
uid=496(nginx) gid=493(nginx) groups=493(nginx)
[root@localhost ~]#cd /home
[root@localhost home]#ls
idc  tom  zheng
[root@localhost home]#cd /var/spool/mail/
[root@localhost mail]#ls
idc  root  tom  zheng

总结:创建系统用户用-r选项,不创建邮箱和家目录。

  • useradd -D 显示或更改默认设置
[root@centos7 ~]#useradd -D  ---显示默认设置
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@centos7 ~]#useradd -D -s /bin/csh---更改shell类型
[root@centos7 ~]#useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@centos7 ~]#useradd -D -b /app ---更改家目录路径
[root@centos7 ~]#useradd -D
GROUP=100
HOME=/app
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@centos7 ~]#useradd -D -g zhang ---更改默认主组。
[root@centos7 ~]#useradd -D
GROUP=1000
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
  • usermod 搬家
[root@centos6 ~]#usermod -d /app/natashaxinjia -m natasha    --- -m表示将家目录内容移至新位置(仅与-d一起使用)
[root@centos6 ~]#ls /app  ---执行成功
f1  f11  f2  fa  fb  natashaxinjia  passwd.txt  unix.txt  win.txt
[root@centos6 ~]#
[root@centos6 app]#usermod -d /app/home tom---只更改家目录的路径而不搬家
[root@centos6 app]#getent passwd tom
tom:x:504:100::/app/home:/bin/bash
[root@centos6 app]#usermod -d /app/home -m tom ---执行不成功
usermod: no changes

总结:搬家要同时用-d和-m选项,如果先-d,更改家目录的路径,发现不会搬家,只是把路径改变了,但如果接着执行再加上-m选项,会发现执行不成功,所以要执行搬家命令,就不能先执行只更改家目录路径的命令。

  • su 切换身份执行命令在切换回原身份
[idc@localhost ~]$cat /etc/default/useradd 
cat: /etc/default/useradd: Permission denied    ---普通用户没权限
[idc@localhost ~]$su - root -c 'cat /etc/default/useradd'
Password: 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

需要输入密码。

  • 锁定用户的两种方法
[root@localhost ~]#usermod -L idc
[root@localhost ~]#getent shadow idc
idc:!$1$3SO3WKCQ$KfTCV9xHb9/RV6Ikic.gk.:17566:0:99999:7:::
[root@localhost ~]#passwd -l zheng
Locking password for user zheng.
passwd: Success
[root@localhost ~]#getent shadow zheng
zheng:!!$1$sKmOq3HW$PcNQbNHAY9Nfp3LnjpF5L/:17565:0:99999:7:::

总结:两种方法都可以锁定账号,但passwd锁定后会出现两个叹号,比较安全。

  • 解锁用户的两种方法
[root@localhost ~]#passwd -u idc
Unlocking password for user idc.
passwd: Success
[root@localhost ~]#getent shadow idc
idc:$1$3SO3WKCQ$KfTCV9xHb9/RV6Ikic.gk.:17566:0:99999:7:::
[root@localhost ~]#usermod -U zheng
[root@localhost ~]#getent shadow zheng
zheng:$1$sKmOq3HW$PcNQbNHAY9Nfp3LnjpF5L/:17565:0:99999:7:::
  • 设置密码策略
    chage[OPTION]... LOGIN
    -d LAST_DAY ---修改密码上次修改的时间
    -E --expiredateEXPIRE_DATE ---这是账户失效时间
    -I --inactive INACTIVE ---设置密码修改宽限期
    -m --mindaysMIN_DAYS ---设置密码修改最短间隔时间
    -M --maxdaysMAX_DAYS ---设置密码使用最长期限
    -W --warndaysWARN_DAYS ---设置密码过期前的提前警告时间
    –l ---显示密码策略信息
    举例:两种方法强制用户下次登录重新设置密码
[root@localhost ~]#passwd -e idc
Expiring password for user idc.
passwd: Success
[root@localhost ~]#getent shadow idc
idc:$1$0I6rKBhn$CVIxsWfMlMz1Xc51Fcf3N.:0:0:99999:7:::
[root@localhost ~]#chage -d 0 zheng
[root@localhost ~]#getent shadow zheng
zheng:$1$EHUs1vdI$cYNauLWBfvrnNMufKc9pd1:0:0:99999:7:::

更改密码策略

[root@localhost ~]#chage -m 0 -M 42 -W 7 -I 5 -E 2018-12-31 idc
[root@localhost ~]#getent shadow idc
idc:$1$0I6rKBhn$CVIxsWfMlMz1Xc51Fcf3N.:0:0:42:7:5:17896:
  • 给用户添加附加组的三种方法
[root@localhost ~]#id idc
uid=500(idc) gid=500(idc) groups=500(idc)
[root@localhost ~]#usermod -G test,test1 idc    ---第一种方法 如果idc之前有附加组,会覆盖原有的附加组,如果想不覆盖使用-a选项
[root@localhost ~]#id idc
uid=500(idc) gid=500(idc) groups=500(idc),502(test),503(test1)
[root@localhost ~]#gpasswd -a idc test2    ---第二种方法
Adding user idc to group test2
[root@localhost ~]#id idc
uid=500(idc) gid=500(idc) groups=500(idc),502(test),503(test1),504(test2)
[root@localhost ~]#groupmems -a idc -g test3    ---第三种方法
[root@localhost ~]#id idc
uid=500(idc) gid=500(idc) groups=500(idc),502(test),503(test1),504(test2),505(test3)
[root@localhost ~]#groups idc
idc : idc test test1 test2 test3
  • 设置组的管理员
[root@localhost ~]#gpasswd -A idc,zheng test
[root@localhost ~]#getent gshadow test
test:!:idc,zheng:idc

总结:用户是不是属于该组都可以作为该组的管理员。

  • 显示组
[root@localhost ~]#groups idc    ---显示idc属于哪些附加组
idc : idc test test1 test2 test3
[root@localhost ~]#groupmems -l -g idc
[root@localhost ~]#groupmems -l -g test    ---列出组的成员
idc 

4、文件权限

  • 更改文件的所有者和所属组
[root@localhost mnt]#su - idc
[idc@localhost ~]$ll
total 0
[idc@localhost ~]$touch test1
[idc@localhost ~]$ll
total 0
-rw-rw-r--. 1 idc idc 0 Feb  4 15:44 test1
[idc@localhost ~]$chown zheng test1     ---普通用户没有权限更改文件的所有者
chown: changing ownership of `test1': Operation not permitted
[idc@localhost ~]$id idc
uid=500(idc) gid=500(idc) groups=500(idc),502(test),503(test1),504(test2),505(test3)    ---idc属于test2组
[idc@localhost ~]$chgrp test2 test1
[idc@localhost ~]$ll
total 0
-rw-rw-r--. 1 idc test2 0 Feb  4 15:44 test1      ---更改成功
[idc@localhost ~]$chgrp ttt test1
chgrp: changing group of `test1': Operation not permitted

总结:文件的所有者只有root身份才能更改;文件的所属组(主组),除了root身份外,文件的所有者也有权限更改所属组,前提是这个用户属于要更改为的组。

  • 同时更改文件的所有者和所属组
[root@localhost mnt]#ll
total 12
-rw-r--r--. 1 root root    0 Feb  1 20:30 a.text
-rw-r--r--. 1 root root    0 Feb  1 20:30 b.text
-rw-r--r--. 1 root root    0 Feb  1 20:30 c.text
-rw-r--r--. 1 root root    0 Feb  1 20:30 d.text    ---更改d.text文件
drwxr-xr-x. 2 root root 4096 Jan  9 06:17 hgfs
-rwxr--r--. 1 root root 1251 Feb  1 11:35 ip.sh
-rw-r--r--. 1 root root 2761 Feb  1 11:27 ks.cfg
[root@localhost mnt]#chown idc:test d.text 
[root@localhost mnt]#ll
total 12
-rw-r--r--. 1 root root    0 Feb  1 20:30 a.text
-rw-r--r--. 1 root root    0 Feb  1 20:30 b.text
-rw-r--r--. 1 root root    0 Feb  1 20:30 c.text
-rw-r--r--. 1 idc  test    0 Feb  1 20:30 d.text    ---已更改
drwxr-xr-x. 2 root root 4096 Jan  9 06:17 hgfs
-rwxr--r--. 1 root root 1251 Feb  1 11:35 ip.sh
-rw-r--r--. 1 root root 2761 Feb  1 11:27 ks.cfg
[root@localhost mnt]#chown :test1 b.text     ---只更改所属组
[root@localhost mnt]#ll
total 12
-rw-r--r--. 1 root root     0 Feb  1 20:30 a.text
-rw-r--r--. 1 root test1    0 Feb  1 20:30 b.text
-rw-r--r--. 1 root root     0 Feb  1 20:30 c.text
-rw-r--r--. 1 idc  test     0 Feb  1 20:30 d.text
drwxr-xr-x. 2 root root  4096 Jan  9 06:17 hgfs
-rwxr--r--. 1 root root  1251 Feb  1 11:35 ip.sh
-rw-r--r--. 1 root root  2761 Feb  1 11:27 ks.cfg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容