摘要
本文讲解LINUX下用户/用户组,文件属性及修改,SUDO免密登录,SSH互信免密登录,VIM,history等命令操作实践。
用户和用户组管理
参考:
(1) Linux 用户和用户组管理 https://www.runoob.com/linux/linux-user-manage.html
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改。
- 用户口令的管理。
- 用户组的管理。
1、添加新的用户账号使用useradd命令
代码语言:javascript复制useradd 选项 用户名
参数说明:
- 选项:
- -c comment 指定一段注释性描述。
- -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
- -g 用户组 指定用户所属的用户组。
- -G 用户组,用户组 指定用户所属的附加组。
- -s Shell文件 指定用户的登录Shell。
- -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
- 用户名: 指定新账号的登录名。
例如:
代码语言:javascript复制# useradd -s /bin/bash -g root -d /home/duncan duncan
增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。
2、删除帐号
如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。
删除一个已有的用户账号使用userdel
命令,其格式如下:
userdel 选项 用户名
常用的选项是 -r,它的作用是把用户的主目录一起删除。
例如:
代码语言:javascript复制# userdel -r duncan
此命令删除用户duncan在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。
3、修改帐号
修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
修改已有用户的信息使用usermod
命令,其格式如下:
usermod 选项 用户名
常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等
,这些选项的意义与useradd
命令中的选项一样,可以为用户指定新的资源值。
4、用户口令的管理
用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
指定和修改用户口令的Shell命令是passwd
。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:
passwd 选项 用户名
可使用的选项:
- -l 锁定口令,即禁用账号。
- -u 口令解锁。
- -d 使账号无口令。
- -f 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令。
例如:
代码语言:javascript复制# passwd duncan
New password:
Retype new password:
passwd: password updated successfully
chmod/chown(文件基本属性)
参考:
(1) Linux 文件基本属性 https://www.runoob.com/linux/linux-file-attr-permission.html (2) Linux chown 命令 https://www.runoob.com/linux/linux-comm-chown.html (3) Linux chmod命令 https://www.runoob.com/linux/linux-comm-chmod.html
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:
- chown (change ownerp) : 修改所属用户与组。
- chmod (change mode) : 修改用户的权限。
下图中通过 chown 来授权用户,通过 chmod 为用户设置可以开门的权限。
img
ls-l文件属性说明
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:
代码语言:javascript复制[root@www /]# ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
……
实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为 d 则是目录
- 当为 - 则是文件;
- 若是 l 则表示为链接文档(link file);
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
img
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
363003_1227493859FdXT
chown更改文件属主/属组
更改文件属主,也可以同时更改文件属组
语法:
代码语言:javascript复制chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
例如,将install.log的拥有者与群组改为root:
代码语言:javascript复制[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
chmod:更改文件9个属性
Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。
文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
- r:4
- w:2
- x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: -rwxrwx--- 分数则是:
- owner = rwx = 4 2 1 = 7
- group = rwx = 4 2 1 = 7
- others= --- = 0 0 0 = 0
数字改变文件属性
代码语言:javascript复制chmod 777 file
符号改变文件属性
使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:
who | 用户类型 | 说明 |
---|---|---|
u | user | 文件所有者 |
g | group | 文件所有者所在组 |
o | others | 所有其他用户 |
a | all | 所用用户, 相当于 ugo |
operator 的符号模式表:
Operator | 说明 |
---|---|
| 为指定的用户类型增加权限 |
- | 去除指定用户类型的权限 |
= | 设置指定用户权限的设置,即将用户类型的所有权限重新设置 |
permission 的符号模式表:
模式 | 名字 | 说明 |
---|---|---|
r | 读 | 设置为可读权限 |
w | 写 | 设置为可写权限 |
x | 执行权限 | 设置为可执行权限 |
X | 特殊执行权限 | 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 |
s | setuid/gid | 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 |
t | 粘贴位 | 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位 |
例如
代码语言:javascript复制chmod ug w,o-w file1.txt file2.txt
vi/vim 编辑文本
按键 | 功能 |
---|---|
移动光标的方法 | |
G | 移动到这个档案的最后一行(常用) |
nG | n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) |
gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) |
搜索替换 | |
/word | 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用) |
?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
n | 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串! |
N | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 |
删除、复制与粘贴 | |
dd | 删除游标所在的那一整行(常用) |
特殊命令 | |
:set paste | 复制粘贴不自动缩进 |
ggVG | gg 让光标移到首行,在vim才有效,vi中无效V 是进入Visual(可视)模式G 光标移到最后一行选中内容以后就可以其他的操作了: d 删除选中内容y 复制选中内容到0号寄存器" y 复制选中内容到+寄存器,也就是系统的剪贴板,供其他程序用(未成功) |
history(ctrl r)搜索历史命令
使用 HISTTIMEFORMAT 显示时间戳
当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身,如果你想要查看命令历史的时间戳,那么可以执行:
代码语言:javascript复制# export HISTTIMEFORMAT='%F %T '
# history | more
1 2008-08-05 19:02:39 service network restart
2 2008-08-05 19:02:39 exit
3 2008-08-05 19:02:39 id
4 2008-08-05 19:02:39 cat /etc/redhat-release
注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。
使用 ctrl r 搜索历史
(1) ctrl r 就是反向搜索执行过的命令。(reverse-i-search); 然后连续ctrl r则继续向上搜索关键字的历史记录。
(2) 采用上下箭头也能搜索上面的历史记录。
代码语言:javascript复制 1284 2021-05-23 15:21:38 ls
1285 2021-05-23 15:21:38 clear
1286 2021-05-23 15:21:38 ls
1287 2021-05-23 15:21:38 cd logs/
1288 2021-05-23 15:21:38 ls
(reverse-i-search)`ls': ls -la
从命令历史中执行一个指定的命令
在下面的例子中,如果你想重复执行第 4 条命令,那么可以先退出历史记录,然后执行 !4:
代码语言:javascript复制# history | more
1 service network restart
2 exit
3 id
4 cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)
使用 -c 选项清除所有的命令历史
如果你想清除所有的命令历史,可以执行:
代码语言:javascript复制# history -c
控制显示条数和筛选
代码语言:javascript复制# 显示10条历史记录命令
history 10
# 显示关键字为geth的命令
history |more |grep geth
sudo免密码
参考:
(1) Linux中普通用户配置sudo权限(带密或免密)https://www.cnblogs.com/zhangwuji/p/9947768.html
配置步骤如下:
1、登陆或切换到root用户下;
2、添加sudo文件的写权限,命令是:chmod u w /etc/sudoers
3、编辑sudoers文件:vi /etc/sudoers
找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (注:这里的xxx是你的用户名)
你可以根据实际需要在sudoers文件中按照下面四行格式中任意一条进行添加:
代码语言:javascript复制youuser ALL=(ALL) ALL
%youuser ALL=(ALL) ALL
youuser ALL=(ALL) NOPASSWD: ALL
%youuser ALL=(ALL) NOPASSWD: ALL
第一行:允许用户youuser执行sudo命令(需要输入密码)。 第二行:允许用户组youuser里面的用户执行sudo命令(需要输入密码)。 第三行:允许用户youuser执行sudo命令,并且在执行的时候不输入密码。 第四行:允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码。
4、撤销sudoers文件写权限,命令:chmod u-w /etc/sudoers
5、至此,普通用户就可以使用sudo了。
以 youuser
用户登录到部署目标机器后,执行以下命令,不需要输入密码并切换到 root
用户,表示 youuser
用户 sudo 免密码配置成功。
sudo -su root
修改PATH及生效方法
参考:
(1 )Linux中修改环境变量及生效方法
方法一:
在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
要让刚才的修改马上生效,需要执行以下代码
# source /etc/profile
方法二:
在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
要让刚才的修改马上生效,需要在用户目录下执行以下代码
# source .bash_profile
方法三:
直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
例如:export PATH=/usr/local/webserver/php/bin:$PATH
SSH互信公私钥对登录
参考:
(1)Linux下实现免密码登录(超详细) https://www.cnblogs.com/yixue2017/p/7559970.html
(2)Linux 普通用户之间免密登陆 https://www.cnblogs.com/klb561/p/8688263.html
(3)Linux下SSH免密码登录配置详解 https://www.jb51.net/article/168598.htm
实施:
(1) 同台机器之间实现普通用户duncan免密登录root账号
普通用户之间的免密登陆和 使用root 进行免密登陆,基本设置都是一样的,只不过普通用户之间需要修改 .ssh 和 authorized_keys 的权限免密才能生效。
[1] 切换用户到duncan登录状态下,生成公私钥对,一路回车生成公私钥对。
代码语言:javascript复制/home# mkdir duncan
/home# chown duncan:root duncan
/home# su - duncan
~$ ssh-keygen
~$ ls -la
total 12
drwxr-xr-x 3 duncan root 4096 May 23 17:08 .
drwxr-xr-x 4 root root 4096 May 23 17:05 ..
drwx------ 2 duncan root 4096 May 23 17:08 .ssh
文件说明:
代码语言:javascript复制authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
know_hosts : 已知的主机公钥清单
如果希望ssh公钥生效访问账户针对被访账户文件目录需满足至少下面两个条件:
1) .ssh目录的权限必须是700
2) .ssh/authorized_keys文件权限必须是600
建议root及duncan的以上文件夹及文件都改为777吧。
[2] 在duncan用户登录下执行命令,把他的公钥加到远程免密登录的公钥授权文件authorized_keys。
代码语言:javascript复制~$ssh-copy-id -i ~/.ssh/id_rsa.pub 127.0.0.1
##ls命令可以看到这样操作后增加了authorized_keys/known_hosts文件。
~/.ssh$ ls -l
[3] 尝试免密登录
以下方式登录不需要密码则为免密登录设置成功。
代码语言:javascript复制ssh '127.0.0.1'
(2) 机器A普通用户duncan免密登录另外一台机器B
[1] 已存证duncan的公司钥对。
[2] 在duncan用户登录下执行命令,把duncan的公钥加到root账户的远程免密登录的公钥授权文件authorized_keys。
代码语言:javascript复制~$ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.19.23.50
[3] 尝试免密登录
以下方式登录不需要密码则为免密登录设置成功。
代码语言:javascript复制ssh 'root@172.19.23.50'