【总结】LINUX常见易错命令操作

2023-09-25 16:53:53 浏览数 (2)

摘要

本文讲解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命令,其格式如下:

代码语言:javascript复制
userdel 选项 用户名

常用的选项是 -r,它的作用是把用户的主目录一起删除。

例如:

代码语言:javascript复制
# userdel -r duncan

此命令删除用户duncan在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

3、修改帐号

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

修改已有用户的信息使用usermod命令,其格式如下:

代码语言:javascript复制
usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

4、用户口令的管理

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

代码语言:javascript复制
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 免密码配置成功。

代码语言:javascript复制
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'

0 人点赞