一, 输入输出的重定向
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.
用户与权限
来源: http://www.bubuko.com/infodetail-2607165.html