2018-02-27 17:29:23 +08:00
---
title: linux 常用命令-用户和工作组管理
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
2018-02-28 09:43:42 +08:00
<!-- 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 -->
2018-02-27 17:29:23 +08:00
# linux 常用命令-用户和工作组管理
## groupadd
用于创建一个新的工作组
### 补充说明
**groupadd命令** 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
### 语法
```
groupadd(选项)(参数)
```
### 选项
```
-g: 指定新建工作组的id;
-r: 创建系统工作组, 系统工作组的组ID小于500;
-K: 覆盖配置文件“/ect/login.defs”;
-o: 允许添加组ID号不唯一的工作组。
```
### 参数
组名:指定新建工作组的组名。
### 实例
建立一个新组, 并设置组ID加入系统:
```
groupadd -g 344 jsdigname
```
此时在`/etc/passwd`文件中产生一个组ID( GID) 是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 //用户id( 0代表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
2018-02-28 09:43:42 +08:00
```
## 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后面的命令, 或者被检查后再传递的, 比如: PATH, HOME, SHELL等。当然, 你也可以通过sudoers来配置这些环境变量。