查看信息
查看文件、文件夹的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。
使用这两个命令可以做到这几件事:
-
新建一个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
-
新建一个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
-
新建一个user group
addgroup [options] [--gid ID] group
-
新建一个system group
addgroup --system [options] [--gid ID] group
-
将一个已经存在的user加入到一个已经存在的group中
adduser [options] user group
这五种功能的解释,以及每种功能可以使用的参数,都在manuals有详细的解释。
同理,对于用户、群组的删除,分别有deluser和delgroup,它们的manuals也是一模一样的。
修改已有用户、用户组
修改已有用户、用户组有关的工作,分别交给以下两个命令:
usermod
groupmod
对于usermod,比较常用的参数有--gid
--groups
--uid
,它们分别修改用户的 主群组、额外加入的群组、用户id 。
对于groupmod,比较常用的参数有--gid
--new-name
,它们分别修改群组的id、群组的名称。
切换用户、切换群组
切换用户
在bash中切换用户以后,通过这个bash执行的子程序,会以新的用户身份来完成。
注意,仅仅是当前bash进程的拥有者改变了。并不像windows那样注销整个系统再以新用户登陆!
如这个回答所讲,在命令行中切换用户只需要通过以下命令:
su - username
切换群组
前面已经说过,一个用户可以加入多个群组,但是任何一个时刻只能登陆一个群组。要切换当前用户所登陆的群组,使用newgrp命令。
newgrp - groupname
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。