linux-tutorial/docs/linux/commands/系统管理/用户和工作组管理.md
2018-02-28 09:43:42 +08:00

678 lines
21 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: linux 常用命令-用户和工作组管理
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-用户和工作组管理](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E7%94%A8%E6%88%B7%E5%92%8C%E5%B7%A5%E4%BD%9C%E7%BB%84%E7%AE%A1%E7%90%86)
- [groupadd](#groupadd)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [groupdel](#groupdel)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [groupmod](#groupmod)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [useradd](#useradd)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [userdel](#userdel)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [usermod](#usermod)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [passwd](#passwd)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [知识扩展](#%E7%9F%A5%E8%AF%86%E6%89%A9%E5%B1%95)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [su](#su)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [sudo](#sudo)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-用户和工作组管理
## groupadd
用于创建一个新的工作组
### 补充说明
**groupadd命令** 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
### 语法
```
groupadd(选项)(参数)
```
### 选项
```
-g指定新建工作组的id
-r创建系统工作组系统工作组的组ID小于500
-K覆盖配置文件“/ect/login.defs”
-o允许添加组ID号不唯一的工作组。
```
### 参数
组名:指定新建工作组的组名。
### 实例
建立一个新组并设置组ID加入系统
```
groupadd -g 344 jsdigname
```
此时在`/etc/passwd`文件中产生一个组IDGID是344的项目。
## groupdel
用于删除指定的工作组
### 补充说明
**groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户则必须先删除这些用户后方能删除群组。
### 语法
```
groupdel(参数)
```
### 参数
组:要删除的工作组名。
### 实例
```
groupadd damon //创建damon工作组
groupdel damon //删除这个工作组
```
## groupmod
更改群组识别码或名称
### 补充说明
**groupmod命令** 更改群组识别码或名称。需要更改群组的识别码或名称时可用groupmod指令来完成这项工作。
### 语法
```
groupmod(选项)(参数)
```
### 选项
```
-g<群组识别码>:设置欲使用的群组识别码;
-o重复使用群组识别码
-n<新群组名称>:设置欲使用的群组名称。
```
### 参数
组名:指定要修改的工作的组名。
## useradd
创建的新的系统用户
### 补充说明
**useradd命令** 用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后再用passwd设定帐号的密码而可用userdel删除帐号。使用useradd指令所建立的帐号实际上是保存在`/etc/passwd`文本文件中。
在Slackware中adduser指令是个script程序利用交谈的方式取得输入的用户帐号资料然后再交由真正建立帐号的useradd命令建立新用户如此可方便管理员建立用户帐号。在Red Hat Linux中 **adduser命令** 则是useradd命令的符号连接两者实际上是同一个指令。
### 语法
```
useradd(选项)(参数)
```
### 选项
```
-c<备注>加上备注文字。备注文字会保存在passwd的备注栏位中
-d<登入目录>:指定用户登入时的启始目录;
-D变更预设值
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m自动建立用户的登入目录
-M不要自动建立用户的登入目录
-n取消建立以用户名称为名的群组
-r建立系统帐号
-s<shell>指定用户登入后所使用的shell
-u<uid>指定用户id。
```
### 参数
用户名:要创建的用户名。
### 实例
新建用户加入组:
```
useradd g sales jack G company,employees //-g加入主要组、-G加入次要组
```
建立一个新用户账户并设置ID
```
useradd caojh -u 544
```
需要说明的是设定ID值时尽量要大于500以免冲突。因为Linux安装后会建立一些特殊用户一般0到499之间的值留给bin、mail这样的系统账号。
## userdel
用于删除给定的用户以及与用户相关的文件
### 补充说明
**userdel命令** 用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
### 语法
```
userdel(选项)(参数)
```
### 选项
```
-f强制删除用户即使用户当前已登录
-r删除用户的同时删除与用户相关的所有文件。
```
### 参数
用户名:要删除的用户名。
### 实例
userdel命令很简单比如我们现在有个用户linuxde其家目录位于`/var`目录中,现在我们来删除这个用户:
```
userdel linuxde //删除用户linuxde但不删除其家目录及文件
userdel -r linuxde //删除用户linuxde其家目录及文件一并删除
```
请不要轻易用`-r`选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在`/etc/passwd`中删除您想要删除用户的记录;但最好不要这样做,`/etc/passwd`是极为重要的文件,可能您一不小心会操作失误。
## usermod
用于修改用户的基本信息
### 补充说明
**usermod命令** 用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NIS server须在server上更动相关的NIS设定。
### 语法
```
usermod(选项)(参数)
```
### 选项
```
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L锁定用户密码使密码无效
-s<shell>修改用户登入后所使用的shell
-u<uid>修改用户ID
-U:解除密码锁定。
```
### 参数
登录名:指定要修改信息的用户登录名。
### 实例
将newuser2添加到组staff中
```
usermod -G staff newuser2
```
修改newuser的用户名为newuser1
```
usermod -l newuser1 newuser
```
锁定账号newuser1
```
usermod -L newuser1
```
解除对newuser1的锁定
```
usermod -U newuser1
```
## passwd
用于让用户可以更改自己的密码
### 补充说明
**passwd命令** 用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
### 语法
```
passwd(选项)(参数)
```
### 选项
```
-d删除密码仅有系统管理者才能使用
-f强制执行
-k设置只有在密码过期失效后方能更新
-l锁住密码
-s列出密码的相关信息仅有系统管理者才能使用
-u解开已上锁的帐号。
```
### 参数
用户名:需要设置密码的用户名。
### 知识扩展
与用户、组账户信息相关的文件
存放用户信息:
```
/etc/passwd
/etc/shadow
```
存放组信息:
```
/etc/group
/etc/gshadow
```
用户信息文件分析(每项用`:`隔开)
```
例如jack:X:503:504:::/home/jack/:/bin/bash
jack  //用户名
X  //口令、密码
503  //用户id0代表root、普通新建用户从500开始
504  //所在组
:  //描述
/home/jack/  //用户主目录
/bin/bash  //用户缺省Shell
```
组信息文件分析
```
例如jack:$!$:???:13801:0:99999:7:*:*:
jack  //组名
$!$  //被加密的口令
13801  //创建日期与今天相隔的天数
0  //口令最短位数
99999  //用户口令
7  //到7天时提醒
*  //禁用天数
*  //过期天数
```
### 实例
如果是普通用户执行passwd只能修改自己的密码。如果新建用户后要为新用户创建密码则用passwd用户名注意要以root用户的权限来创建。
```
[root@localhost ~]# passwd linuxde //更改或创建linuxde用户的密码
Changing password for user linuxde.
New UNIX password: //请输入新密码;
Retype new UNIX password: //再输入一次;
passwd: all authentication tokens updated successfully. //成功;
```
普通用户如果想更改自己的密码直接运行passwd即可比如当前操作的用户是linuxde。
```
[linuxde@localhost ~]$ passwd
Changing password for user linuxde. //更改linuxde用户的密码
(current) UNIX password: //请输入当前密码;
New UNIX password: //请输入新密码;
Retype new UNIX password: //确认新密码;
passwd: all authentication tokens updated successfully. //更改成功;
```
比如我们让某个用户不能修改密码,可以用`-l`选项来锁定:
```
[root@localhost ~]# passwd -l linuxde //锁定用户linuxde不能更改密码
Locking password for user linuxde.
passwd: Success //锁定成功;
[linuxde@localhost ~]# su linuxde //通过su切换到linuxde用户
[linuxde@localhost ~]$ passwd //linuxde来更改密码
Changing password for user linuxde.
Changing password for linuxde
(current) UNIX password: //输入linuxde的当前密码
passwd: Authentication token manipulation error //失败,不能更改密码;
```
再来一例:
```
[root@localhost ~]# passwd -d linuxde //清除linuxde用户密码
Removing password for user linuxde.
passwd: Success //清除成功;
[root@localhost ~]# passwd -S linuxde //查询linuxde用户密码状态
Empty password. //空密码,也就是没有密码;
```
注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。
## su
用于切换当前用户身份到其他用户身份
### 补充说明
**su命令** 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
### 语法
```
su(选项)(参数)
```
### 选项
```
-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
-f或——fast适用于csh与tsch使shell不用去读取启动文件
-l或——login改变身份时也同时变更工作目录以及HOME,SHELL,USER,logname。此外也会变更PATH变量
-m,-p或--preserve-environment变更身份时不要变更环境变量
-s<shell>或--shell=<shell>指定要执行的shell
--help显示帮助
--version显示版本信息。
```
### 参数
用户:指定要切换身份的目标用户。
### 实例
变更帐号为root并在执行ls指令后退出变回原使用者
```
su -c ls root
```
变更帐号为root并传入`-f`选项给新执行的shell
```
su root -f
```
变更帐号为test并改变工作目录至test的家目录
```
su -test
```
## sudo
以其他身份来执行命令
### 补充说明
**sudo命令** 用来以其他身份来执行命令预设的身份为root。在`/etc/sudoers`中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo则会发出警告的邮件给管理员。用户使用sudo时必须先输入密码之后有5分钟的有效期限超过期限则必须重新输入密码。
### 语法
```
sudo(选项)(参数)
```
### 选项
```
-b在后台执行指令
-h显示帮助
-H将HOME环境变量设为新身份的HOME环境变量
-k结束密码的有效期限也就是下次再执行sudo时便需要输入密码
-l列出目前用户可执行与无法执行的指令
-p改变询问密码的提示符号
-s<shell>执行指定的shell
-u<用户>以指定的用户作为新的身份。若不加上此参数则预设以root作为新的身份
-v延长密码有效期限5分钟
-V :显示版本信息。
```
### 参数
指令:需要运行的指令和对应的参数。
### 实例
```
$ sudo su -
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'
```
这个命令相当于使用root超级用户重新登录一次shell只不过密码是使用的当前用户的密码。而且重要是该命令会 **重新加载/etc/profile文件以及/etc/bashrc文件等系统配置文件并且还会重新加载root用户的$SHELL环境变量所对应的配置文件** 比如root超级用户的$SHELL是/bin/bash则会加载/root/.bashrc等配置。如果是/bin/zsh则会加载/root/.zshrc等配置执行后是完全的root环境。
```
$ sudo -i
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'
```
这个命令基本与 `sudo su -` 相同执行后也是root超级用户的环境只不过是多了一些当前用户的信息。
```
$ sudo -s
# env|grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)' --color
```
这个命令相当于 **以当前用户的$SHELL开启了一个root超级用户的no-login的shell不会加载/etc/profile等系统配置** 。所以/etc/profile文件中定义的TEST_ETC环境变量就看不到了但是会**加载root用户对应的配置文件**比如root用户的$SHELL是/bin/zsh那么会加载/root/.zshrc配置文件执行完后不会切换当前用户的目录。
配置sudo必须通过编辑`/etc/sudoers`文件而且只有超级用户才可以修改它还必须使用visudo编辑。之所以使用visudo有两个原因一是它能够防止两个用户同时修改它二是它也能进行有限的语法检查。所以即使只有你一个超级用户你也最好用visudo来检查一下语法。
visudo默认的是在vi里打开配置文件用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件它会提示你出现的问题并询问该如何处理就像
```
>>> sudoers file: syntax error, line 22 <<
```
此时我们有三种选择键入“e”是重新编辑键入“x”是不保存退出键入“Q”是退出并保存。如果真选择Q那么sudo将不会再运行直到错误被纠正。
现在我们一起来看一下神秘的配置文件学一下如何编写它。让我们从一个简单的例子开始让用户Foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件可以看到类似下面几行
```
# Runas alias specification
# User privilege specificationroot ALL=(ALL)ALL
```
我们一看就明白个差不多了root有所有权限只要仿照现有root的例子就行我们在下面加一行最好用tab作为空白
```
foobar ALL=(ALL) ALL
```
保存退出后切换到foobar用户我们用它的身份执行命令
```
[foobar@localhost ~]$ ls /root
ls: /root: 权限不够
[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog
```
好了我们限制一下foobar的权利不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig把那一行改为
```
foobar localhost= /sbin/ifconfig, /bin/ls
```
再来执行命令:
```
[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.
[foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...
```
现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机我们后面把它改成了主机名它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令这样编写配置文件
```
foobar linux=(jimmy,rene) /bin/kill
```
但这还有个问题foobar到底以jimmy还是rene的身份执行这时我们应该想到了`sudo -u`了,它正是用在这种时候。 foobar可以使用`sudo -u jimmy kill PID`或者`sudo -u rene kill PID`,但这样挺麻烦,其实我们可以不必每次加`-u`把rene或jimmy设为默认的目标用户即可。再在上面加一行
```
Defaults:foobar runas_default=rene
```
Defaults后面如果有冒号是对后面用户的默认如果没有则是对所有用户的默认。就像配置文件中自带的一行
```
Defaults env_reset
```
另一个问题是很多时候我们本来就登录了每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢当然可以我们这样修改配置文件
```
foobar localhost=NOPASSWD: /bin/cat, /bin/ls
```
再来sudo一下
```
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log
install.log.syslog
```
当然你也可以说“某些命令用户foobar不可以运行”通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的一个用户完全可以把那个命令拷贝到别的地方换一个名字后再来运行。
**日志与安全**
sudo为安全考虑得很周到不仅可以记录日志还能在有必要时向系统管理员报告。但是sudo的日志功能不是自动的必须由管理员开启。这样来做
```
touch /var/log/sudo
vi /etc/syslog.conf
```
在syslog.conf最后面加一行必须用tab分割开并保存
```
local2.debug /var/log/sudo
```
重启日志守候进程,
```
ps aux grep syslogd
```
把得到的syslogd进程的PID输出的第二列是PID填入下面
```
kill HUP PID
```
这样sudo就可以写日志了
```
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root
```
不过有一个小小的“缺陷”sudo记录日志并不是很忠实
```
[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow
```
重定向没有被记录在案为什么因为在命令运行之前shell把重定向的工作做完了sudo根本就没看到重定向。这也有个好处下面的手段不会得逞
```
[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够
```
sudo 有自己的方式来保护安全。以root的身份执行`sudo-V`查看一下sudo的设置。因为考虑到安全问题一部分环境变量并没有传递给sudo后面的命令或者被检查后再传递的比如PATHHOMESHELL等。当然你也可以通过sudoers来配置这些环境变量。