文章

Linux系统维护

AUTOGEN aab1064032154ea7bca7e03e3b6bd182

Linux系统维护

不同于Linux基础,系统维护指的是如何应用Linux系统提供的功能进行基本的内容维护。包括不限于文本操作,文件操作,权限操作,用户操作等。

1. 启动方式

主机上电后,系统启动的默认方式可以是图形界面或是命令行界面

  1. 查看当前的启动方式
1
systemctl get-default

image-20240805222623145

graphical为图形化界面

  1. 使用命令行界面启动
1
systemctl set-default multi-user.target
  1. 使用图形化界面启动
1
systemctl set-default graphical.target

1.2 多用户终端登录

使用Ctrl+Alt+F1~F6最多允许六个用户来登录。如果存在图形界面,那么第一个用户一般为图形界面。在服务器运维中如果存在图形界面操作,需要考虑VNC登录。

1.3 系统关闭

  1. shutdown:支持重启、取消、定时等

    -r:重启 -c:取消定时 -h:关闭系统

  2. halt:关闭系统

    -d:不写入日志记录 -f:强制关闭

  3. reboot:重启系统
  4. poweroff:关机

在Linux系统中,如果输入失效,则尝试Alt + Print Screen + B以重新启动。

1.4 REISUB

当系统运行正常时,可以使用上面的所有命令。但如果它崩溃了呢?如果PC或服务器正在挂起,无法以合适的方式重新启动,该怎么办? 答案就是键盘组合。如果您已从Windows切换,您可能知道Ctrl + Alt + Del会显示一个菜单,其中包含Shutdown作为选项。如果保持更长时间,机器将自动关闭。同时,在Mac上,您只需按住电源按钮(也适用于Windows硬件的选项)。 在Linux中,键盘组合为Alt + Print Screen + B以重新启动。 但是,如果这不起作用,或者存在更复杂的问题,则可以使用最多六个键来更改组合。 这就是所谓的REISUB,是取以下词语的缩略语: unRaw - 从X显示服务器控制键盘。 tErminate - 将终止信号SIGTERM发送到所有进程,以便正常终止。 kIll - 如上所述,但SIGKILL信号强制立即终止进程。 Sync - 将数据刷新到磁盘。 Unmount- 这会将所有文件系统重新装入只读状态。 reBoot - 正如您所期望的那样。

作者:架构师springboot 链接:https://www.jianshu.com/p/b05b4b4a528d 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.5 系统的启动目标

linux一般使用目标等级来替换运行级别。一般一个目标是一个和systemctl关联的文件,例如上述的graphical.target。启动目标需要一些前置条件,例如启动命令行目标会启动网络管理。 目标和运行级别的对应关系:

运行级别目标链接文件功能
0poweroff.targetrunlevel0.target关闭系统
1rescue.targetrunlevel1.target救援模式
2multi-user.targetrunlevel2.target命令行(非图形化)
3multi-user.targetrunlevel3.target命令行(非图形化)
4multi-user.targetrunlevel4.target命令行(非图形化)
5graphical.targetrunlevel5.target命令行模式
6reboot.targetrunlevel6.target重启
1
ls -l /lib/systemd/system/runlevel*.target

以查看软连接的映射关系

1
systemctl isolate multi-user.target

切换运行状态

1.6 VNC

VNC(Virtual Network Computing)是一种远程桌面协议,允许用户通过网络访问和控制另一台计算机的桌面环境。它广泛应用于远程访问和远程管理服务器或桌面计算机。一般由云服务的运营商提供。

VNC的主要特点:

  • 跨平台:VNC客户端和服务器可以在多种操作系统上运行,包括Linux、Windows、macOS等。
  • 图形界面:VNC提供了完整的图形用户界面访问,用户可以像坐在物理机前一样操作远程计算机。
  • 多用户:一些VNC服务器支持多用户同时连接,但每个用户可能只能查看或操作,具体取决于服务器配置。

如何使用VNC:

  1. 安装VNC服务器

    • 在Linux上,你可以使用包管理器安装VNC服务器。例如,在基于Debian的系统上,你可以使用以下命令:

      1
      2
      
      bashsudo apt-get update
      sudo apt-get install tightvncserver
      
  2. 启动VNC服务器

    • 运行VNC服务器,并设置一个密码,这个密码将用于客户端连接时的认证:

      1
      2
      
      bash
      vncserver :1
      
      1
      
      :1
      

      表示创建一个新的VNC会话,数字可以是1到9之间的任何数字。

  3. 配置VNC服务器(可选):

    • 你可以配置VNC服务器以设置分辨率、颜色深度等。配置文件通常位于~/.vnc/config
  4. 安装VNC客户端

    • 在你的本地计算机上,你需要一个VNC客户端来连接到VNC服务器。有许多VNC客户端可供选择,如RealVNC、TightVNC、TigerVNC等。
  5. 连接到VNC服务器

    • 打开VNC客户端,输入远程计算机的IP地址和端口号(默认是5900加上你在步骤2中指定的会话号,例如5901)。例如,如果远程计算机的IP是192.168.1.100,会话号是1,那么你应该输入192.168.1.100:5901
  6. 输入密码

    • 当VNC客户端提示输入密码时,输入你在步骤2中设置的密码。
  7. 开始远程会话

    • 一旦密码验证成功,你将看到远程计算机的桌面,并能够像在本地一样进行操作。

