一、输入输出的重定向
1.1作用
1)输入重定向把文件导入命令中
2)输出重定向把原本输出到屏幕的数据写入到文本中
3)标准输入重定向 STDIN 文件描述符0 默认从键盘输入
标准输出重定向 STDOUT文件描述符1 默认输出到屏幕
错误输出重定向 STDERR 文件描述符2 默认输出到屏幕
[root@rhel6 ~]# ls //标准输出重定向
anaconda-ks.cfg Documents install.log Music Public Videos
Desktop Downloads install.log.syslog Pictures Templates
[root@rhel6 ~]# ls -l test //错误输出重定向
ls: cannot access test: No such file or directory
1.2输入重定向 (<)
符号 | 作用 |
命令 < | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
[root@RHEL6 ~]# wc -l < test
4
[root@RHEL6 ~]# wc -l << test
> test1
> test
1
[root@RHEL6 ~]# wc -l < install.log > count
[root@RHEL6 ~]# cat count
638
1.3输出重定向 (<)
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件2>&1 | 将两种输出都重定向到一个文件中(追加到原有内容的后面) |
[root@RHEL6 ~]# echo hello > test
[root@RHEL6 ~]# cat test
hello
[root@RHEL6 ~]# echo world >> test
[root@RHEL6 ~]# cat test
hello
world
[root@RHEL6 ~]# ls -l tset
ls: cannot access tset: No such file or directory
[root@RHEL6 ~]# ls -l tset 2> err
[root@RHEL6 ~]# cat err
ls: cannot access tset: No such file or directory
[root@RHEL6 ~]# cat test
hello
world
[root@RHEL6 ~]# ls -l install.log tset >>test 2>&1
[root@RHEL6 ~]# cat test
hello
world
ls: cannot access tset: No such file or directory
-rw-r--r--. 1 root root 27794 Apr 4 00:26 install.log
二、环境变量
变量是用于保留可变值的数据类型,一般大写
2.1常见的环境变量
变量名称 | 作用 |
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 Bash | 解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
[root@RHEL6 ~]# echo $HOME
/root
[root@RHEL6 ~]# echo $PS1
[\u@\h \W]\$
[root@RHEL6 ~]# echo $HISTFILESIZE
1000
2.2系统执行命令的过程
1)当输入命令时,系统会先判断输入的命令是以绝对路径还是相对路径方式输入
2)检测命令是否为别名命令(设置别名:alias 别名=’命令’,取消别名:unalia
别名)
[root@RHEL6 ~]# alias rm
alias rm='rm -i'
[root@RHEL6 ~]# rm test
rm: remove regular file `test'? y
[root@RHEL6 ~]# unalias rm
[root@RHEL6 ~]# alias rm
-bash: alias: rm: not found
3)bash解释器判断命令是内部命令(直接执行) 还是外部命令(通过PATH寻找路径),
通过type命令查看
[root@RHEL6 ~]# type cat
cat is /bin/cat //外部
[root@RHEL6 ~]# type help
help is a shell builtin //内部
4)系统在多个路径中查找用户输入的命令文件,定于路径的变量就是PATH
[root@RHEL6 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
2.3自定义环境变量
[root@RHEL6 ~]# mkdir /home/toor
[root@RHEL6 ~]# TOOR=/home/toor
[root@RHEL6 ~]# echo $TOOR
/home/toor
三、用户与用户组
由于linux是个多用户多任务操作系统,所以所有文件都具有所有者(属主)、所属组和
其他人以及对应的对文件的读(r)写(w)执行(x)权限
3.1用户身份和能力
3.1.1 Linux中有三类用户:
1) 超级用户(默认为root),UID=GID=0的用户
2) 系统用户,UID范围1-499,使某些服务让具备特殊用途的用户单独负责,比如apache用户(web服务)
3) 普通用户,通过root用户创建的,默认从500开始
[root@RHEL6 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
tom:x:500:500::/home/tom:/bin/bash
3.1.2 用户和组的关系:
一对一 、一对多、多对一 和多对多
3.2对于用户和用户组的增删改查
3.2.1 增加(useradd和groupadd):
参数 | 作用 |
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
3.2.2 删除(userdel和groupdel):
参数 | 作用 |
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录(尽量不用,用于恢复用户) |
3.3修改用户属性(usermod 和 groupmod)
参数 | 作用 |
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
修改tom用户的家目录为/home/tom:
[root@RHEL6 ~]# cat /etc/passwd
tom:x:500:500::-m:/bin/bash
[root@RHEL6 ~]# usermod -d /home/tom/ tom
[root@RHEL6 ~]# cat /etc/passwd
tom:x:500:500::/home/tom/:/bin/bash
禁止tom登陆系统:
[root@RHEL6 ]# usermod -L tom
[root@RHEL6 ]# cat /etc/shadow | grep tom
tom:!$6$reaDcnmR$odgjNjN926ygJ5
3.4 passwd命令
用于修改用户密码(普通用户只能修改自己的密码,root用户可以修改所有人的密码):
参数 | 作用 |
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
--stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd –stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
[root@RHEL6 ]# passwd -u tom
Unlocking password for user tom.
passwd: Success
[root@RHEL6 ]# cat /etc/shadow | grep tom
tom:$6$reaDcnmR$odgjNjN926ygJ5
[root@RHEL6 ]# echo "1234" | passwd --stdin tom
Changing password for user tom.
passwd: all authentication tokens updated successfully.
四、文件权限和归属
4.1文件类型
f /- | 普通文件 |
d | 目录 |
l | 链接 ---- 软链--相当于快捷方式 、 硬链---完整复制 |
b | 块文件---设备--硬盘 光盘 U盘 |
c | 字符文件----虚拟终端 |
s | 数据库文件 |
[root@RHEL6 dev]# ll
total 0
crw-rw----. 1 root root 10, 56 May 10 23:13 autofs
drwxr-xr-x. 2 root root 620 May 10 23:12 block
lrwxrwxrwx. 1 root root 3 May 10 23:12 cdrom –> sr0
4.2文件普通权限(共9位)
前三位 : rwx 满位 ---空位 ---->属主(文件所有者)
中三位 : rwx 满位 ---空位 ---->属组(文件所有组)
后三位 : rwx 满位 ---空位 ---->其他用户
权限 | 含义 | 作用 | 说明 |
r(4) | 可读 | 浏览文件内容 | 浏览目录内的内容(有什么文件但是不一定能看内容) |
w(2) | 可写 | 修改文件内容 | 删除、移动、复制文件 |
x(1) | 可执行 | 脚本文件 | 进入目录内 |
如果文件有w权限,但上层文件夹没有w权限,则无法删除该文件:
[tom@RHEL6 tom]$ ll -d test/
dr-xr-xr-x. 2 root root 4096 May 11 01:56 test/ //555
[root@RHEL6 tom]# ll test/
-rwxrwxrwx. 1 root root 0 May 11 01:50 linux.txt //777
[tom@RHEL6 test]$ rm -rf linux.txt
rm: cannot remove `linux.txt': Permission denied //提示无权限
[root@RHEL6 tom]# chmod o+w test/
[root@RHEL6 tom]# ll
dr-xr-xrwx. 2 root root 4096 May 11 01:56 test //557
[tom@RHEL6 tom]$ rm -rf test/linux.txt
[tom@RHEL6 tom]$ ll test/
total 0 //删除文件成功
4.3文件特殊权限
4.3.1 SUID(setUID)
针对二进制程序设置的,作用就是让普通用户临时获得属主权限
例如:所有的用户名和密码保存在/etc/passwd文件下,这个文件的权限如下:
[root@RHEL6 ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1770 May 11 01:06 /etc/passwd
可以看出passwd文件只支持root修改,这意味着普通用户无法修改密码,但这和实际的
情况是不相符的(普通用户可以修改自己的密码)
我们再来看看passwd命令的权限:
[root@RHEL6 ~]# which passwd
/usr/bin/passwd
[root@RHEL6 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Feb 17 2012 /usr/bin/passwd
可以看到,在x权限位有个s,其作用就是让普通用户可以执行passwd这条命令的权限
那它的权限值又是多少呢?
[root@RHEL6 ~]# stat /usr/bin/passwd
File: `/usr/bin/passwd'
Size: 30768 Blocks: 64 IO Block: 4096 regular file
Device: 802h/2050d Inode: 9118 Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
从上面可以计算出,s的权限值是4000(4755-0755);另外,如果文件本身具备x权限,
那么就是s ,如果没有x 就是S
[root@RHEL6 ~]# chmod 4655 /usr/bin/passwd
[root@RHEL6 ~]# ll /usr/bin/passwd
-rwSr-xr-x. 1 root root 30768 Feb 17 2012 /usr/bin/passwd
4.3.2 SGID(setGID)
和SUID类似,设置属组的特殊权限,如果文件本身具备x权限,那么就是s ,如果没有
x 就是S,权限值是2000
[root@RHEL6 ~]# chmod 6755 /usr/bin/passwd
[root@RHEL6 ~]# ll /usr/bin/passwd
-rwsr-sr-x. 1 root root 30768 Feb 17 2012 /usr/bin/passwd
4.3.3 SBIT(粘滞位)
用于确保用户只能删除自己的文件不能删除别人的,和SUID、SGID类似,如果文件本身
具备x权限,那么就是t ,如果没有x 就是T,权限值是1000
[root@RHEL6 ~]# ll -d /tmp/
drwxrwxrwt. 5 root root 4096 May 11 03:27 /tmp/
[root@RHEL6 ~]# stat /tmp/
File: `/tmp/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 802h/2050d Inode: 393218 Links: 5
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
4.4文件和文件夹的默认权限
先建立一个文件wj和文件夹wjj:
[root@RHEL6 ~]# touch wj
[root@RHEL6 ~]# mkdir wjj
[root@RHEL6 ~]# ll
-rw-r--r--. 1 root root 0 May 11 04:38 wj
drwxr-xr-x. 2 root root 4096 May 11 04:38 wjj
可以看出,文件夹的默认权限是:755;文件的默认权限是:644,这是为什么呢?这是因
为默认情况下目录权限满位是777(目录必须可进),文件权限满位是666(不是所有文件
是脚本文件),文件和文件夹默认都缺少022权限,而这个022正是系统默认的umask值。
因此,可以通过修改umask的值来定义文件和目录的默认权限:
[root@RHEL6 ~]# umask 011
[root@RHEL6 ~]# mkdir wjj2
[root@RHEL6 ~]# touch wj2
[root@RHEL6 ~]# ll
-rw-r--r--. 1 root root 0 May 11 04:38 wj
-rw-rw-rw-. 1 root root 0 May 11 07:41 wj2 //默认为655
drwxr-xr-x. 2 root root 4096 May 11 04:38 wjj
drwxrw-rw-. 2 root root 4096 May 11 07:41 wjj2 //默认为766
4.5 chmod(修改权限命令)
1)数字形式:
chmod 777(rwxrwxrwx)+ 文件名
chmod 777 –R(用于权限传递)+ 目录名
[root@RHEL6 ~]# ll -d wjj
drwxr-xr-x. 2 root root 4096 May 11 08:32 wjj
[root@RHEL6 ~]# ll wjj/
total 0
-rw-r--r--. 1 root root 0 May 11 08:32 wj
[root@RHEL6 ~]# chmod 777 wjj/ -R //修改权限
[root@RHEL6 ~]# ll -d wjj/
drwxrwxrwx. 2 root root 4096 May 11 08:32 wjj/
[root@RHEL6 ~]# ll wjj/
total 0
-rwxrwxrwx. 1 root root 0 May 11 08:32 wj
2)表达式形式:
a:所有 u:用户 g:用户组 o:其他人
+:赋予权限 -:撤销权限 =:覆盖权限
[root@RHEL6 ~]# chmod a-x wjj/
[root@RHEL6 ~]# ll -d wjj/
drw-rw-rw-. 2 root root 4096 May 11 08:32 wjj/
[root@RHEL6 ~]# chmod a=r wjj/wj
[root@RHEL6 ~]# ll wjj/
total 0
-r--r--r--. 1 root root 0 May 11 08:32 wj
4.6 chown(修改文件的属主或属组)
[root@RHEL6 ~]# ll -d wjj/
drw-rw-rw-. 2 root root 4096 May 11 08:32 wjj/
[root@RHEL6 ~]# chown tom wjj/
[root@RHEL6 ~]# ll -d wjj/
drw-rw-rw-. 2 tom root 4096 May 11 08:32 wjj/
[root@RHEL6 ~]# chown lucy:lucy wjj/
[root@RHEL6 ~]# ll -d wjj/
drw-rw-rw-. 2 lucy lucy 4096 May 11 08:32 wjj/
五、su命令 和sudo命令
1)su用于用户切换
从root切换到普通用户是不需要密码的,但是从普通切换到root是需要密码的
单独使用su + 用户名后,默认还是在root用户家目录:
[root@RHEL6 ~]# su tom
[tom@RHEL6 root]$ pwd
/root
使用su - + 用户名后,默认在对应用户的家目录中:
[root@RHEL6 ~]# su - tom
[tom@RHEL6 ~]$ pwd
/home/tom/
2)sudo
用于把特定的命令的执行权限赋予指定用户保证普通用户能够完成特定的工作,避免暴露root密码
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或UID值 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
可以通过配置/etc/sudoers 来提供集中的用户管理、权限和主机参数,也可以通过visudo命令去配置用户权限(只能root)
例如:给用户tom添加passwd权限:
[root@RHEL6 ~]# visudo
找到Allow一行并添加:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(root) /usr/bin/passwd
↑ ↑ ↑
谁可以用 允许使用的主机 = 以谁的身份 可以执行的命令
注意:命令必须为绝对路径命令,否则会报语法错误
验证下:
[root@RHEL6 ~]# su - tom
[tom@RHEL6 ~]$ sudo passwd lucy
[sudo] password for tom: //需要输入tom用户的密码
Changing password for user lucy. //可以修改其他用户密码了
New password:
BAD PASSWORD: it is too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[tom@RHEL6 ~]$ sudo –l
User tom may run the following commands on this host:
(root) /usr/bin/passwd //tom所拥有的root权限
另外,再要执行的命令前加上NOPASSWD:可以直接执行命令而不用输密码
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(root) NOPASSWD:/usr/bin/passwd
[tom@RHEL6 ~]$ sudo passwd lucy
Changing password for user lucy.
New password:
BAD PASSWORD: it is too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.