1、文件描述符
打开的文件都有一个fd: file descriptor (文件描述符),在/proc/$$/fd中,是系统自动分配的。如果在一个终端用vim打开一个f1文件,在另外一个终端进行如下操作,可以看到文件描述符
- 查看文件描述符
[root@centos6 ~]#cd /proc
[root@centos6 proc]#cd $$ --- 当前进程编号
[root@centos6 2687]#ls
attr comm fd mem numa_maps root stat
autogroup coredump_filter fdinfo mountinfo oom_adj sched statm
auxv cpuset io mounts oom_score schedstat status
cgroup cwd limits mountstats oom_score_adj sessionid syscall
clear_refs environ loginuid net pagemap smaps task
cmdline exe maps ns personality stack wchan
[root@centos6 2687]#cd fd
[root@centos6 fd]#ll
total 0
lrwx------. 1 root root 64 Jul 21 07:44 0 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 1 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 19:20 10 -> /root/f1 ---文件描述符为10
lrwx------. 1 root root 64 Jul 21 18:54 2 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 255 -> /dev/pts/0
[root@centos6 fd]#cat 10 ---查看的结果和在另外一个终端,用cat命令查看是一样的
hello,I am zhangdazhi
welcome to magedu.com
CentOS release 6.9 (Final)
Kernel \r on an \m
\l
\n
\t
- 如何自己分配一个文件描述符
[root@centos6 ~]#touch f2 ---创建一个f2文件
[root@centos6 ~]#ls
anaconda-ks.cfg Downloads install.log passwd.txt Templates Videos
Desktop f1 install.log.syslog Pictures typescript win.txt
Documents f2 Music Public unix.txt
[root@centos6 ~]#exec 5<>/root/f2 ---分配一个文件描述符5
[root@centos6 ~]#cd /proc/$$/fd ---进入fd目录
[root@centos6 fd]#ll
total 0
lrwx------. 1 root root 64 Jul 21 07:44 0 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 1 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 19:20 10 -> /root/f1
lrwx------. 1 root root 64 Jul 21 18:54 2 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 255 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 19:48 5 -> /root/f2 ---可以看到文件描述符
[root@centos6 fd]#exec 5>&- 关闭
[root@centos6 fd]#ll
total 0
lrwx------. 1 root root 64 Jul 21 07:44 0 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 1 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 19:20 10 -> /root/f1
lrwx------. 1 root root 64 Jul 21 18:54 2 -> /dev/pts/0
lrwx------. 1 root root 64 Jul 21 18:54 255 -> /dev/pts/0
2、重定向和管道
- set命令
[root@centos6 ~]#cat f1
anaconda-ks.cfg
Desktop
Documents
Downloads
f1
f2
install.log
install.log.syslog
Music
passwd.txt
Pictures
Public
Templates
typescript
unix.txt
Videos
win.txt
[root@centos6 ~]#set -C ---禁止覆盖原有文件
[root@centos6 ~]#cat /etc/issue >f1
-bash: f1: cannot overwrite existing file
[root@centos6 ~]#cat /etc/issue >| f1 ---强行覆盖原有文件
[root@centos6 ~]#cat f1
CentOS release 6.9 (Final)
Kernel \r on an \m
\l
\n
\t
[root@centos6 ~]#set +C ---允许覆盖,默认是这种模式
[root@centos6 ~]#hostname >f1
[root@centos6 ~]#cat f1
centos6.magedu.com
- 把对的和错的都重定向到一个文件里的三种方法
[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@centos6 ~]#(ls;hostname)>f1
[root@centos6 ~]#cat f1
anaconda-ks.cfg
Desktop
Documents
Downloads
f1
f2
install.log
install.log.syslog
Music
passwd.txt
Pictures
Public
Templates
typescript
unix.txt
Videos
win.txt
centos6.magedu.com
- >软连接文件
[root@centos6 ~]#ln -s ../root/f2 /app/link1---创建f2文件的软连接放到/app/link1
[root@centos6 ~]#ll /app/link1
lrwxrwxrwx. 1 root root 10 Jul 21 20:23 /app/link1 -> ../root/f2---创建成功
[root@centos6 ~]#> /app/link1 ---重定向
[root@centos6 ~]#ll f2 ---源文件被破坏
-rw-r--r--. 1 root root 0 Jul 21 20:23 f2
[root@centos6 ~]#ll /app/link1
lrwxrwxrwx. 1 root root 10 Jul 21 20:23 /app/link1 -> ../root/f2
结论:>软连接文件,会将软连接的源文件破坏。禁用
- tr 命令
选项 -c 取反 -d删除 -s 压缩连续、重复的字符 -t 对齐
这里解释一下-t 、-d选项
[root@centos6 ~]#tr 'abc' '1234'
abcdef
123def
[root@centos6 ~]#tr 'abcd' '123' ---d没有替换的,就替换成之后一个3
abcdef
1233ef
[root@centos6 ~]#tr -t 'abcd' '123' ---加上t选项,d就不替换了
abcdef
123def
[root@centos6 ~]#tr -d 'abc\n'</etc/issue ---这里的\n只表示回车换行,不表示/n本身
CentOS relese 6.9 (Finl)Kernel \r on n \m\l\n\
如何将windows格式转换为linux格式
[root@centos6 ~]#hexdump -C win.txt ---以十六进制显示,比linux中多了一个0d,0d相当于十进制的13
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
[root@centos6 ~]#bc ---计算处十进制的13为八进制的15
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=8
13
15
quit
[root@centos6 ~]#tr -d '\015' <win.txt >linux.t ---将八进制的\015删除
[root@centos6 ~]#hexdump -C linux.t
00000000 61 0a 62 0a 63 |a.b.c|
00000005
- 多行重定向
[root@centos6 ~]#cat >f1<<end
> a
> b
> c
> end
[root@centos6 ~]#cat f1
a
b
c
发邮件
[root@centos6 ~]#mail -s "hello" root<<end ---hello是标题,root代表发给root这个用户,-s subject
> 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@centos6 ~]#hostname |tee f2
centos6.magedu.com
[root@centos6 ~]#cat f2
centos6.magedu.com
总结:把命令的执行结果在屏幕上显示,同时重定向到文件中。如果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@centos6 ~]#getent group admins
admins:x:502:natasha,harry
[root@centos6 ~]#getent gshadow admins
admins:!::natasha,harry
总结:这个/etc/group和/etc/gshadow这两个文件中的组成员要保持一致,admins是他们的附加组。
- newgrp 临时切换主组
[root@centos6 ~]#su - zhang -zhang
[zhang@centos6 ~]$id ---用户zhang不属于admins组
uid=500(zhang) gid=500(zhang) groups=500(zhang)
[zhang@centos6 ~]$newgrp admins
Password: ---需要密码
[zhang@centos6 ~]$id
uid=500(zhang) gid=502(admins) groups=502(admins),500(zhang)
[root@centos6 ~]#su - harry
[harry@centos6 ~]$ id--- 用户Harry属于admins组
uid=503(harry) gid=504(harry) groups=504(harry),502(admins)
[harry@centos6 ~]$ newgrp admins
[harry@centos6 ~]$ id
uid=503(harry) gid=502(admins) groups=502(admins),504(harry)
总结:一个用户要想把一个组临时切换成主组,要看这个用户是否属于这个组,如果属于这个组,则不需要密码,否则需要密码。
- 新建用户的相关文件
etc/default/useradd -新建用户的默认文件夹
/etc/skel/* -家目录的模板文件夹
/etc/login.defs -邮箱路径、密码策略、加密算法、umask等
[root@centos6 ~]#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@centos6 skel]#ls -a
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla
# *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
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 ---加密算法
- useradd 创建用户
[root@centos6 mail]#useradd -N tom
[root@centos6 mail]#getent passwd tom
tom:x:504:100::/home/tom:/bin/bash
[root@centos6 mail]#id tom
uid=504(tom) gid=100(users) groups=100(users)
总结:加上N选项,作用是不使用tom作为主组(私用组),而使用users做为主组。
[root@centos6 ~]#useradd -r -s /sbin/nologin nginx
[root@centos6 ~]#id nginx
uid=495(nginx) gid=491(nginx) groups=491(nginx)
[root@centos6 ~]#cd /home
[root@centos6 home]#ls
gentoo harry natasha tom zhang
[root@centos6 home]#cd /var/spool/mail
[root@centos6 mail]#ls
Distribution gentoo harry natasha root rpc tom zhang
总结:创建系统用户用-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
[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 切换身份执行命令在切换回原身份
[zhang@centos6 ~]$su - root -c 'cat /etc/shadow'
Password:
需要输入密码。
- 锁定用的两种方法
[root@centos6 ~]#usermod -L harry
[root@centos6 ~]#getent shadow harry
harry:!$6$KieKpTJ/$S/6MseMjC.vC66Uo4Tmz7gyaq..cUcXklgo/Mo9Mg4/0EjPg5ghSbMJg6un5s5Dmj12yTHqKYK2skTf1PgBA/0:17368:0:99999:7:::
[root@centos6 ~]#passwd -l sarah
Locking password for user sarah.
passwd: Success
[root@centos6 ~]#getent shadow sarah
sarah:!!$6$d4W3guwdC6/$zdizqvqB3tYAlr.XCbR0H/qu/E9L8nTWWRfld2iFNtO8Zw0g9R5u57nYmq4IXU5NWKpOTyU6ukObNad2QiU2y1:17368::::::
总结:两种方法都尅锁定账号,但passwd锁定后会出现两个!,比较安全。
- 设置密码策略
chage[OPTION]... LOGIN
-d LAST_DAY
-E --expiredateEXPIRE_DATE
-I --inactive INACTIVE
-m --mindaysMIN_DAYS
-M --maxdaysMAX_DAYS
-W --warndaysWARN_DAYS
–l 显示密码策略
举例:两种方法强制用户下次登录重新设置密码
root@centos6 ~]#passwd -e harry
Expiring password for user harry.
passwd: Success
[root@centos6 ~]#getent shadow harry
harry:$6$IVts56qg$0Jzt3Nl6wM6d5TNpmqf2uhKCqit.bBy5zEsrtHeVbOvnEJ1HqjbDi3ELS8cwpJAYBqrgIW803D/6EVS4wdqXW0:0:0:99999:7:::
[root@centos6 ~]#chage -d 0 sarah
[root@centos6 ~]#getent shadow sarah
sarah:$6$d4W3guwdC6/$zdizqvqB3tYAlr.XCbR0H/qu/E9L8nTWWRfld2iFNtO8Zw0g9R5u57nYmq4IXU5NWKpOTyU6ukObNad2QiU2y1:0::::::
更改密码策略
[root@centos6 ~]#chage -m 0 -M 42 -W 7 -I 5 -E 2018-12-31 tom
[root@centos6 ~]#getent shadow tom
tom:!!:17368:0:42:7:5:17896:
- 给用户添加附加组的三种方法
[root@centos6 ~]#id tom
uid=504(tom) gid=505(tom) groups=505(tom)
[root@centos6 ~]#usermod -G admins,harry tom ---第一种方法 如果tom之前有附加组,会覆盖原有的附加组,如果想不覆盖使用-a选项
[root@centos6 ~]#id tom
uid=504(tom) gid=505(tom) groups=505(tom),502(admins),504(harry)
[root@centos6 ~]#gpasswd -a tom zhang ---- 第二种方法
Adding user tom to group zhang
[root@centos6 ~]#id tom
uid=504(tom) gid=505(tom) groups=505(tom),500(zhang),502(admins),504(harry)
[root@centos6 ~]#groupmems -a tom -g gentoo ---第三种方法
[root@centos6 ~]#id tom
uid=504(tom) gid=505(tom) groups=505(tom),500(zhang),501(gentoo),502(admins),504(harry)
[root@centos6 ~]#groups tom
tom : tom zhang gentoo admins harry
- 设置组的管理员
[root@centos6 ~]#gpasswd -A zhang,harry admins
[root@centos6 ~]#getent gshadow admins
admins:$6$fWFbAvMjJ2/oXGHL$6oQAPJnosWoc0rVG4EpFBoQXeys7Ejf3jBP6ziVsqZJuPWm9cRMlsTEt0O3nx4wMf5/ATsvsGe2Qo/2PrNen41:zhang,harry:natasha,harry,tom
总结:用户是不是属于该组都可以作为该组的管理员。
- 显示组
[root@centos6 ~]#groups tom ---显示tom属于哪些附加组
tom : tom zhang gentoo admins harry
[root@centos6 ~]#groupmems -l -g tom
[root@centos6 ~]#groupmems -l -g admins ---列出组的成员
natasha harry tom
4、文件权限
- 更改文件的所有者和所属组
[root@centos6 ~]#su - zhang
[zhang@centos6 ~]$touch f4
[zhang@centos6 ~]$ll
total 0
-rw-rw-r--. 1 zhang zhang 0 Jul 22 11:44 f4
[zhang@centos6 ~]$chown tom f4 ---普通用户没有权限更改文件的所有者
chown: changing ownership of `f4': Operation not permitted
[zhang@centos6 ~]$id zhang
uid=500(zhang) gid=500(zhang) groups=500(zhang),0(root),502(admins) ---zhang属于admins组
[zhang@centos6 ~]$chgrp admins f4
[zhang@centos6 ~]$ll
total 0
-rw-rw-r--. 1 zhang admins 0 Jul 22 11:44 f4 ---更改成功
[zhang@centos6 ~]$chgrp tom f4
chgrp: changing group of `f4': Operation not permitted
总结:文件的所有者只有root身份才能更改;文件的所属组(主组),除了root身份外,文件的所有者也有权限更改所属组,前提是这个用户属于要更改为的组。
- 同时更改文件的所有者和所属组
[root@centos6 app]#ll
total 36
-rw-r--r--. 1 zhang zhang 6 Jul 21 20:56 f1
drwxr-xr-x. 2 root root 4096 Jul 22 09:17 f11
-rw-r--r--. 1 root root 38 Jul 21 21:17 f2 ---更改f2文件
-rw-r--r--. 1 root root 97 Jul 21 09:38 fa
-rw-r--r--. 1 root root 6 Jul 21 10:15 fb
drwx------. 4 natasha natasha 4096 Jul 21 16:01 natashaxinjia
-rw-r--r--. 1 root root 41 Jul 21 16:06 passwd.txt
-rw-r--r--. 1 root root 6 Jul 20 15:29 unix.txt
-rw-r--r--. 1 root root 7 Jul 20 15:30 win.txt
[root@centos6 app]#chown harry:admins f2 ---用chown命令
[root@centos6 app]#ll
total 36
-rw-r--r--. 1 zhang zhang 6 Jul 21 20:56 f1
drwxr-xr-x. 2 root root 4096 Jul 22 09:17 f11
-rw-r--r--. 1 harry admins 38 Jul 21 21:17 f2 ---已更改
-rw-r--r--. 1 root root 97 Jul 21 09:38 fa
-rw-r--r--. 1 root root 6 Jul 21 10:15 fb
drwx------. 4 natasha natasha 4096 Jul 21 16:01 natashaxinjia
-rw-r--r--. 1 root root 41 Jul 21 16:06 passwd.txt
-rw-r--r--. 1 root root 6 Jul 20 15:29 unix.txt
-rw-r--r--. 1 root root 7 Jul 20 15:30 win.txt
[root@centos6 app]#chown :admins f1 ---只更改所属组
[root@centos6 app]#ll
total 36
-rw-r--r--. 1 zhang admins 6 Jul 21 20:56 f1
drwxr-xr-x. 2 root root 4096 Jul 22 09:17 f11
-rw-r--r--. 1 harry admins 38 Jul 21 21:17 f2
-rw-r--r--. 1 root root 97 Jul 21 09:38 fa
-rw-r--r--. 1 root root 6 Jul 21 10:15 fb
drwx------. 4 natasha natasha 4096 Jul 21 16:01 natashaxinjia
-rw-r--r--. 1 root root 41 Jul 21 16:06 passwd.txt
-rw-r--r--. 1 root root 6 Jul 20 15:29 unix.txt
-rw-r--r--. 1 root root 7 Jul 20 15:30 win.txt