安全注意事项:

  • VNC流量默认不加密,可能会被截获。建议使用VNC over SSH隧道或配置VNC服务器使用加密连接。
  • 确保更改VNC服务器的默认端口,并使用防火墙规则限制访问。
  • 定期更新VNC服务器和客户端软件,以修复已知的安全漏洞。

2. 用户管理

2.1 用户和用户组的管理

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。

用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加、删除与修改。
  • 用户口令的管理。
  • 用户组的管理。

1 Linux系统用户账号的管理

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。

1、添加新的用户账号使用useradd命令,其语法如下:

1
useradd 选项 用户名

参数说明:

  • 选项:

    • -c comment 指定一段注释性描述。
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
    • -g 用户组 指定用户所属的用户组。
    • -G 用户组,用户组 指定用户所属的附加组。
    • -s Shell文件 指定用户的登录Shell。
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
  • 用户名:

    指定新账号的登录名。

实例1

1
# useradd –d  /home/sam -m sam

此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。

实例2

1
# useradd -s /bin/sh -g group –G adm,root gem

此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

这里可能新建组:#groupadd group及groupadd adm

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

2. 删除帐号

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

删除一个已有的用户账号使用userdel命令,其格式如下:

1
userdel 选项 用户名

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

例如:

1
# userdel -r sam

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

3. 修改帐号

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

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

1
usermod 选项 用户名

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

另外,有些系统可以使用选项:-l 新用户名

这个选项指定一个新的账号,即将原来的用户名改为新的用户名。

例如:

1
# usermod -s /bin/ksh -d /home/z –g developer sam

此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

4. 用户口令的管理

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

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

1
passwd 选项 用户名

可使用的选项:

  • -l 锁定口令,即禁用账号。
  • -u 口令解锁。
  • -d 使账号无口令。
  • -f 强迫用户下次登录时修改口令。

如果默认用户名,则修改当前用户的口令。

例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:

1
2
3
4
$ passwd 
Old password:****** 
New password:******* 
Re-enter new password:*******

如果是超级用户,可以用下列形式指定任何用户的口令:

1
2
3
# passwd sam 
New password:******* 
Re-enter new password:*******

普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。

为用户指定空口令时,执行下列形式的命令:

1
# passwd -d sam

此命令将用户 sam 的口令删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。

passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:

1
# passwd -l sam

1.2 Linux系统用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

1、增加一个新的用户组使用groupadd命令。其格式如下:

1
groupadd 选项 用户组

可以使用的选项有:

  • -g GID 指定新用户组的组标识号(GID)。
  • -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

实例1:

1
# groupadd group1

此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

实例2:

1
# groupadd -g 101 group2

此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

1. 删除一个已有的用户组

使用groupdel命令,其格式如下:

1
groupdel 用户组

例如:

1
# groupdel group1

此命令从系统中删除组group1。

2. 修改用户组

使用groupmod命令。其语法如下:

1
groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
  • -n新用户组 将用户组的名字改为新名字

实例1:

1
# groupmod -g 102 group2

此命令将组group2的组标识号修改为102。

实例2:

1
# groupmod –g 10000 -n group3 group2

此命令将组group2的标识号改为10000,组名修改为group3。

3.多个用户组

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

1
$ newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。

1.3 与用户账号有关的系统文件

完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。

下面分别介绍这些文件的内容。

1. 密码文件

1、/etc/passwd文件是用户管理工作涉及的最重要的一个文件。

Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。

这个文件对所有用户都是可读的。它的内容类似下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat /etc/passwd

root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:
sam:x:200:50:Sam san:/home/sam:/bin/sh

从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:

1
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

1)”用户名”是代表用户账号的字符串。

通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。

为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)“口令”一些系统中,存放着加密后的用户口令字。

虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

3)“用户标识号”是一个整数,系统内部用它来标识用户。

一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)“组标识号”字段记录的是用户所属的用户组。

它对应着/etc/group文件中的一条记录。

5)“注释性描述”字段记录着用户的一些个人情况。

例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)“主目录”,也就是用户的起始工作目录。

它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

8)系统中有一类用户称为伪用户(pseudo users)。

