查看信息

查看文件、文件夹的filesystem metadata

# 查看**单个**文件、文件夹的权限信息
stat filename
# 或者使用以下命令来查看当前目录下**所有**文件、文件夹的权限信息
ls -la # 显示username、groupname
ls -na # 显示userid、groupid
ls -l每个列的含义:这篇博客

查询用户、群组信息

# 查看当前用户(准确地说是当前bash进程的拥有者)的信息:
id

# 查看指定用户的信息:
id username
id userid

# 查看当前用户(准确地说是当前bash进程的拥有者)的所有群组:
groups

# 查看指定用户的所有群组(注意该命令必须输入username,不能是userid):
groups username

# 查看**所有**用户的信息:
cat /etc/passwd

# 查看**所有**群组的信息:
cat /etc/group

current group

执行id命令以后你会看到返回结果包括gid和groups。关于gid 与groups 的区别:gid只是当前登陆群组, 而groups列出了用户所在的所有群组。用户所在的群组可以有很多,但是在任何一个时刻,一个用户只能登陆一个群组。后面面会介绍newgrp命令,使用它,用户可以切换到其他群组。

primary group 和 supplementary group

用户所在的群组可以有很多,可以指定其中一个为主群组(primary group),剩下的都是supplementary group。主群组是 GUI登陆、打开命令行窗口、ssh登陆 以后的默认登陆群组
修改primary group和supplementary group的usermod命令下面会讲到。

What is the difference between primary group and secondary group in Ubuntu?

Real User ID, Effective User ID, Saved User ID

在查看一些命令的manuals时(比如id),你可能会注意到userid还分为Real User ID, Effective User ID, Saved User ID三种。每个进程的描述表(process descriptor table)都存储了这三种UID。

Linux进程权限的研究——real user id, effective user id, saved set-user-id
User_identifier - wikipedia
Difference between Real User ID, Effective User ID and Saved User ID

查看系统中所有的进程以及进程的拥有者

ps aux

ps命令非常强大,几乎能给你所有需要的进程信息!设置几个参数就能让它输出我们想要的进程信息:

ps --pid 25138 -O uid,uname,gid,group,ppid

上面的参数表示,我要查看pid为6685的进程,并且除了默认的列以外,多展示几列:uid,uname,gid,group,ppid
输出如下:

ps manuals中,能找到这个命令的更多用法、更多可以展示的列:

在docker容器内使用ps命令

docker容器内的bash使用ps命令时,很有可能会提示你ps命令不存在,这是因为docker image经常精简掉了ps程序(毕竟docker容器中一般只运行一个进程)。这个时候使用

apt-get update && apt-get install procps

来安装ps

在中国连接国外的Ubuntu软件源服务器可能会非常慢,这时你应该改一下ubuntu的软件源(通过系统设置就能改)。
如果你在docker容器内使用apt,你需要手动改变软件源。先通过Ubuntu Sources List Generator定制符合你需要的sources.list文件(至少要选择"Main - Officially supported software."这一项),然后将这个文件放在容器内的路径/etc/apt/sources.list(可以使用命令docker cp ./sources.list 容器名称:/etc/apt/sources.list或者Dockerfile的COPY ./sources.list /etc/apt/sources.list指令)。

修改文件元信息

chmod修改文件、文件夹的权限

# 修改文件、文件夹的权限(如果要修改不属于当前用户的文件,还需要使用sudo)
chmod 755 filename

# 递归修改文件夹、文件夹内所有文件的权限(注意要使用sudo和-R)
sudo chmod 777 -R /path/to/directory

chown修改文件的拥有者、拥有群组

执行这种修改时,必须使用sudo。

# 修改文件/文件夹的owner
sudo chown username filename

# 修改文件/文件夹的group
sudo chown :groupname filename

# 同时修改文件/文件夹的owner和group
sudo chown username:groupname filename

# 加上-R参数,能够递归修改文件夹、文件夹内的所有文件!

上面的username、groupname也可以用userid、groupid代替。使用userid、groupid有一个很方便的地方:userid、groupid可以不存在于当前系统中,这在使用docker bind-mount volume的时候很有用

参考ubuntu doc

修改用户、群组信息

新建和删除

新建用户、群组有关的工作,分别交给以下两个命令:
adduser
addgroup

adduser和addgroup的manuals页面其实是一模一样的,它们的功能是很相似的,只不过adduser对应于user,addgroup对应于group。
使用这两个命令可以做到这几件事:

  1. 新建一个normal user

    adduser  [options]  [--home  DIR]  [--shell  SHELL]  [--no-create-home]
      [--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid  ID]
      [--disabled-password]      [--disabled-login]      [--gecos      GECOS]
      [--add_extra_groups] [--encrypt-home] user
  2. 新建一个system user

    adduser --system [options] [--home DIR] [--shell  SHELL]  [--no-create-
    home]  [--uid  ID]  [--group | --ingroup GROUP | --gid ID] [--disabled-
    password] [--disabled-login] [--gecos GECOS] user
  3. 新建一个user group

    addgroup [options] [--gid ID] group
  4. 新建一个system group

    addgroup --system [options] [--gid ID] group
  5. 将一个已经存在的user加入到一个已经存在的group中

    adduser [options] user group

这五种功能的解释,以及每种功能可以使用的参数,都在manuals有详细的解释。

同理,对于用户、群组的删除,分别有deluserdelgroup,它们的manuals也是一模一样的。

修改已有用户、用户组

修改已有用户、用户组有关的工作,分别交给以下两个命令:
usermod
groupmod

对于usermod,比较常用的参数有--gid --groups --uid,它们分别修改用户的 主群组、额外加入的群组、用户id 。

对于groupmod,比较常用的参数有--gid --new-name,它们分别修改群组的id、群组的名称。

切换用户、切换群组

切换用户

在bash中切换用户以后,通过这个bash执行的子程序,会以新的用户身份来完成。

注意,仅仅是当前bash进程的拥有者改变了。并不像windows那样注销整个系统再以新用户登陆!

这个回答所讲,在命令行中切换用户只需要通过以下命令:

su - username

切换群组

前面已经说过,一个用户可以加入多个群组,但是任何一个时刻只能登陆一个群组。要切换当前用户所登陆的群组,使用newgrp命令。

newgrp - groupname

练手教程

新建用户并加入sudo用户组


csRyan
1.1k 声望198 粉丝

So you're passionate? How passionate? What actions does your passion lead you to do? If the heart doesn't find a perfect rhyme with the head, then your passion means nothing.