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