这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

常见的伪用户如下所示:

1
2
3
4
5
6
7
伪 用 户 含 义 
bin 拥有可执行的用户命令文件 
sys 拥有系统文件 
adm 拥有帐户文件 
uucp UUCP使用 
lp lp或lpd子系统使用 
nobody NFS使用

1.4 拥有帐户文件

1、除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。

由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

2、/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用”:”隔开。这些字段是:

1
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
  1. “登录名”是与/etc/passwd文件中的登录名相一致的用户账号
  2. “口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
  3. “最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCO Linux 中,这个时间起点是1970年1月1日。
  4. “最小时间间隔”指的是两次修改口令之间所需的最小天数。
  5. “最大时间间隔”指的是口令保持有效的最大天数。
  6. “警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
  7. “不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
  8. “失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

下面是/etc/shadow的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# cat /etc/shadow

root:Dnakfw28zf38w:8764:0:168:7:::
daemon:*::0:0::::
bin:*::0:0::::
sys:*::0:0::::
adm:*::0:0::::
uucp:*::0:0::::
nuucp:*::0:0::::
auth:*::0:0::::
cron:*::0:0::::
listen:*::0:0::::
lp:*::0:0::::
sam:EkdiSECLWPdSa:9740:0:0::::

3、用户组的所有信息都存放在/etc/group文件中。

将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。

每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。

当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。

用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:

1
组名:口令:组标识号:组内用户列表
  1. “组名”是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
  2. “口令”字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
  3. “组标识号”与用户标识号类似,也是一个整数,被系统内部用来标识组。
  4. “组内用户列表”是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

/etc/group文件的一个例子如下:

1
2
3
4
5
6
7
root::0:root
bin::2:root,bin
sys::3:root,uucp
adm::4:root,adm
daemon::5:root,daemon
lp::7:root,lp
users::20:root,sam

1.4 添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下:

(1)先编辑一个文本用户文件。

每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:

1
2
3
4
5
6
user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash
user003::602:100:user:/home/user003:/bin/bash
user004::603:100:user:/home/user004:/bin/bash
user005::604:100:user:/home/user005:/bin/bash
user006::605:100:user:/home/user006:/bin/bash

(2)以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:

1
# newusers < user.txt

然后可以执行命令 vipwvi /etc/passwd 检查 /etc/passwd 文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。

(3)执行命令/usr/sbin/pwunconv。

/etc/shadow 产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadowshadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。

1
# pwunconv

(4)编辑每个用户的密码对照文件。

格式为:

1
用户名:密码

实例文件 passwd.txt 内容如下:

1
2
3
4
5
6
user001:123456
user002:123456
user003:123456
user004:123456
user005:123456
user006:123456

(5)以 root 身份执行命令 /usr/sbin/chpasswd

创建用户密码,chpasswd 会将经过 /usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。

1
# chpasswd < passwd.txt

(6)确定密码经编码写入/etc/passwd的密码栏后。

执行命令 /usr/sbin/pwconv 将密码编码为 shadow password,并将结果写入 /etc/shadow

1
# pwconv

这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。

3. vi/vim/nano

Linux中的vivimnano是三种流行的文本编辑器,它们各自有不同的特点和用途:

  1. vi
    • vi是一个历史悠久的文本编辑器,它是Unix和类Unix系统中的标准编辑器之一。
    • 它以模式化操作而著称,具有命令模式、插入模式等,用户需要在不同的模式下进行文本编辑。
    • vi功能强大,但学习曲线较陡峭,因为它使用了大量的快捷键和命令。
  2. vim
    • vim代表”Vi IMproved”,是vi的增强版,提供了更多的功能和改进。
    • 它支持语法高亮、代码补全、多窗口编辑等高级特性。
    • vim还支持插件系统,可以通过安装插件来扩展其功能。
    • vim具有很好的可配置性,用户可以通过修改配置文件来定制编辑器的行为。
  3. nano
    • nano是一个用户友好的文本编辑器,特别适合初学者使用。
    • 它提供了一个简单的界面,菜单选项直接显示在编辑器的底部,易于理解和操作。
    • nano不需要用户记住太多的快捷键,因为它提供了一个内置的帮助菜单,列出了所有可用的命令。
    • 它以”简单易用”为目标设计,但功能相对较少,不适合复杂的文本编辑任务。

3.1 vi/vim

vivim 是功能强大的文本编辑器,在Linux和Unix系统中广泛使用。vimvi 的一个增强版本,提供了更多的特性和插件支持。以下是使用 vim 编辑器打开、修改、保存和关闭文件的基本步骤:

  1. 打开文件
    • 打开终端。
    • 输入 vim filename 来打开一个名为 filename 的文件。如果文件不存在,vim 将创建一个新文件。
  2. 进入插入模式
    • 当你打开或创建了一个文件后,你会处于 vim 的普通模式(Normal Mode)。要插入文本,你需要进入插入模式(Insert Mode)。
    • i 键进入插入模式。你也可以使用 a(在光标后插入)或 o(在下一行插入)。
  3. 修改文件
    • 在插入模式下,你可以像使用其他文本编辑器一样输入和修改文本。
  4. 保存文件
    • 要保存你的更改,首先需要退出插入模式,按 Esc 键。
    • 然后,你可以保存文件:
      • :w 保存文件。
      • :wq 保存文件并退出 vim
      • 如果你想要保存文件并继续编辑,可以使用 :w filename 来保存到不同的文件名。
  5. 查找文本
    • 在普通模式下,你可以使用 / 后跟你想要查找的文本,然后按 Enter 来搜索。
  6. 替换文本
    • 在普通模式下,使用 :%s/old-text/new-text/g 来替换所有出现的 old-textnew-text
  7. 撤销和重做
    • 在普通模式下,按 u 撤销上一次操作。
    • Ctrl + r 重做。
  8. 关闭文件
    • 如果你想要退出 vim 而不保存更改,可以使用 :q
    • 如果你想要保存并退出,使用 :wq
    • 如果你想要强制退出而不保存更改,可以使用 :q!
  9. 分屏编辑
    • 你可以使用 :split:vsplit 来分割窗口,同时查看和编辑多个文件。
  10. 其他命令
    • :help 可以打开帮助文档。
    • :undo 撤销更改。
    • :redo 重做更改。

3.2 nano

  1. 打开文件
    • 在终端中输入 nano filename 打开一个名为 filename 的文件。如果文件不存在,nano 将创建一个新文件。
  2. 基本导航
    • 使用键盘的箭头键在文本中移动光标。
    • 你也可以使用 Ctrl + K 来向上移动,Ctrl + J 向下移动。
  3. 修改文件
    • 直接在文本区域输入或修改文本。
  4. 保存文件
    • Ctrl + O 来保存文件。系统会提示你确认文件名,然后按 Enter 保存。
  5. 退出编辑器
    • Ctrl + X 来退出编辑器。如果有未保存的更改,系统会提示你保存。
  6. 查找文本
    • Ctrl + W 打开查找模式,输入要查找的文本,按 Enter 进行搜索。
  7. 替换文本
    • Ctrl + \ 打开替换模式,按照提示进行操作。
  8. 帮助
    • Ctrl + G 打开帮助菜单,你可以在这里找到所有可用的快捷键和命令。
  9. 设置
    • Ctrl + T 可以设置制表符宽度。
  10. 打开多个文件
    • 你可以在命令行中使用 + 符号后跟文件名来打开多个文件,例如 nano +3 filename 将从第三行开始编辑。
  11. 正则表达式搜索
    • Alt + W 进行正则表达式搜索。

4. grep/sed/awk

Linux三剑客通常指的是Linux系统中的三个基本的文本处理工具:grepsedawk

  1. grep:用于搜索文本文件中匹配特定模式的行。它是一个强大的文本搜索工具,可以快速地在大量数据中找到包含特定字符串的行。
  2. sed:流编辑器,用于对文本进行过滤和替换。它可以读取输入的文本文件,并对文本进行修改,比如删除、替换或插入文本。
  3. awk:是一种模式扫描和处理语言,非常适合文本处理。awk可以对文本文件进行复杂的文本分析,包括模式匹配、字段提取和计算等。

这三个工具在Linux系统中非常常用,它们可以单独使用,也可以组合使用来完成复杂的文本处理任务。

  1. grep

    • 搜索包含特定字符串的行:

      1
      2
      
      bash
      grep "search_string" filename.txt
      
    • 搜索不包含特定字符串的行:

      1
      2
      
      bash
      grep -v "search_string" filename.txt
      
  2. sed

    • 替换文本文件中的字符串:

      1
      2
      
      bash
      sed 's/old_string/new_string/g' filename.txt
      
    • 删除文件中的特定行:

      1
      2
      
      bash
      sed '/pattern_to_delete/d' filename.txt
      
  3. awk

    • 打印文本文件的第N行:

      1
      2
      
      bash
      awk 'NR==N' filename.txt
      
    • 打印包含特定字符串的所有行的特定字段:

      1
      2
      
      bash
      awk '/pattern/ {print $1}' filename.txt
      
    • 对字段进行求和:

      1
      2
      
      bash复制
      awk '{sum += $1} END {print sum}' filename.txt
      

5. Shell

5.1 基本语法

Linux的shell脚本是一种强大的工具,它允许用户自动化命令行任务。Shell脚本通常用来执行一系列的命令,这些命令可以是简单的文本处理,文件操作,或者调用其他程序和脚本。

基本概念

  • 变量:用于存储信息的容器。
  • 参数:脚本接收的输入,通常用$1, $2等表示。
  • 循环:用于重复执行命令,如forwhile
  • 条件语句:基于条件执行不同的命令,如if, elif, else
  • 函数:一段可重用的脚本代码。

编写Shell脚本

  1. 第一行:指定脚本使用的shell类型,通常使用#!/bin/bash
  2. 注释:以#开始的行是注释。
  3. 变量赋值:使用=,等号两边不能有空格。
  4. 引号:单引号'和双引号"用于字符串,单引号内的字符不会被解释,双引号可以包含变量和命令替换。

例子

以下是一个简单的shell脚本示例,该脚本打印出当前日期和时间,并检查某个文件是否存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bash#!/bin/bash

# 打印当前日期和时间
echo "Current date and time: $(date)"

# 定义变量
filename="example.txt"

# 检查文件是否存在
if [ -f "$filename" ]; then
    echo "File '$filename' exists."
else
    echo "File '$filename' does not exist."
fi

# 函数定义
function greet() {
    echo "Hello, $1!"
}

# 调用函数
greet "World"

运行脚本

要运行shell脚本,你可以使用以下命令:

1
2
bash
bash scriptname.sh

或者,如果你希望脚本可以直接执行,可以给脚本文件添加执行权限:

1
2
bash
chmod +x scriptname.sh

然后直接运行:

1
2
bash
./scriptname.sh

Shell脚本是Linux系统中自动化任务的强大工具,通过学习基本的脚本编写,你可以大大提高工作效率。

5.2 管道

在Linux系统中,管道(Pipe)是一种功能强大的机制,它允许用户将一个命令的输出作为另一个命令的输入。管道通过使用竖线符号|来实现,它将前一个命令的标准输出(stdout)重定向到后一个命令的标准输入(stdin)。

基本概念

  • 标准输出(stdout):命令执行的结果通常输出到终端,可以通过管道传递给其他命令。
  • 标准输入(stdin):命令执行时需要的输入,可以通过管道从其他命令获取。
  • 标准错误(stderr):错误信息通常输出到标准错误,但在管道中不传递。

使用管道的例子

  1. 查找并排序

    1
    2
    
    bash
    find / -name "*.txt" | sort
    

    这个命令使用find命令查找根目录下所有以.txt结尾的文件,然后通过管道将结果传递给sort命令进行排序。

  2. 文本处理

    1
    2
    
    bash
    cat file.txt | grep "search_term" | less
    

    这里cat命令用于显示文件内容,grep用于查找包含特定文本的行,然后less允许用户分页查看结果。

  3. 统计文本中单词的数量

    1
    2
    
    bash
    cat file.txt | tr ' ' '\n' | sort | uniq -c
    

    这个命令链首先使用cat显示文件内容,然后tr将所有空格替换为换行符,sort排序单词,最后uniq -c统计每个单词出现的次数。

  4. 过滤和选择

    1
    2
    
    bash
    ls -l | grep "^d"
    

    ls -l列出所有文件和目录的详细信息,grep "^d"过滤出以d(目录)开头的行。

  5. 组合多个命令

    1
    2
    
    bash
    ps aux | grep "process_name" | awk '{print $2}'
    

    这里ps aux列出所有运行中的进程,grep过滤出包含特定进程名称的行,awk用于打印第二列(进程ID)。

进阶使用

  • 并行处理:使用xargs命令,可以在管道中并行执行命令。
  • 重定向错误:使用2>&1将错误重定向到标准输出,以便一起处理。
  • 管道到文件:使用>>>可以将管道的结果重定向到文件。

管道是Linux中非常灵活和强大的工具,它允许用户将简单的命令组合成复杂的命令链,以完成复杂的任务。

6. SSH

SSH(Secure Shell)是一个网络协议,用于安全地访问远程系统。它在本地和远程计算机之间提供安全、加密的通信通道,使其成为远程管理、文件传输和隧道的绝佳工具3。

如何使用 SSH:

  1. 安装 SSH:在 Linux 系统中,SSH 通常已经预装。如果没有,可以通过包管理器安装。例如,在 Ubuntu 或 Debian 上,使用 sudo apt-get install openssh-server 命令安装 SSH 服务端,在 CentOS 或 Fedora 上,使用 sudo yum install openssh-server 命令3。
  2. 启动 SSH 服务:安装后,使用 sudo systemctl start sshd 命令启动 SSH 服务,并使用 sudo systemctl enable sshd 命令确保 SSH 在启动时自动启动3。
  3. 连接到远程主机:使用 ssh [username]@[hostname or IP address] 命令连接到远程主机。如果是第一次连接,系统会提示确认远程主机的真实性,并要求输入密码3。

SSH 的功能:

  • 远程登录:SSH 允许用户通过加密的方式登录到远程服务器,执行命令和操作。
  • 文件传输:SSH 提供了 scpsftp 命令,用于在本地和远程计算机之间安全地传输文件。scp 是一个简单的文件复制命令,而 sftp 是一个交互式的文件传输协议34。
  • 端口转发:SSH 可以转发本地计算机上的端口到远程计算机,实现网络服务的访问。
  • 密钥登录:SSH 支持使用密钥对进行身份验证,提供比密码更安全的登录方式。
  • 证书登录:SSH 还可以使用证书进行身份验证,这在管理大量用户时非常有用。
  • 隧道:SSH 可以创建隧道,允许网络应用通过 SSH 连接安全地传输数据。

OpenSSH 是广泛使用的 SSH 协议的开源实现,它提供了上述功能,并允许用户通过命令行或图形界面工具连接到远程服务器4。SSH 的使用不仅限于命令行,还有多种图形界面的 SSH 客户端可供选择,如 Xshell、PuTTY 等4。

要让GitHub通过SSH连接远程服务器,需要在服务器上生成一对SSH密钥,并将公钥添加到GitHub账户的SSH keys中。以下是详细步骤:

  1. 在服务器上生成SSH密钥对:
1
ssh-keygen -t ed25519 -C "[email protected]"

这里 -t ed25519 指定使用Ed25519算法生成密钥,它是目前推荐的安全算法。-C 参数是一个注释,通常使用你的邮箱地址。

命令会提示你输入密钥的保存位置和口令(passphrase),建议使用默认位置(~/.ssh/id_ed25519),并设置一个强度高的密码。

  1. 将公钥添加到服务器的授权密钥列表:
1
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

这会将公钥(id_ed25519.pub)的内容追加到 ~/.ssh/authorized_keys 文件中。如果该文件不存在,上述命令会创建它。

  1. 将私钥的内容复制到剪贴板:
1
cat ~/.ssh/id_ed25519

这会显示私钥的内容,选中并复制。私钥的内容看起来像这样:

1
2
3
4
5
6
7
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDTcRhr6vbgR3zpPyLPxoVVsGbhJK+JcBMt03Sr1p2AQQAAAJgOHmYvDh5m
LwAAAAtzc2gtZWQyNTUxOQAAACDTcRhr6vbgR3zpPyLPxoVVsGbhJK+JcBMt03Sr1p2AQQ
AAAEAHHWpljN6aN/RY7uoZ2QdF8YfVy/J7SvIyGXhxT1tS+NNxGGvq9uBHfOk/Is/GhVWw
ZuEkr4lwEy3TdKvWnYBBAAAADXlvdXJfZW1haWxAZXhhbXBsZS5jb20BAgM=
-----END OPENSSH PRIVATE KEY-----
  1. 在GitHub上添加SSH公钥:
  • 进入GitHub账户的 “Settings” 页面
  • 在左侧菜单中点击 “SSH and GPG keys”
  • 点击 “New SSH key” 按钮
  • 在 “Title” 字段中给这个键起一个描述性的名字,如 “My Server SSH Key”
  • 将第2步中复制的私钥内容粘贴到 “Key” 字段中
  • 点击 “Add SSH key” 按钮

现在GitHub就可以使用这个SSH密钥通过SSH协议访问你的服务器了。在GitHub Actions的脚本中,你可以使用 appleboy/ssh-action 动作,将私钥设置到 key 参数,就可以建立到服务器的SSH连接。

注意事项:

  • 妥善保管好你的SSH私钥,不要泄露。建议给私钥设置一个强度高的密码。
  • 在GitHub Actions中使用私钥时,将其存储在仓库的加密Secrets中,不要直接写在脚本里。
  • 定期更换SSH密钥,保证安全性。

7. SFTP

SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议,它在 SSH(Secure Shell)协议的基础上运行,用于在本地和远程计算机之间安全地传输文件。SFTP 通过 SSH 协议提供加密的传输通道,确保数据传输过程中的安全性和完整性。

如何使用 SFTP:

  1. 安装 SSH 服务:首先,确保你的系统上安装了 SSH 服务,因为 SFTP 是基于 SSH 协议的。安装方法与 SSH 相同。
  2. 启动 SSH 服务:确保 SSH 服务正在运行,使用 systemctl start sshd(或相应的命令)启动服务。
  3. 使用 SFTP 命令:在命令行中输入 sftp [用户名]@[主机名或IP地址],例如 sftp [email protected],然后按 Enter 键。系统会提示你输入密码。
  4. 文件操作:登录成功后,你可以使用 SFTP 提供的命令来操作文件,如 ls(列出远程目录内容)、cd(改变目录)、get(下载文件)、put(上传文件)等。

SFTP 的作用:

  • 安全文件传输:SFTP 保证文件在传输过程中的安全性,通过加密通道防止数据被截获或篡改。
  • 交互式操作:与 SCP 不同,SFTP 提供了一个交互式的 shell,允许用户在传输文件时进行更复杂的操作和交互。
  • 目录导航:用户可以在远程服务器上浏览目录结构,就像在本地操作一样。
  • 文件管理:SFTP 支持文件和目录的创建、删除、重命名等操作。
  • 多文件传输:可以一次性传输多个文件或整个目录。

SFTP 是一个非常有用的工具,特别是当你需要安全地传输敏感数据或在没有图形界面的服务器上工作时。由于其基于 SSH,因此它也继承了 SSH 的所有安全特性,如公钥认证等。

8. Systemd

Linux的systemd是一个系统和服务管理器,它用于初始化Linux系统以及管理系统进程和服务。Systemd是System V和Upstart的替代品,它提供了一种统一的方式来管理系统服务,包括启动、停止、重启等操作。

systemd的主要特点:

  1. 并行启动:systemd可以并行启动服务,这加快了系统的启动速度。
  2. 依赖管理:systemd能够处理服务之间的依赖关系,确保服务按正确的顺序启动。
  3. 日志记录:systemd集成了journald,一个日志记录服务,可以统一管理系统的日志。
  4. 资源管理:systemd可以限制服务使用的资源,如内存、CPU时间等。
  5. socket激活:systemd支持socket激活,即服务可以等待socket连接请求后再启动。

如何利用systemd管理系统:

  1. 查看服务状态

    1
    2
    
    bash
    systemctl status 服务名.service
    
  2. 启动服务

    1
    2
    
    bash
    systemctl start 服务名.service
    
  3. 停止服务

    1
    2
    
    bash
    systemctl stop 服务名.service
    
  4. 重启服务

    1
    2
    
    bash
    systemctl restart 服务名.service
    
  5. 禁用服务

    1
    2
    
    bash
    systemctl disable 服务名.service
    
  6. 启用服务

    1
    2
    
    bash
    systemctl enable 服务名.service
    
  7. 查看服务列表

    1
    2
    
    bash
    systemctl list-units --type=service
    
  8. 查看服务日志

    1
    2
    
    bash
    journalctl -u 服务名.service
    
  9. 查看所有日志

    1
    2
    
    bash
    journalctl
    
  10. 设置服务为开机启动

    1
    2
    
    bash
    systemctl enable 服务名.service
    
  11. 停止服务并禁用开机启动

    1
    2
    
    bash
    systemctl disable 服务名.service
    
  12. 查看服务的配置文件

    1
    2
    
    bash
    cat /etc/systemd/system/服务名.service
    
  13. 重新加载systemd管理器配置

    1
    2
    
    bash
    systemctl daemon-reload
    
  14. 查看systemd的帮助文档

    1
    2
    
    bash
    man systemd
    

通过这些命令,你可以有效地管理系统服务,确保它们按需运行,并进行故障排查。Systemd的配置文件通常位于/etc/systemd/system/目录下,你可以编辑这些文件来自定义服务的行为。

9. 基本网络管理

Linux操作系统提供了多种工具和命令来管理网络设置,包括更改IP地址、网络状态等。以下是一些常用的命令和方法:

  1. 查看网络接口状态: 使用 ifconfigip addr 命令来查看当前的网络接口状态和配置。例如:

    1
    2
    3
    
    bashifconfig
    # 或者
    ip addr
    
  2. 更改IP地址: 使用 ifconfigip addr 命令来更改IP地址。例如,给接口 eth0 指定静态IP地址:

    1
    2
    3
    
    bashsudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
    # 或者使用ip命令
    sudo ip addr add 192.168.1.100/24 dev eth0
    
  3. 启用或禁用网络接口: 使用 ifconfigip link 命令来启用或禁用网络接口。例如:

    1
    2
    3
    
    bashsudo ifconfig eth0 up
    # 或者
    sudo ip link set eth0 up
    
  4. 配置网关: 使用 routeip route 命令来配置默认网关。例如:

    1
    2
    3
    
    bashsudo route add default gw 192.168.1.1
    # 或者
    sudo ip route add default via 192.168.1.1
    
  5. 配置DNS: 编辑 /etc/resolv.conf 文件来配置DNS服务器。例如:

    1
    2
    
    bash
    echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
    
  6. 查看网络连接状态: 使用 ping 命令来测试网络连接。例如:

    1
    2
    
    bash
    ping www.google.com
    
  7. 使用网络管理工具: 一些Linux发行版提供了图形界面的网络管理工具,如Ubuntu的”Network”设置或Fedora的”NetworkManager”。

  8. 使用NetworkManager命令行工具: 如果你的Linux系统安装了NetworkManager,你可以使用 nmcli 命令来管理网络。例如,启用或禁用Wi-Fi:

    1
    2
    
    bashnmcli networking on
    nmcli networking off
    
  9. 编辑网络配置文件: 在某些Linux发行版中,网络配置文件位于 /etc/network/interfaces/etc/sysconfig/network-scripts/ 目录下。你可以编辑这些文件来配置网络。

  10. 使用systemd-networkd: 如果你的系统使用systemd作为初始化系统,你可以使用 systemd-networkd 来管理网络。配置文件通常位于 /etc/systemd/network/

10. 日志

在Linux系统中,日志文件通常用于记录系统和应用程序的运行情况,它们对于系统管理员来说非常重要,因为它们可以帮助诊断问题和监控系统状态。以下是一些基本的命令和方法来查看和管理日志:

  1. 查看日志文件: 日志文件通常位于/var/log目录下。你可以使用catlesstail等命令来查看日志文件的内容。例如:
    1
    2
    3
    
    cat /var/log/syslog
    less /var/log/syslog
    tail -f /var/log/syslog  # 实时查看日志更新
    
  2. 使用dmesg查看内核消息dmesg命令用于查看或控制内核环形缓冲区的内容,这些内容通常包含了系统启动和运行时的日志信息。
    1
    
    dmesg
    
  3. 使用journalctl查看和分析日志: 如果你的系统使用systemd,journalctl是一个强大的工具,用于查询和显示systemd的日志。例如:
    1
    2
    3
    
    journalctl -u nginx.service
    journalctl --since "2024-08-05"  # 显示指定日期以来的日志
    journalctl --boot  # 显示当前启动的日志
    
  4. 使用grep搜索日志: 使用grep命令可以搜索包含特定文本的日志条目。
    1
    
    grep "error" /var/log/syslog
    
  5. 日志轮转: 日志文件可能会随着时间增长得非常大,因此需要进行轮转(log rotation)。logrotate是一个常用的日志轮转工具,它可以自动管理日志文件的大小和归档。
    • 配置文件通常位于/etc/logrotate.conf/etc/logrotate.d/目录下。
    • 你可以编辑配置文件来设置日志轮转的规则,例如保留的日志数量、日志文件的最大大小等。
  6. 使用awksedcut等文本处理工具: 这些工具可以帮助你解析和格式化日志文件的内容。

  7. 管理日志文件的权限: 确保日志文件的权限设置正确,以防止未经授权的访问。通常,日志文件应该只对系统管理员和需要访问它们的用户可读。

  8. 监控日志文件大小: 定期检查日志文件的大小,以避免它们消耗过多的磁盘空间。

  9. 使用图形界面工具: 一些Linux发行版提供了图形界面的日志管理工具,如gnome-system-logkSystemLog

  10. 使用网络监控工具: 对于远程服务器或分布式系统,你可能需要使用网络监控工具来集中管理日志,如GraylogLogstashFluentd

日志文件的确切位置和格式可能会根据你的Linux发行版和配置有所不同。在处理日志时,确保你了解如何正确地使用命令和工具,并且理解对日志文件所做的更改。如果你需要更具体的帮助,请提供你的Linux发行版和版本信息。

11. 常用工具

  1. wget:
    • 用途:wget 是一个非交互式的网络下载工具,可以在命令行中使用,用于从网络上下载文件。它支持 HTTP、HTTPS 和 FTP 协议,能够递归下载文件,并且可以处理重定向和断点续传。
  2. curl:
    • 用途:curl 是一个命令行工具和库,用于传输数据。它支持多种协议,包括 HTTP、HTTPS、FTP 等。curl 可以用于发送数据到服务器,也可以从服务器请求数据,支持多种数据传输方式,如 POST、GET 等。
  3. tar:
    • 用途:tar 是一个用于打包和压缩文件的工具。它可以将多个文件和目录合并成一个单一的大文件,通常称为归档文件。tar 可以与压缩程序(如 gzip、bzip2)结合使用,创建压缩归档文件,例如 .tar.gz.tar.bz2
  4. gcc:
    • 用途:gcc 是 GNU 编译器集合中的一部分,主要用于编译 C 和 C++ 程序。它可以生成可执行文件或库文件,支持多种优化选项和调试特性,是 Linux 系统中最常用的编译器之一。
  5. lsof:
    • 用途:lsof(List Open Files)是一个列出当前系统打开文件的工具。它不仅可以显示打开的文件,还可以显示打开的网络连接、管道等。lsof 常用于系统管理员诊断文件系统问题或查找哪些进程正在使用特定的文件或端口。
本文由作者按照 CC BY 4.0 进行授权