Linux学习第二天
vim如何编辑文件,编辑后如何保存,如何不保存修改。
如何用 Vim 编辑文件
要使用 Vim 编辑文件,你需要打开终端并输入以下命令:
Bash
vim 文件名
例如,如果你想编辑一个名为 my_document.txt 的文件,你会输入:
Bash
vim my_document.txt
如果 my_document.txt 文件不存在,Vim 会创建一个新文件。如果文件已经存在,Vim 会打开它以供你编辑。
进入编辑模式 (Insert Mode)
当你打开文件后,Vim 默认处于普通模式 (Normal Mode)。在这个模式下,你不能直接输入文字。你需要按下 i 键(代表 Insert),才能进入插入模式 (Insert Mode)。
进入插入模式后,你就可以像在其他文本编辑器中一样自由地输入、删除和修改文本了。
如何保存修改
当你完成编辑并想保存文件时,你需要先退出插入模式,回到普通模式。按下键盘上的 Esc 键即可退出插入模式。
回到普通模式后,你可以使用以下命令来保存文件:
保存并退出: 输入 :wq 然后按 Enter 键。
: 表示进入命令模式。
w 表示写入(write),即保存。
q 表示退出(quit)。
只保存不退出: 输入 :w 然后按 Enter 键。
如何不保存修改并退出
如果你对文件进行了修改,但决定不保存这些修改并退出 Vim,你需要使用强制退出命令。同样,你需要先按下 Esc 键回到普通模式。
然后,输入以下命令:
不保存并退出: 输入 :q! 然后按 Enter 键。
: 表示进入命令模式。
q 表示退出。
! 表示强制执行,即使有未保存的修改也强制退出。
什么是IP地址,什么是端口,两者有什么关系
什么是IP地址?
IP地址(Internet Protocol Address)是互联网协议地址的缩写,它就像是互联网上的“门牌号”或“邮政地址”。每个连接到互联网或本地网络的设备,无论是电脑、手机、服务器还是路由器,都会被分配一个唯一的IP地址。
IP地址的主要作用是:
标识设备: 独一无二地标识网络中的一台设备。
寻址: 帮助网络设备(如路由器)将数据包路由到正确的目的地。
目前最常见的IP地址有两种版本:
IPv4: 由四组数字组成,例如 192.168.1.1。
IPv6: 为了应对IPv4地址耗尽的问题而出现,它使用更长的数字串,能提供几乎无限的地址数量。
简单来说,IP地址回答了“数据要发送到哪台设备?”这个问题。
什么是端口?
端口(Port)是计算机操作系统中网络连接的虚拟“出入口”。你可以把它想象成一栋大楼里的不同房间或办公室的编号。当数据包到达一台设备后,这台设备上可能运行着多个应用程序或服务(比如网页浏览器、电子邮件客户端、在线游戏等)。端口就是用来区分这些不同服务或应用程序的。
端口是软件层面的概念,每个端口都有一个唯一的端口号(16位数字,范围从0到65535)。一些常见的服务都有默认的端口号,例如:
HTTP (网页浏览): 端口 80
HTTPS (加密网页浏览): 端口 443
FTP (文件传输): 端口 21
SSH (安全外壳协议): 端口 22
简单来说,端口回答了“数据到达这台设备后,应该交给哪个应用程序处理?”这个问题。
IP地址和端口有什么关系?
IP地址和端口之间的关系可以类比为:
IP地址 相当于一封信件上的收件人地址,它告诉邮递员这封信应该送到哪栋房子。
端口 相当于这栋房子里某个具体房间的门牌号,它告诉住户这封信应该交给哪个房间里的人。
在网络通信中,两者是密不可分的:
当一个数据包从发送方发出时,它不仅需要知道目标设备的IP地址(去哪儿),还需要知道目标设备上哪个应用程序将接收这个数据(给谁)。
所以,一个完整的网络连接通常由IP地址和端口号的组合来唯一标识一个特定的服务或进程。例如,192.168.1.100:80 就表示要连接到IP地址为 192.168.1.100 的设备上的 80 端口(通常是网页服务)。
没有IP地址,数据无法到达目标设备;没有端口,即使数据到达了目标设备,操作系统也无法知道应该将数据交给哪个应用程序处理。因此,它们共同构成了网络通信的基础,确保了互联网上信息传输的准确性和高效性。
端口号的范围是多少
端口号是一个16位的无符号整数,这意味着它的范围从 0 到 65535。
这个范围通常被分为三个主要类别:
1. 熟知端口 (Well-Known Ports): 0 - 1023
这些端口是为一些最常用和标准的网络服务预留的。
它们由 IANA (Internet Assigned Numbers Authority) 严格控制和分配,以确保全球范围内的一致性。
例子包括:
80 (HTTP): 用于网页浏览
443 (HTTPS): 用于加密网页浏览
21 (FTP): 用于文件传输协议
22 (SSH): 用于安全远程连接
23 (Telnet): 用于远程终端访问 (不安全,较少使用)
25 (SMTP): 用于发送电子邮件
53 (DNS): 用于域名解析
2. 注册端口 (Registered Ports): 1024 - 49151
这些端口也可以由 IANA 分配给特定的应用程序或服务,但通常是那些不如熟知端口那么普遍的服务。
软件开发者或供应商可以向 IANA 注册这些端口,以避免冲突。
例子包括:
3306 (MySQL): 常见的数据库服务
3389 (RDP): 远程桌面协议
3. 动态/私有端口 (Dynamic/Private Ports) 或 客户端端口 (Ephemeral Ports): 49152 - 65535
这些端口通常不分配给任何特定的服务。
它们主要用于客户端应用程序在发起连接时临时使用。当你的电脑连接到一个网站或服务时,你的操作系统会从这个范围中选择一个可用的端口作为源端口。
这些端口是临时的,连接结束后通常会被释放,以供其他连接使用。
什么是dhcp,什么是静态地址
什么是 DHCP?
DHCP 代表 动态主机配置协议(Dynamic Host Configuration Protocol)。它是一种网络协议,用于自动为连接到网络的设备分配 IP 地址和其他网络配置信息。你可以把 DHCP 想象成一个酒店的前台:当有新客人(设备)到来时,前台(DHCP 服务器)会给他们一个房间号(IP 地址),供他们在入住期间使用。
它的工作原理大致如下:
客户端-服务器模式: 一个 DHCP 服务器(通常集成在你家里的路由器中,或者在大型网络中是一个独立的服务器)管理一个可用的 IP 地址池。当一个设备(DHCP 客户端,比如你的手机、笔记本电脑或智能电视)连接到网络时,它会请求一个 IP 地址。
动态分配: DHCP 服务器随后会将一个 IP 地址“租借”给客户端,租期通常是固定的。当租期到期时,客户端可以请求续租,或者该 IP 地址会被收回,供其他设备使用。这意味着设备的 IP 地址可能会随着时间而改变。
自动化配置: 除了 IP 地址,DHCP 还可以自动提供其他必要的网络设置,比如子网掩码、默认网关(你路由器的地址)和 DNS 服务器地址,这使得用户的网络设置变得非常简单。
DHCP 的优点:
易于使用: 它非常方便,你不需要手动配置任何东西。只需连接,设备就能获得 IP。
高效的 IP 管理: 当设备断开连接时,IP 地址会被回收利用,避免在大型网络中地址耗尽。
减少冲突: DHCP 有助于防止 IP 地址冲突(两台设备拥有相同的 IP),这可能会导致网络问题。
DHCP 的缺点:
IP 地址会变动: 设备的 IP 地址可能会改变,这对于需要持续找到特定设备的某些服务(例如,网络打印机或服务器)来说可能会带来问题。
什么是静态 IP 地址?
静态 IP 地址 是指手动分配给设备并保持不变的 IP 地址。与 DHCP 中动态租借且可能变化的地址不同,静态 IP 是固定的。它就像一个永久不变的家庭住址。
当你为设备配置静态 IP 时,你(或网络管理员)会明确告诉设备它的 IP 地址应该是什么,以及它的子网掩码、默认网关和 DNS 服务器。
静态 IP 地址的优点:
一致的身份: 设备始终拥有相同的 IP 地址,使其他设备或服务能够持续稳定地找到它。
服务器的可靠性: 对于需要持续可访问的设备至关重要,例如:
网页服务器、电子邮件服务器、游戏服务器。
网络打印机或扫描仪。
需要远程访问的安防摄像头或其他物联网设备。
端口转发: 如果你需要设置端口转发(将特定的入站网络流量定向到特定设备),静态 IP 至关重要。
静态 IP 地址的缺点:
手动配置: 你必须手动设置它,这对于新手用户来说可能更复杂。
冲突风险: 如果你手动分配的 IP 地址已经在网络中使用,就会导致 IP 冲突和网络问题。需要仔细管理。
灵活性较低: 如果你的网络配置发生变化(例如,你有了新的路由器,其 IP 地址范围不同),你需要手动更新所有设备的静态 IP 设置。
何时使用哪种方式?
大多数家庭用户和典型的办公环境 会因为其简单性和自动化而受益于 DHCP。
静态 IP 地址 通常保留给提供服务或需要从其他网络位置进行持续可靠访问的设备,如服务器、网络打印机或需要端口转发的设备。
在许多家庭网络中,你的路由器充当 DHCP 服务器,自动为所有设备分配 IP。但是,如果需要,你通常可以在路由器的设置中或直接在设备上配置特定设备使用静态 IP。
如何更改服务的IP地址为静态地址
在进行任何更改之前,请确保您已经准备好以下关键信息:
目标静态 IP 地址: 一个您希望分配给该服务的、在您的网络中未被使用且不在 DHCP 分配范围内的唯一 IP 地址。例如:192.168.1.100。
子网掩码 (Subnet Mask): 通常表示为 CIDR 前缀,例如 /24 对应 255.255.255.0。
默认网关 (Default Gateway): 您路由器的 IP 地址。例如:192.168.1.1。
DNS 服务器地址 (DNS Server Address): 用于域名解析。您可以使用公共 DNS(如 Google 的 8.8.8.8 和 8.8.4.4)或您宽带服务提供商 (ISP) 提供的地址。
步骤 1:找到网络接口名称
首先,您需要知道您的网络接口的名称。通常是 enp0s3、ens33 或 eth0 等。在终端中运行以下命令:
Bash
ip a
在输出中,找到您当前正在使用的网络接口,通常它会有分配的 IP 地址。例如,您可能会看到 enp0s3 或 eth0。
步骤 2:编辑 Netplan 配置文件
Netplan 配置文件通常位于 /etc/netplan/ 目录下,文件扩展名为 .yaml。最常见的文件名是 00-installer-config.yaml 或 50-cloud-init.yaml。您可以使用 vim 或 nano 编辑器打开它:
Bash
sudo vim /etc/netplan/00-installer-config.yaml
注意: 如果该文件不存在,您可以创建一个新的,例如 99-static-ip.yaml。
步骤 3:配置静态 IP 地址
在打开的 YAML 文件中,您需要修改或添加以下内容。请将示例中的网络接口名称(enp0s3)、IP 地址、网关和 DNS 服务器替换为您的实际信息。
原始(DHCP)配置示例:
YAML
network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: true
修改为静态 IP 配置示例:
YAML
network: version: 2 renderer: networkd ethernets: enp0s3: # <-- 将 'enp0s3' 替换为你的实际网卡名称 dhcp4: no addresses: [192.168.1.100/24] # <-- 你的静态IP地址和CIDR前缀 routes: - to: default via: 192.168.1.1 # <-- 你的默认网关 nameservers: addresses: [8.8.8.8, 8.8.4.4] # <-- 你的DNS服务器 (可以使用多个,用逗号分隔)
关键点说明:
dhcp4: no:禁用 IPv4 的 DHCP。
addresses: [192.168.1.100/24]:设置静态 IP 地址。/24 是 CIDR 前缀,等同于子网掩码 255.255.255.0。根据你的子网掩码调整这个数字。
routes::定义路由信息。to: default 表示所有出站流量,via: 192.168.1.1 指向你的默认网关。
nameservers::设置 DNS 服务器地址。
完成编辑后,保存并关闭文件。在 vim 中,按 Esc 键,然后输入 :wq 并按 Enter。
步骤 4:应用 Netplan 配置
编辑完配置文件后,您需要应用这些更改才能使其生效:
Bash
sudo netplan apply
如果配置有语法错误,此命令会提示错误信息。如果没有错误,命令会成功执行。
步骤 5:验证 IP 地址
最后,检查新的 IP 地址是否已成功应用:
Bash
ip a
您应该能看到您刚刚配置的静态 IP 地址已分配给相应的网络接口。您还可以尝试 ping 一个外部网站(如 ping google.com)来测试网络连接是否正常。
重要提示:
IP 冲突: 在设置静态 IP 之前,务必确认您选择的 IP 地址没有被网络中的其他设备占用,并且不在您的 DHCP 服务器的分配范围内。否则会导致 IP 冲突,造成网络连接问题。
备份: 在修改配置文件之前,最好先备份一下原始文件,以防万一:Bash
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
远程连接: 如果您是通过 SSH 远程连接到 Ubuntu 服务器,请确保您有物理或虚拟控制台访问权限,以防配置错误导致网络断开,无法再次连接。
什么是网关,什么是子网掩码
什么是网关 (Gateway)?
网关可以理解为一个网络中的“大门”或“出口”。它是一个网络设备(通常是路由器)的 IP 地址,用于连接本地局域网和外部网络。
想象一下你住在一个有门禁的小区里。小区内的住户可以直接相互拜访,但如果你想寄信或收快递,或者想到小区外面去,你必须通过小区的大门。
在计算机网络中,这个“大门”就是网关。
本地通信: 如果你的电脑要和同一个局域网内的另一台电脑通信(比如你的手机和智能电视),数据可以直接传输,不需要经过网关。
跨网通信: 但是,如果你的电脑要访问外部网络(比如访问一个网站、发送一封邮件),那么数据包就必须先发送到网关。网关会接收这个数据包,然后根据目标 IP 地址将其转发到外部网络,最终到达目的地。
默认网关 (Default Gateway) 是你电脑或其他设备上配置的一个特殊 IP 地址。当你的设备需要发送数据到它所在子网之外的任何地方时,它就会把数据包发送给这个默认网关。
什么是子网掩码 (Subnet Mask)?
子网掩码是一个 32 位的数字,它和 IP 地址一起使用,用来区分 IP 地址中哪一部分是网络地址,哪一部分是主机地址。
IP 地址是为了唯一标识网络中的设备,而子网掩码则定义了这个 IP 地址所属的“网络范围”。
还是用小区的例子来理解:
假设你的 IP 地址是 192.168.1.100,你的子网掩码是 255.255.255.0。
子网掩码的作用: 子网掩码中为 255 的部分(二进制全为 1)对应 IP 地址中的网络部分,而为 0 的部分(二进制全为 0)对应 IP 地址中的主机部分。
192.168.1.xxx:这部分就是网络地址,表示你的设备属于 192.168.1.0 这个网络。
xxx.xxx.xxx.100:这部分就是主机地址,表示你是这个网络中的第 100 号设备。
判断是否在同一子网: 当你的电脑要发送数据给另一个 IP 地址时,它会用自己的 IP 地址和子网掩码与目标 IP 地址和子网掩码进行比较。
如果目标 IP 地址的网络部分和自己的网络部分相同,那么电脑就知道目标设备在同一个本地网络(同一个小区)内,可以直接发送数据。
如果目标 IP 地址的网络部分和自己的网络部分不同,那么电脑就知道目标设备不在本地网络内,它就会把数据包发送给默认网关,让网关来处理转发到外部网络。
网关和子网掩码的关系
网关和子网掩码是协同工作,缺一不可的。
子网掩码定义了本地网络的边界,告诉设备“我属于哪个网络,以及哪些设备跟我属于同一个网络”。
网关则是本地网络通向外部网络的“门”。
你的电脑首先根据子网掩码来判断目标 IP 地址是属于本地网络还是外部网络。
如果是本地网络,数据直接发送给目标设备。
如果是外部网络,数据就会被发送给网关,然后由网关负责转发到互联网上。
它们共同确保了设备在网络中的寻址和通信的准确性。没有正确的子网掩码,设备无法判断目标是否在本地;没有正确的网关,设备就无法访问外部网络。
一般网络中(比如家庭网络),常用的网关地址和子网掩码是多少
常见的网关地址
家庭网络中最常见的默认网关地址通常是:
192.168.1.1
192.168.0.1
这是因为大多数家用路由器厂商(如 TP-Link, D-Link, Netgear, ASUS 等)为了方便用户,会将路由器的管理界面 IP 地址预设为这两个中的一个。当你的电脑或其他设备连接到这个家庭网络时,它们会自动从路由器那里获取网络设置,包括这个默认网关地址。
除了这两个,偶尔也可能会遇到以下地址,但相对较少:
192.168.2.1
10.0.0.1
常见的子网掩码
对于家庭网络这种小型局域网,最常用的子网掩码是:
255.255.255.0
这个子网掩码对应的 CIDR 前缀是 /24。这意味着 IP 地址的前三组数字(例如 192.168.1)是网络地址,第四组数字(例如 .100)是主机地址。使用这个子网掩码,一个局域网内可以容纳多达 254 个设备(从 xxx.xxx.xxx.1 到 xxx.xxx.xxx.254,0 和 255 有特殊用途)。对于绝大多数家庭用户来说,这个数量绰绰有余。
什么是root用户,什么是普通用户,两者有什么区别
在类 Unix 操作系统(如 Linux,包括 Ubuntu)中,用户权限管理是系统安全的核心。root 用户和普通用户是两种最基本的用户类型,它们在系统中的权限和作用截然不同。
什么是 Root 用户?
Root 用户(通常也称为超级用户或 Administrator)是 Linux 系统中拥有最高权限的用户账户。它的用户 ID (UID) 固定为 0。Root 用户可以执行系统上的任何操作,包括:
修改任何文件和目录,包括系统核心配置文件。
安装、卸载和更新软件。
管理所有其他用户账户,包括创建、删除用户,以及更改用户密码和权限。
访问和控制所有系统资源和进程。
监听特权端口(端口号小于 1024)。
可以把 root 用户想象成一个房间的“主人”,拥有所有钥匙,可以随意进入任何房间、移动任何物品,甚至拆除墙壁。
什么是普通用户?
普通用户(或标准用户)是除了 root 用户之外的所有其他用户账户。它们的用户 ID (UID) 通常大于 1000(在某些系统上可能从 500 或 1000 开始)。普通用户拥有有限的权限,主要局限于:
在其自己的主目录(例如 /home/yourusername)内创建、修改和删除文件。
运行已安装的应用程序。
访问公共文件和目录,但不能修改没有权限的文件。
监听非特权端口(端口号大于 1023)。
普通用户就像是这个房间的“房客”,只能在自己的房间里活动,不能随意进入其他房间,也不能对房间的结构进行更改。
两者有什么区别?
为什么不推荐日常使用 Root 用户?
虽然 root 用户的权力巨大,但这正是它不推荐日常使用的原因:
安全风险: 如果你一直以 root 身份操作,一旦发生误操作(例如,不小心删除了关键系统文件)或你的账户受到攻击,整个系统将面临巨大风险。
可追踪性差: 在多用户环境中,如果所有管理员都直接使用 root 账户,那么审计日志很难追踪具体是哪个管理员执行了什么操作。
方便滥用: 恶意软件如果获得 root 权限,可以对系统造成灾难性的破坏。
sudo 命令的作用
在现代 Linux 系统中(特别是 Ubuntu),为了平衡安全性和便利性,通常不直接以 root 身份登录。取而代之的是,普通用户可以使用 sudo(superuser do 的缩写)命令来临时获取 root 权限,执行特定的管理任务。
例如,如果你想安装一个软件包,你作为普通用户不能直接执行 apt install 命令,但你可以使用 sudo apt install。系统会要求你输入自己的密码(而不是 root 密码),验证通过后,该命令将以 root 权限执行。
通过 sudo,管理员可以精确地控制哪些普通用户可以执行哪些管理命令,同时保留了系统审计日志的完整性。
理解 root 用户和普通用户的区别,是 Linux 系统安全和管理的基石。始终坚持“最小权限原则”,即只授予用户完成其工作所需的最小权限。
用户组是什么,与用户有什么关系
什么是用户组 (User Group)?
在 Linux(以及其他类 Unix)系统中,用户组是一种将多个用户组织起来的方式,以便更方便地管理文件权限和系统资源访问。你可以把用户组想象成一个“团队”或“部门”,而用户则是这个团队中的“成员”。
当一个文件或目录被创建时,它不仅有一个所有者(一个用户),还会有一个所属组。通过这种方式,我们可以为整个组设置权限,而不是为每个单独的用户设置权限,从而大大简化了权限管理。
用户与用户组有什么关系?
用户和用户组之间存在着紧密且层级化的关系:
用户属于一个或多个组:
每个用户在创建时,都会被自动添加到至少一个主组 (Primary Group)。主组通常与用户的用户名相同(例如,用户 john 的主组就是 john)。
除了主组,用户还可以被添加到任意数量的附属组 (Supplementary Groups)。这允许用户拥有主组之外的额外权限。
例如,一个系统管理员 admin 可能既属于他自己的主组 admin,又属于 sudo 组(允许执行管理员命令),以及 webdev 组(允许访问网站开发目录)。
文件和目录的权限:
Linux 文件系统中的每个文件和目录都有三类基本的权限:
所有者 (User):文件或目录的创建者(通常)。
所属组 (Group):文件或目录所属的用户组。
其他人 (Others):既不是所有者,也不属于所属组的任何其他用户。
当一个用户尝试访问一个文件或目录时,系统会首先检查该用户是否是所有者。
如果不是所有者,系统会检查该用户是否属于文件的所属组。
如果两者都不是,系统则应用其他人的权限。
通过这种机制,我们可以精细地控制谁可以读、写或执行某个文件或目录。例如,一个项目团队的所有成员都可以属于同一个用户组,然后为项目文件设置该组的读写权限,这样团队成员就能协同工作,而外部用户则无法访问。
资源共享和管理:
用户组的主要目的是方便资源共享和管理。例如,你可以创建一个名为 developers 的组,将所有开发人员用户添加到这个组中。然后,为包含开发代码的目录设置 developers 组的读写权限。这样,所有 developers 组的成员都可以访问和修改代码,而无需手动为每个开发人员单独设置权限。
这种方式也常用于管理特定服务的访问权限。例如,只有 www-data 组的用户才能访问 Apache 或 Nginx Web 服务器的相关文件。
总结关系:
用户是系统中的个体账户,拥有独立的身份和登录凭证。
用户组是用户的集合,用于批量管理权限和资源访问。
一个用户可以属于多个组,从而继承这些组所拥有的权限。
文件和目录通过其所有者和所属组来定义访问权限,使用户组成为管理文件访问的核心机制。
通过用户组,系统管理员可以更高效、更安全地管理多用户环境下的权限,避免为每个用户单独配置每一个资源的权限,同时也提高了系统的安全性,因为用户只拥有完成任务所必需的权限。
什么是sshd服务,默认端口是多少
什么是 sshd 服务?
sshd 是 Secure Shell Daemon 的缩写,它是 OpenSSH 服务器进程。简单来说,它是一个在 Linux 和其他类 Unix 系统上运行的后台服务,允许用户通过 SSH (Secure Shell) 协议安全地远程连接到服务器。
SSH 协议是一种加密的网络协议,它提供了一种安全的方式来在不安全的网络(如互联网)上执行命令、传输文件和管理远程服务器。在没有 SSH 之前,远程访问工具如 Telnet 或 FTP 会以明文形式传输密码和其他敏感信息,这非常不安全。
sshd 服务的主要功能包括:
监听传入连接: sshd 持续监听网络上的特定端口,等待来自 SSH 客户端的连接请求。
用户认证: 当客户端尝试连接时,sshd 负责验证用户的身份,确保只有授权用户才能访问系统。这包括密码认证、密钥认证(更安全)等多种方式。
加密通信: 一旦认证成功,sshd 会在客户端和服务器之间建立一个加密隧道,所有数据(包括命令、文件传输)都会通过这个隧道进行加密传输,防止窃听和篡改。
提供远程 Shell: 允许用户在远程服务器上执行命令行操作,就像坐在服务器前面一样。
文件传输: 支持安全文件传输协议(SFTP)和安全拷贝(SCP),用于在客户端和服务器之间安全地传输文件。
端口转发/隧道: 可以建立安全的隧道,将其他网络服务(如数据库连接、VNC)的流量通过 SSH 加密传输,提高安全性。
简而言之,sshd 是远程管理 Linux 服务器的基石,它提供了加密、安全的远程访问和文件传输能力。
sshd 服务的默认端口是多少?
sshd 服务(即 SSH 协议)的默认端口是 22。
这意味着当你的 SSH 客户端尝试连接到一台服务器时,如果没有特别指定端口,它会默认尝试连接到服务器的 22 号端口。
为什么有时会更改 SSH 端口?
尽管 22 是默认端口,但在许多生产环境中,系统管理员会选择将 sshd 服务的监听端口更改为非默认值(例如,更改为 2222、22222 或其他随机的非标准端口)。这样做的主要目的是提高安全性:
减少自动化攻击: 许多针对 SSH 的自动化攻击(如暴力破解密码)都会默认扫描 22 号端口。更改端口可以显著减少这些自动化扫描和攻击尝试,降低服务器的“噪音”。
不作为主要安全措施: 更改端口并不能完全阻止有针对性的攻击,因为攻击者仍然可以通过端口扫描发现新的 SSH 端口。它更多的是一种“隐藏”而非“保护”措施,但可以有效减少日常的自动化威胁。
如果你更改了 SSH 端口,连接时就需要明确指定新端口,例如:ssh username@your_server_ip -p 新端口号。同时,你还需要更新服务器上的防火墙规则,允许新端口的流量通过。
sshd的配置文件在哪里,如何修改默认端口
在 Ubuntu 系统中,sshd 服务的主要配置文件是 /etc/ssh/sshd_config。这是 OpenSSH 服务器读取其配置指令的地方。
如何修改 sshd 默认端口
更改 sshd 的默认端口涉及修改 /etc/ssh/sshd_config 文件,并相应地调整防火墙设置。这是一个重要的安全措施,可以减少自动化扫描和攻击。
警告: 在进行任何更改之前,务必保持一个 SSH 连接打开,以防在新端口配置失败时,您仍然可以通过旧端口访问服务器。如果您的物理访问受限(例如云服务器),这一点尤为重要。
步骤 1:备份 sshd 配置文件
在修改任何系统配置文件之前,始终建议先进行备份。这能让您在出现问题时轻松恢复到原始状态。
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
使用您喜欢的文本编辑器(如 nano 或 vim)打开 sshd 配置文件。我们推荐使用 nano,因为它对初学者更友好。
Bash
sudo nano /etc/ssh/sshd_config
在文件中,找到以 #Port 22 开头或只有 Port 22 的行。
如果前面有 #(井号),这意味着这一行被注释掉了,sshd 会使用默认端口 22。
如果前面没有 #,则它明确指定了端口 22。
无论是哪种情况,您都需要:
取消注释(如果前面有 #,删除它)。
将 22 更改为您想要的新端口号。选择一个 1024 到 65535 之间的未被其他服务占用的端口号。例如,您可以选择 2222 或 22022。
修改后的行看起来会像这样(以 2222 为例):
Port 2222
提示: 您可以在 Port 2222 行的下方再添加一行 #Port 22,这样可以保留原始端口的记录,方便日后查阅。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 3:调整防火墙设置 (UFW)
如果您的 Ubuntu 系统启用了防火墙(UFW 是 Ubuntu 默认的防火墙管理工具),您需要允许新端口的流量通过,否则您将无法通过新端口连接。
检查 UFW 状态:
Bashsudo ufw status
如果状态显示为 inactive,则表示防火墙未启用,您可以跳过此步骤。如果显示为 active,请继续。
允许新端口:
删除旧端口规则 (可选但推荐):
如果您确定不再需要通过 22 端口访问 SSH,可以删除其规则。
步骤 4:重启 sshd 服务
为了使配置更改生效,您需要重启 sshd 服务。
Bash
sudo systemctl restart sshd
或者在某些旧版本 Ubuntu 上可能是:
Bash
sudo service ssh restart
步骤 5:测试新端口连接
这是最关键的一步。 在关闭当前 SSH 会话之前,打开一个新的终端窗口或 SSH 客户端,尝试使用新端口连接到服务器。
Bash
ssh username@your_server_ip -p 2222 # 将 '2222' 替换为你的新端口号
如果连接成功,并能登录,恭喜你,更改成功了!现在你可以安全地关闭旧的 SSH 会话了。
如果连接失败(例如“Connection refused”),请不要关闭旧的 SSH 会话。检查以下几点:
sshd_config 文件中 Port 行是否正确取消注释并设置了正确的端口号。
UFW 防火墙是否已允许新端口的 TCP 流量。
确保您选择的端口号没有被其他服务占用(您可以使用 sudo lsof -i -P -n | grep LISTEN 来查看哪些端口正在被监听)。
如果遇到问题,您可以通过旧的 SSH 会话恢复备份的配置文件,然后重新启动 sshd 服务:
Bash
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config sudo systemctl restart sshd
sshd如何禁止/允许root用户远程登录
如何禁止 root 用户远程登录
步骤 1:备份 sshd 配置文件
在进行任何修改之前,始终建议备份配置文件:
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
使用 nano 或 vim 编辑器打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
在文件中找到名为 PermitRootLogin 的行。这行可能有以下几种状态:
#PermitRootLogin yes:这是默认情况,表示被注释掉,但实际上默认行为通常是允许密码认证的 root 登录(取决于 Ubuntu 版本和初始安装设置)。
PermitRootLogin yes:明确允许 root 用户通过密码或密钥登录。
PermitRootLogin prohibit-password 或 PermitRootLogin without-password:允许 root 用户使用 SSH 密钥登录,但禁止使用密码登录(这是更安全的折衷方案)。
PermitRootLogin no:明确禁止 root 用户通过任何方式登录。
要禁止 root 用户远程登录,请将该行修改为:
PermitRootLogin no
重要提示:在禁用 root 登录之前,请务必确保您已经创建了一个具有 sudo 权限的普通用户,并且您可以使用该普通用户成功登录到服务器。否则,您可能会将自己锁定在服务器之外!
如果没有,请先创建并配置一个普通用户:
创建新用户: sudo adduser your_new_username
为用户添加 sudo 权限: sudo usermod -aG sudo your_new_username
测试新用户登录: 在禁用 root 登录前,尝试用新用户通过 SSH 登录一次,确认可用。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 3:重启 sshd 服务
为了使更改生效,您需要重启 sshd 服务:
Bash
sudo systemctl restart sshd
步骤 4:测试连接
在关闭当前会话之前,打开一个新的终端窗口或 SSH 客户端,尝试以 root 用户身份登录:
Bash
ssh root@your_server_ip
您应该会收到“Permission denied”的错误消息,这意味着 root 登录已被成功禁止。然后,您可以尝试使用您之前创建的普通用户登录,并确认一切正常。
sshd如何禁止/允许用户远程使用密码登录
如何控制 SSHD 允许/禁止用户远程使用密码登录
在 Ubuntu 系统中,控制 SSHD 服务(OpenSSH 服务器)是否允许用户通过密码进行远程登录,是通过修改其主要配置文件 /etc/ssh/sshd_config 来实现的。禁用密码登录是一种重要的安全加固措施,尤其是在服务器暴露在互联网上的情况下。
强烈建议: 禁用密码登录并改用 SSH 密钥认证。SSH 密钥认证比密码更安全,因为它使用一对加密密钥(一个私钥,一个公钥)进行身份验证,而非容易被猜测或暴力破解的密码。
1. 禁用密码登录(推荐且更安全)
禁用密码登录意味着用户只能通过 SSH 密钥进行身份验证。
步骤 1:确保已设置 SSH 密钥认证
在禁用密码登录之前,至关重要的是,您必须已经为您的用户配置了 SSH 密钥对,并且已将公钥添加到服务器上该用户的 ~/.ssh/authorized_keys 文件中。如果您还没有设置,请务必先完成这一步,否则禁用密码后您将无法登录服务器!
您可以参考以下简要步骤生成密钥并添加到服务器:
在本地电脑生成密钥对: ssh-keygen -t rsa -b 4096 (一路回车使用默认路径和空密码即可,或设置密码增强安全性)。
将公钥复制到服务器: ssh-copy-id username@your_server_ip (这个命令会自动将本地公钥复制到服务器的 ~/.ssh/authorized_keys 文件中,并设置正确权限)。
步骤 2:备份 sshd 配置文件
在进行任何修改之前,始终建议备份配置文件:
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 3:编辑 sshd 配置文件
使用您偏好的文本编辑器(如 nano 或 vim)打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
找到名为 PasswordAuthentication 的行。这行可能有以下几种状态:
#PasswordAuthentication yes (默认被注释掉,但通常会默认为 yes)
PasswordAuthentication yes
将其修改为:
PasswordAuthentication no
此外,确保以下行也被取消注释并设置为 yes:
PubkeyAuthentication yes
这是确保 SSH 密钥认证能够正常工作的关键。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 4:重启 sshd 服务
为了使配置更改生效,您需要重启 sshd 服务:
Bash
sudo systemctl restart sshd
步骤 5:测试连接
在关闭当前 SSH 会话之前,务必打开一个新的终端窗口或 SSH 客户端。 尝试使用您的用户通过密码登录。您应该会收到“Permission denied (publickey)”或类似的错误,表示密码登录已被禁用。
然后,再次尝试使用 SSH 密钥登录,确保您可以顺利进入服务器。如果可以,您就可以安全地关闭旧会话了。
2. 允许密码登录(不推荐,但有时需要)
在某些特定场景下(例如,您正在构建一个需要密码认证的服务,或在内部、高度隔离的网络中),您可能需要允许密码登录。
步骤 1:备份 sshd 配置文件
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
找到 PasswordAuthentication 行。确保它被取消注释并设置为 yes:
PasswordAuthentication yes
同时,您可能还需要检查 UsePAM 选项,确保其设置为 yes(通常是默认值)。PAM (Pluggable Authentication Modules) 系统负责处理用户的认证过程,包括密码验证。
UsePAM yes
保存并关闭文件。
步骤 3:重启 sshd 服务
Bash
sudo systemctl restart sshd
步骤 4:测试连接
尝试使用密码登录您的用户账户,验证是否成功。
重要提示:
安全优先级: 禁用密码登录并通过 SSH 密钥认证是加强服务器安全的首要步骤。密码容易被猜解、暴力破解或通过字典攻击攻破。
确保可用性: 在禁用密码登录之前,务必确保您有备用且可靠的 SSH 密钥访问方式。否则,您可能会将自己锁定在服务器之外。
除了使用密码登录之外,还能使用什么方式登录服务器
1. SSH 密钥认证 (SSH Key Authentication) - 最常用和推荐的方式
SSH 密钥认证是替代密码登录最广泛使用且高度安全的方法。
工作原理:
生成密钥对: 你在本地计算机(客户端)上生成一对密钥:一个私钥 (private key) 和一个公钥 (public key)。
私钥: 必须严格保密,存储在你的本地计算机上,绝不能共享给任何人。它就像你家的钥匙。
公钥: 可以公开分享,你需要将它添加到你想要登录的服务器上的用户账户的 ~/.ssh/authorized_keys 文件中。它就像你家的门锁。
认证过程: 当你尝试使用 SSH 密钥登录时:
客户端向服务器发送你的用户名和公钥。
服务器会查找其 authorized_keys 文件中是否有匹配的公钥。
如果找到,服务器会生成一个随机数据,并使用你的公钥对其进行加密,然后发送回客户端。
客户端使用其私钥解密这个数据。
客户端将解密后的数据(可能经过哈希处理)发送回服务器。
服务器验证这个数据是否与它最初加密的数据匹配。如果匹配,认证成功,你就可以登录了。
优点:
安全性高: 私钥永远不会离开你的本地设备,不需要在网络上传输,大大降低了被截获的风险。密钥对通常比密码长且复杂得多,几乎不可能被暴力破解。
方便性: 一旦设置好,你通常不需要每次登录都输入密码(除非你的私钥也设置了密码,但可以通过 SSH Agent 管理)。这对于自动化脚本和频繁的远程操作非常有用。
密码无关: 即使你的系统密码泄露,没有私钥,攻击者也无法通过 SSH 登录。
2. SSH 证书认证 (SSH Certificate Authentication)
SSH 证书认证是更高级和企业级的密钥认证形式,特别适用于管理大量服务器和用户。
工作原理:
证书颁发机构 (CA): 你在网络中设置一个受信任的 SSH 证书颁发机构 (CA)。
签发证书: CA 使用其私钥对用户的公钥或服务器的公钥进行签名,生成一个带有额外元数据(如有效期、用户或主机身份等)的证书。
认证过程:
客户端向服务器发送其证书和密钥。
服务器检查该证书是否由其信任的 CA 签名,并验证证书是否有效。
如果证书有效,服务器接受认证。
优点:
大规模管理: 极大地简化了大量用户和服务器的 SSH 密钥管理。你不需要在每台服务器的 authorized_keys 文件中手动添加每个用户的公钥。
过期控制: 证书可以设置有效期,到期后自动失效,增强了安全性。
撤销列表: CA 可以发布证书撤销列表,禁用已泄露或不再信任的证书。
3. 多因素认证 (Multi-Factor Authentication - MFA / 2FA)
MFA 并非单独的认证方式,而是在原有认证方式(如密码或密钥)之上增加一个或多个额外的验证因素。它为 SSH 登录提供了额外的安全层。
工作原理:
用户需要提供两个或更多独立的凭据才能登录,这些凭据通常属于以下类别:
知识因素: 你知道的东西(如密码、PIN 码)。
所有权因素: 你拥有的东西(如手机上的一次性验证码、硬件安全密钥)。
生物特征因素: 你是谁(如指纹、面部识别)。
常见实现方式:
密码 + TOTP(基于时间的一次性密码): 用户输入密码后,还需要输入一个由智能手机应用(如 Google Authenticator, Authy)生成的动态 6 位或 8 位代码。
SSH 密钥 + TOTP: 用户使用其 SSH 私钥认证后,再输入一次性验证码。
SSH 密钥 + 硬件安全密钥 (U2F/FIDO2): 使用密钥认证后,再通过插入 USB 密钥并按键来完成二次验证。
优点:
极大增强安全性: 即使一个认证因素被泄露,攻击者也无法单独通过它登录。例如,即使密码被盗,没有手机上的一次性代码也无法登录。
文件的rwx权限分别是什么意思,如何用数字表示
文件的 rwx 权限分别是什么意思?
文件权限分为三组,每组都有 r、w、x 权限:
所有者 (Owner):文件或目录的创建者(通常)。
所属组 (Group):与文件关联的用户组中的所有用户。
其他人 (Others):既不是所有者,也不属于所属组的所有其他用户。
对于这三类用户,rwx 的含义如下:
1. r (Read) - 读取权限
对于文件: 允许用户查看文件的内容。你可以使用 cat、less 等命令读取文件,或用文本编辑器打开文件查看内容。
对于目录: 允许用户列出目录中的文件和子目录的名称。你可以使用 ls 命令查看目录内容。但要注意,如果没有执行权限 (x),即使有读权限,也无法进入该目录或访问其子文件。
2. w (Write) - 写入权限
对于文件: 允许用户修改、编辑或删除文件的内容。你可以在文件中添加、删除或更改文本,也可以直接删除这个文件。
对于目录: 允许用户在该目录内创建、删除、重命名文件或子目录。请注意,要对目录执行写操作,通常还需要同时拥有执行权限 (x)。
3. x (Execute) - 执行权限
对于文件: 允许用户将文件作为程序或脚本来运行。如果一个文件是一个可执行程序或脚本(如 Shell 脚本),没有 x 权限就无法运行它。
对于目录: 允许用户进入(“穿越”或“搜索”)该目录。你可以使用 cd 命令进入该目录,并访问该目录下的文件(如果你有相应的文件权限)。如果没有 x 权限,即使有 r 权限也无法进入目录查看内容。
文件权限777是什么意思
文件权限 777 在 Linux/Unix 系统中表示最高的权限级别,它意味着所有用户都对该文件或目录拥有完全的读、写、和执行权限。
让我们来详细分解一下这个数字的含义:
权限数字分解
在 Linux 权限系统中,每种权限都对应一个数字值:
r (read - 读取) = 4
w (write - 写入) = 2
x (execute - 执行) = 1
- (no permission - 无权限) = 0
文件权限由三位八进制数字组成,分别代表所有者、所属组和其他人的权限。
第一位数字:代表文件所有者的权限。
第二位数字:代表文件所属组的权限。
第三位数字:代表其他用户(既不是所有者,也不属于所属组)的权限。
777 的具体含义
当我们将每个权限位的值相加时:
7 (rwx) = 4 (读) +2 (写) +1 (执行)
所以,权限 777 的含义是:
所有者(第一个 7): 拥有 读、写、执行 的权限。
所属组(第二个 7): 拥有 读、写、执行 的权限。
其他人(第三个 7): 拥有 读、写、执行 的权限。
文件权限如何与文件所属和文件组配合
文件权限与文件所属和文件组的配合机制
每个文件和目录在 Linux 中都有三个核心属性来控制访问:
所有者 (Owner): 拥有该文件或目录的用户账户。通常是创建该文件的用户,但也可以由 root 用户使用 chown 命令更改。
所属组 (Group): 拥有该文件或目录的用户组。通常是所有者的主组,但也可以由 root 用户使用 chown 或 chgrp 命令更改。
权限 (Permissions): 分为三组,分别对应所有者、所属组和其他用户,每组包含读 (r)、写 (w)、执行 (x) 权限。
权限的判断顺序
当一个用户尝试对一个文件或目录进行操作时,Linux 系统会按照固定的顺序来检查和应用权限:
检查所有者权限:
系统首先会检查尝试访问的用户是否是该文件的所有者。
如果是,那么系统只会应用**所有者(User)**那一组的权限,而忽略所属组和其他人的权限。
示例: 如果文件权限是 rwxr-xr--,用户 alice 是文件所有者,那么 alice 对文件拥有 rwx (读、写、执行) 权限,即使 alice 也属于文件的所属组,她也不会被限制在所属组的 r-x 权限之下。
检查所属组权限:
如果尝试访问的用户不是该文件的所有者,系统会接着检查该用户是否是文件所属组的成员。
如果是,那么系统会应用**所属组(Group)**那一组的权限,而忽略其他人的权限。
示例: 文件权限仍然是 rwxr-xr--,用户 bob 不是文件所有者 alice,但 bob 属于文件的所属组 developers。那么 bob 对文件拥有 r-x (读、执行) 权限。
检查其他人权限:
如果尝试访问的用户既不是文件的所有者,也不属于文件的所属组,那么系统会应用**其他人(Others)**那一组的权限。
示例: 文件权限仍是 rwxr-xr--,用户 charlie 既不是 alice,也不属于 developers 组。那么 charlie 对文件拥有 r-- (只读) 权限。
创建两个用户,dev、ops
创建 dev 和 ops 用户
在 Ubuntu 中,你可以使用 adduser 命令来创建用户。这个命令比 useradd 更友好,因为它会自动处理一些必要的配置,比如创建用户的主目录、复制骨架文件等。
1. 创建 dev 用户
打开你的终端,然后输入以下命令来创建 dev 用户:
Bash
sudo adduser dev
执行这个命令后,系统会提示你:
输入新用户的密码: 两次输入相同的密码。请确保密码强度足够。
输入新用户的全名 (Full Name): 这是可选的,你可以直接按 Enter 跳过。
输入房间号、电话号码等信息: 这些都是可选信息,直接按 Enter 跳过即可。
确认信息是否正确: 输入 Y 然后按 Enter 确认。
2. 创建 ops 用户
以同样的方式,你可以创建 ops 用户:
Bash
sudo adduser ops
系统会再次提示你设置密码和可选的用户信息。
创建一个组,ymyw,将上面两个用户加入此组
好的,我们来创建一个名为 ymyw 的新组,然后把之前创建的 dev 和 ops 这两个用户添加进去。
1. 创建新组 ymyw
首先,我们需要创建这个新的用户组。在 Linux 中,你可以使用 groupadd 命令来完成。
Bash
sudo groupadd ymyw
这个命令会创建一个名为 ymyw 的新用户组。你不会看到任何输出,除非操作失败。
2. 将用户 dev 加入到 ymyw 组
接下来,我们将用户 dev 添加到 ymyw 这个组中。我们可以使用 usermod 命令,并结合 -aG 选项。
-a:表示“append”(追加),意味着将用户添加到新的组中,而不会将其从已有的其他组中移除。
-G:表示指定“supplementary groups”(附属组)。
Bash
sudo usermod -aG ymyw dev
3. 将用户 ops 加入到 ymyw 组
同样地,我们也将用户 ops 添加到 ymyw 组:
Bash
sudo usermod -aG ymyw ops
4. 验证用户是否已加入组
你可以通过以下命令来验证用户是否成功加入到 ymyw 组:
验证 dev 用户:
Bash
groups dev
输出应该会包含 ymyw,例如:
dev : dev ymyw (这里的 dev 是他的主组,ymyw 是他新加入的附属组)
验证 ops 用户:
Bash
groups ops
输出应该会包含 ymyw,例如:
ops : ops ymyw (这里的 ops 是他的主组,ymyw 是他新加入的附属组)
或者,查看组的成员:
你也可以查看 ymyw 组的成员列表:
Bash
getent group ymyw
输出应该类似:
ymyw❌1003:dev,ops (这里的 1003 是 ymyw 组的 GID,后面列出了 dev,ops 两个成员)
现在,dev 和 ops 用户都已经是 ymyw 组的成员了。这意味着你可以通过为 ymyw 组设置文件或目录权限,来方便地控制这两个用户对特定资源的访问。
创建一个文件,设置其权限只允许ymyw组内人员访问
1. 创建文件
你可以使用 touch 命令快速创建一个空文件,或者使用任何文本编辑器来创建并写入内容。这里我们创建一个名为 test.txt 的文件:
Bash
touch test.txt
2. 更改文件的所属组为 ymyw
默认情况下,新创建的文件的所属组会是文件所有者(即当前用户)的主组。我们需要使用 chgrp 命令来更改文件的所属组为 ymyw。
Bash
sudo chgrp ymyw test.txt
sudo: 以超级用户权限运行命令,因为修改文件的组通常需要此权限。
chgrp: 更改文件所属组的命令。
ymyw: 要设置的新的用户组名称。
test.txt: 目标文件名。
3. 设置文件权限
现在,我们将设置文件的权限,确保只有 ymyw 组的成员可以读写该文件,而文件所有者和其他用户则没有任何权限。
我们可以使用八进制数字 660 来实现这个权限设置:
6 (rw-): 文件所有者(User)的权限:读 (4) + 写 (2)。
6 (rw-): 所属组(Group)的权限:读 (4) + 写 (2)。
0 (---): 其他人(Others)的权限:无权限 (0)。
Bash
sudo chmod 660 test.txt
chmod: 更改文件权限的命令。
660: 我们设置的八进制权限。
test.txt: 目标文件名。
4. 验证文件权限和所属
你可以使用 ls -l 命令来验证文件的权限和所属组:
Bash
ls -l test.txt
输出应该类似于这样:
-rw-rw---- 1 your_username ymyw 0 Jun 18 04:15 test.txt
这里:
-rw-rw---- 表示权限:
-rw- 是文件所有者的权限(读写)。
rw- 是 ymyw 组的权限(读写)。
---- 是其他用户的权限(无权限)。
your_username 是文件的所有者(也就是你当前登录的用户,如果是由你创建的)。
ymyw 是文件的所属组,这表明我们成功将其更改为 ymyw。
如何测试访问?
现在,dev 和 ops 用户作为 ymyw 组的成员,将能够读写 test.txt。
你可以尝试用 dev 或 ops 用户登录(或使用 su - dev 切换用户),然后尝试读取或修改这个文件:
Bash
# 切换到 dev 用户(需要输入 dev 用户的密码) su - dev # 尝试读取文件 cat test.txt # 尝试修改文件 echo "Hello from dev" >> test.txt # 切换回 root 或你的管理用户 exit
然后,你可以尝试用一个不属于 ymyw 组的用户(比如你创建的另一个测试用户,或者甚至是你当前的普通用户,如果它不在 ymyw 组内)来访问它,你会发现权限被拒绝:
Bash
# 切换到某个不在 ymyw 组的用户 su - some_other_user # 尝试读取文件 cat test.txt # 预计会显示:Permission denied # 尝试修改文件 echo "Trying to write" >> test.txt # 预计会显示:Permission denied
通过这些步骤,你就成功地创建了一个文件,并将其权限设置为仅允许 ymyw 组的成员访问。
文件的x权限,和目录的x权限有什么作用
文件的 x 权限(执行权限)
对于文件来说,x 权限的含义非常直观:
允许用户将该文件作为程序或脚本来运行。
如果一个文件是可执行的二进制程序(比如编译好的 C 语言程序),或者是一个 Shell 脚本(如 .sh 文件)、Python 脚本等,它必须拥有 x 权限才能被用户直接运行。
如果没有 x 权限,即使是文件的所有者,也无法直接执行它。当你尝试运行一个没有 x 权限的文件时,你会看到“Permission denied”(权限被拒绝)的错误。
举例:
一个名为 myscript.sh 的 Shell 脚本,如果权限是 rw-r--r-- (644),你将无法直接运行它。你需要使用 chmod +x myscript.sh 将其权限更改为 rwxr-xr-x (755) 后才能运行。
如果你想执行一个没有 x 权限的脚本,你也可以通过将其作为参数传递给解释器来运行,例如 bash myscript.sh,但这与直接执行是不同的,因为它绕过了文件本身的执行权限检查。
目录的 x 权限(进入/搜索权限)
对于目录来说,x 权限的含义则有所不同,它表示“进入”或“搜索”该目录的权限:
允许用户进入(change directory into)该目录。
你可以使用 cd 命令进入到拥有 x 权限的目录中。
如果没有 x 权限,即使你拥有该目录的读 (r) 权限,你也无法使用 cd 进入该目录。你甚至不能访问该目录下的任何文件,因为你无法“穿过”目录边界。
允许用户访问该目录内的文件和子目录,前提是用户对这些文件和子目录本身也拥有相应权限。
这意味着,如果你想访问目录 A 中的文件 file.txt,你不仅需要对 file.txt 拥有读写权限,还需要对目录 A 拥有 x 权限。
允许用户搜索目录中的内容。 即使你没有读 (r) 权限来列出目录中的所有文件,但只要有 x 权限,你就可以访问已知名称的文件(如果你对该文件本身有权限的话)。
结合 r 权限来理解:
只有 x 权限,没有 r 权限 (例如 --x 或 001): 你可以进入目录(cd),也可以访问你知道名称的目录中的文件(如果你对这些文件有读写权限),但你无法使用 ls 命令列出目录中的内容。
只有 r 权限,没有 x 权限 (例如 r-- 或 400): 你可以列出目录中的内容 (ls),看到目录内有哪些文件和子目录的名称,但你无法进入该目录 (cd) 或访问其中的任何文件。你会看到“Permission denied”错误。
同时拥有 r 和 x 权限 (例如 r-x 或 500): 这是目录最常见的权限组合。你既可以列出目录中的内容 (ls),也可以进入目录 (cd) 并访问其中的文件。
举例:
如果 /home/user/mydata 目录的权限是 drwxr----- (740),用户 otheruser 不属于 user 组,那么 otheruser 就无法 cd 进入 mydata 目录,也无法访问其中的任何文件。即使 mydata 目录里有个 public.txt 文件权限是 rw-rw-rw- (666),otheruser 也无法访问,因为他无法“穿过”目录的屏障。
总的来说,x 权限在文件和目录上的作用虽然都与“执行”相关,但具体含义有所不同:
文件的 x: 允许运行文件。
目录的 x: 允许进入/遍历目录。
Linux常用的终端软件有哪些
Windows Terminal
PowerShell
XShell
Fluent Terminal
MobaXterm
Tabby
WindTerm
Wrap
sshx
Shell360
IShell
FinalShell使用任意终端连接到你的Linux机器
vim如何编辑文件,编辑后如何保存,如何不保存修改。
如何用 Vim 编辑文件
要使用 Vim 编辑文件,你需要打开终端并输入以下命令:
Bash
vim 文件名
例如,如果你想编辑一个名为 my_document.txt 的文件,你会输入:
Bash
vim my_document.txt
如果 my_document.txt 文件不存在,Vim 会创建一个新文件。如果文件已经存在,Vim 会打开它以供你编辑。
进入编辑模式 (Insert Mode)
当你打开文件后,Vim 默认处于普通模式 (Normal Mode)。在这个模式下,你不能直接输入文字。你需要按下 i 键(代表 Insert),才能进入插入模式 (Insert Mode)。
进入插入模式后,你就可以像在其他文本编辑器中一样自由地输入、删除和修改文本了。
如何保存修改
当你完成编辑并想保存文件时,你需要先退出插入模式,回到普通模式。按下键盘上的 Esc 键即可退出插入模式。
回到普通模式后,你可以使用以下命令来保存文件:
保存并退出: 输入 :wq 然后按 Enter 键。
: 表示进入命令模式。
w 表示写入(write),即保存。
q 表示退出(quit)。
只保存不退出: 输入 :w 然后按 Enter 键。
如何不保存修改并退出
如果你对文件进行了修改,但决定不保存这些修改并退出 Vim,你需要使用强制退出命令。同样,你需要先按下 Esc 键回到普通模式。
然后,输入以下命令:
不保存并退出: 输入 :q! 然后按 Enter 键。
: 表示进入命令模式。
q 表示退出。
! 表示强制执行,即使有未保存的修改也强制退出。
什么是IP地址,什么是端口,两者有什么关系
什么是IP地址?
IP地址(Internet Protocol Address)是互联网协议地址的缩写,它就像是互联网上的“门牌号”或“邮政地址”。每个连接到互联网或本地网络的设备,无论是电脑、手机、服务器还是路由器,都会被分配一个唯一的IP地址。
IP地址的主要作用是:
标识设备: 独一无二地标识网络中的一台设备。
寻址: 帮助网络设备(如路由器)将数据包路由到正确的目的地。
目前最常见的IP地址有两种版本:
IPv4: 由四组数字组成,例如 192.168.1.1。
IPv6: 为了应对IPv4地址耗尽的问题而出现,它使用更长的数字串,能提供几乎无限的地址数量。
简单来说,IP地址回答了“数据要发送到哪台设备?”这个问题。
什么是端口?
端口(Port)是计算机操作系统中网络连接的虚拟“出入口”。你可以把它想象成一栋大楼里的不同房间或办公室的编号。当数据包到达一台设备后,这台设备上可能运行着多个应用程序或服务(比如网页浏览器、电子邮件客户端、在线游戏等)。端口就是用来区分这些不同服务或应用程序的。
端口是软件层面的概念,每个端口都有一个唯一的端口号(16位数字,范围从0到65535)。一些常见的服务都有默认的端口号,例如:
HTTP (网页浏览): 端口 80
HTTPS (加密网页浏览): 端口 443
FTP (文件传输): 端口 21
SSH (安全外壳协议): 端口 22
简单来说,端口回答了“数据到达这台设备后,应该交给哪个应用程序处理?”这个问题。
IP地址和端口有什么关系?
IP地址和端口之间的关系可以类比为:
IP地址 相当于一封信件上的收件人地址,它告诉邮递员这封信应该送到哪栋房子。
端口 相当于这栋房子里某个具体房间的门牌号,它告诉住户这封信应该交给哪个房间里的人。
在网络通信中,两者是密不可分的:
当一个数据包从发送方发出时,它不仅需要知道目标设备的IP地址(去哪儿),还需要知道目标设备上哪个应用程序将接收这个数据(给谁)。
所以,一个完整的网络连接通常由IP地址和端口号的组合来唯一标识一个特定的服务或进程。例如,192.168.1.100:80 就表示要连接到IP地址为 192.168.1.100 的设备上的 80 端口(通常是网页服务)。
没有IP地址,数据无法到达目标设备;没有端口,即使数据到达了目标设备,操作系统也无法知道应该将数据交给哪个应用程序处理。因此,它们共同构成了网络通信的基础,确保了互联网上信息传输的准确性和高效性。
端口号的范围是多少
端口号是一个16位的无符号整数,这意味着它的范围从 0 到 65535。
这个范围通常被分为三个主要类别:
1. 熟知端口 (Well-Known Ports): 0 - 1023
这些端口是为一些最常用和标准的网络服务预留的。
它们由 IANA (Internet Assigned Numbers Authority) 严格控制和分配,以确保全球范围内的一致性。
例子包括:
80 (HTTP): 用于网页浏览
443 (HTTPS): 用于加密网页浏览
21 (FTP): 用于文件传输协议
22 (SSH): 用于安全远程连接
23 (Telnet): 用于远程终端访问 (不安全,较少使用)
25 (SMTP): 用于发送电子邮件
53 (DNS): 用于域名解析
2. 注册端口 (Registered Ports): 1024 - 49151
这些端口也可以由 IANA 分配给特定的应用程序或服务,但通常是那些不如熟知端口那么普遍的服务。
软件开发者或供应商可以向 IANA 注册这些端口,以避免冲突。
例子包括:
3306 (MySQL): 常见的数据库服务
3389 (RDP): 远程桌面协议
3. 动态/私有端口 (Dynamic/Private Ports) 或 客户端端口 (Ephemeral Ports): 49152 - 65535
这些端口通常不分配给任何特定的服务。
它们主要用于客户端应用程序在发起连接时临时使用。当你的电脑连接到一个网站或服务时,你的操作系统会从这个范围中选择一个可用的端口作为源端口。
这些端口是临时的,连接结束后通常会被释放,以供其他连接使用。
什么是dhcp,什么是静态地址
什么是 DHCP?
DHCP 代表 动态主机配置协议(Dynamic Host Configuration Protocol)。它是一种网络协议,用于自动为连接到网络的设备分配 IP 地址和其他网络配置信息。你可以把 DHCP 想象成一个酒店的前台:当有新客人(设备)到来时,前台(DHCP 服务器)会给他们一个房间号(IP 地址),供他们在入住期间使用。
它的工作原理大致如下:
客户端-服务器模式: 一个 DHCP 服务器(通常集成在你家里的路由器中,或者在大型网络中是一个独立的服务器)管理一个可用的 IP 地址池。当一个设备(DHCP 客户端,比如你的手机、笔记本电脑或智能电视)连接到网络时,它会请求一个 IP 地址。
动态分配: DHCP 服务器随后会将一个 IP 地址“租借”给客户端,租期通常是固定的。当租期到期时,客户端可以请求续租,或者该 IP 地址会被收回,供其他设备使用。这意味着设备的 IP 地址可能会随着时间而改变。
自动化配置: 除了 IP 地址,DHCP 还可以自动提供其他必要的网络设置,比如子网掩码、默认网关(你路由器的地址)和 DNS 服务器地址,这使得用户的网络设置变得非常简单。
DHCP 的优点:
易于使用: 它非常方便,你不需要手动配置任何东西。只需连接,设备就能获得 IP。
高效的 IP 管理: 当设备断开连接时,IP 地址会被回收利用,避免在大型网络中地址耗尽。
减少冲突: DHCP 有助于防止 IP 地址冲突(两台设备拥有相同的 IP),这可能会导致网络问题。
DHCP 的缺点:
IP 地址会变动: 设备的 IP 地址可能会改变,这对于需要持续找到特定设备的某些服务(例如,网络打印机或服务器)来说可能会带来问题。
什么是静态 IP 地址?
静态 IP 地址 是指手动分配给设备并保持不变的 IP 地址。与 DHCP 中动态租借且可能变化的地址不同,静态 IP 是固定的。它就像一个永久不变的家庭住址。
当你为设备配置静态 IP 时,你(或网络管理员)会明确告诉设备它的 IP 地址应该是什么,以及它的子网掩码、默认网关和 DNS 服务器。
静态 IP 地址的优点:
一致的身份: 设备始终拥有相同的 IP 地址,使其他设备或服务能够持续稳定地找到它。
服务器的可靠性: 对于需要持续可访问的设备至关重要,例如:
网页服务器、电子邮件服务器、游戏服务器。
网络打印机或扫描仪。
需要远程访问的安防摄像头或其他物联网设备。
端口转发: 如果你需要设置端口转发(将特定的入站网络流量定向到特定设备),静态 IP 至关重要。
静态 IP 地址的缺点:
手动配置: 你必须手动设置它,这对于新手用户来说可能更复杂。
冲突风险: 如果你手动分配的 IP 地址已经在网络中使用,就会导致 IP 冲突和网络问题。需要仔细管理。
灵活性较低: 如果你的网络配置发生变化(例如,你有了新的路由器,其 IP 地址范围不同),你需要手动更新所有设备的静态 IP 设置。
何时使用哪种方式?
大多数家庭用户和典型的办公环境 会因为其简单性和自动化而受益于 DHCP。
静态 IP 地址 通常保留给提供服务或需要从其他网络位置进行持续可靠访问的设备,如服务器、网络打印机或需要端口转发的设备。
在许多家庭网络中,你的路由器充当 DHCP 服务器,自动为所有设备分配 IP。但是,如果需要,你通常可以在路由器的设置中或直接在设备上配置特定设备使用静态 IP。
如何更改服务的IP地址为静态地址
在进行任何更改之前,请确保您已经准备好以下关键信息:
目标静态 IP 地址: 一个您希望分配给该服务的、在您的网络中未被使用且不在 DHCP 分配范围内的唯一 IP 地址。例如:192.168.1.100。
子网掩码 (Subnet Mask): 通常表示为 CIDR 前缀,例如 /24 对应 255.255.255.0。
默认网关 (Default Gateway): 您路由器的 IP 地址。例如:192.168.1.1。
DNS 服务器地址 (DNS Server Address): 用于域名解析。您可以使用公共 DNS(如 Google 的 8.8.8.8 和 8.8.4.4)或您宽带服务提供商 (ISP) 提供的地址。
步骤 1:找到网络接口名称
首先,您需要知道您的网络接口的名称。通常是 enp0s3、ens33 或 eth0 等。在终端中运行以下命令:
Bash
ip a
在输出中,找到您当前正在使用的网络接口,通常它会有分配的 IP 地址。例如,您可能会看到 enp0s3 或 eth0。
步骤 2:编辑 Netplan 配置文件
Netplan 配置文件通常位于 /etc/netplan/ 目录下,文件扩展名为 .yaml。最常见的文件名是 00-installer-config.yaml 或 50-cloud-init.yaml。您可以使用 vim 或 nano 编辑器打开它:
Bash
sudo vim /etc/netplan/00-installer-config.yaml
注意: 如果该文件不存在,您可以创建一个新的,例如 99-static-ip.yaml。
步骤 3:配置静态 IP 地址
在打开的 YAML 文件中,您需要修改或添加以下内容。请将示例中的网络接口名称(enp0s3)、IP 地址、网关和 DNS 服务器替换为您的实际信息。
原始(DHCP)配置示例:
YAML
network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: true
修改为静态 IP 配置示例:
YAML
network: version: 2 renderer: networkd ethernets: enp0s3: # <-- 将 'enp0s3' 替换为你的实际网卡名称 dhcp4: no addresses: [192.168.1.100/24] # <-- 你的静态IP地址和CIDR前缀 routes: - to: default via: 192.168.1.1 # <-- 你的默认网关 nameservers: addresses: [8.8.8.8, 8.8.4.4] # <-- 你的DNS服务器 (可以使用多个,用逗号分隔)
关键点说明:
dhcp4: no:禁用 IPv4 的 DHCP。
addresses: [192.168.1.100/24]:设置静态 IP 地址。/24 是 CIDR 前缀,等同于子网掩码 255.255.255.0。根据你的子网掩码调整这个数字。
routes::定义路由信息。to: default 表示所有出站流量,via: 192.168.1.1 指向你的默认网关。
nameservers::设置 DNS 服务器地址。
完成编辑后,保存并关闭文件。在 vim 中,按 Esc 键,然后输入 :wq 并按 Enter。
步骤 4:应用 Netplan 配置
编辑完配置文件后,您需要应用这些更改才能使其生效:
Bash
sudo netplan apply
如果配置有语法错误,此命令会提示错误信息。如果没有错误,命令会成功执行。
步骤 5:验证 IP 地址
最后,检查新的 IP 地址是否已成功应用:
Bash
ip a
您应该能看到您刚刚配置的静态 IP 地址已分配给相应的网络接口。您还可以尝试 ping 一个外部网站(如 ping google.com)来测试网络连接是否正常。
重要提示:
IP 冲突: 在设置静态 IP 之前,务必确认您选择的 IP 地址没有被网络中的其他设备占用,并且不在您的 DHCP 服务器的分配范围内。否则会导致 IP 冲突,造成网络连接问题。
备份: 在修改配置文件之前,最好先备份一下原始文件,以防万一:Bash
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
远程连接: 如果您是通过 SSH 远程连接到 Ubuntu 服务器,请确保您有物理或虚拟控制台访问权限,以防配置错误导致网络断开,无法再次连接。
什么是网关,什么是子网掩码
什么是网关 (Gateway)?
网关可以理解为一个网络中的“大门”或“出口”。它是一个网络设备(通常是路由器)的 IP 地址,用于连接本地局域网和外部网络。
想象一下你住在一个有门禁的小区里。小区内的住户可以直接相互拜访,但如果你想寄信或收快递,或者想到小区外面去,你必须通过小区的大门。
在计算机网络中,这个“大门”就是网关。
本地通信: 如果你的电脑要和同一个局域网内的另一台电脑通信(比如你的手机和智能电视),数据可以直接传输,不需要经过网关。
跨网通信: 但是,如果你的电脑要访问外部网络(比如访问一个网站、发送一封邮件),那么数据包就必须先发送到网关。网关会接收这个数据包,然后根据目标 IP 地址将其转发到外部网络,最终到达目的地。
默认网关 (Default Gateway) 是你电脑或其他设备上配置的一个特殊 IP 地址。当你的设备需要发送数据到它所在子网之外的任何地方时,它就会把数据包发送给这个默认网关。
什么是子网掩码 (Subnet Mask)?
子网掩码是一个 32 位的数字,它和 IP 地址一起使用,用来区分 IP 地址中哪一部分是网络地址,哪一部分是主机地址。
IP 地址是为了唯一标识网络中的设备,而子网掩码则定义了这个 IP 地址所属的“网络范围”。
还是用小区的例子来理解:
假设你的 IP 地址是 192.168.1.100,你的子网掩码是 255.255.255.0。
子网掩码的作用: 子网掩码中为 255 的部分(二进制全为 1)对应 IP 地址中的网络部分,而为 0 的部分(二进制全为 0)对应 IP 地址中的主机部分。
192.168.1.xxx:这部分就是网络地址,表示你的设备属于 192.168.1.0 这个网络。
xxx.xxx.xxx.100:这部分就是主机地址,表示你是这个网络中的第 100 号设备。
判断是否在同一子网: 当你的电脑要发送数据给另一个 IP 地址时,它会用自己的 IP 地址和子网掩码与目标 IP 地址和子网掩码进行比较。
如果目标 IP 地址的网络部分和自己的网络部分相同,那么电脑就知道目标设备在同一个本地网络(同一个小区)内,可以直接发送数据。
如果目标 IP 地址的网络部分和自己的网络部分不同,那么电脑就知道目标设备不在本地网络内,它就会把数据包发送给默认网关,让网关来处理转发到外部网络。
网关和子网掩码的关系
网关和子网掩码是协同工作,缺一不可的。
子网掩码定义了本地网络的边界,告诉设备“我属于哪个网络,以及哪些设备跟我属于同一个网络”。
网关则是本地网络通向外部网络的“门”。
你的电脑首先根据子网掩码来判断目标 IP 地址是属于本地网络还是外部网络。
如果是本地网络,数据直接发送给目标设备。
如果是外部网络,数据就会被发送给网关,然后由网关负责转发到互联网上。
它们共同确保了设备在网络中的寻址和通信的准确性。没有正确的子网掩码,设备无法判断目标是否在本地;没有正确的网关,设备就无法访问外部网络。
一般网络中(比如家庭网络),常用的网关地址和子网掩码是多少
常见的网关地址
家庭网络中最常见的默认网关地址通常是:
192.168.1.1
192.168.0.1
这是因为大多数家用路由器厂商(如 TP-Link, D-Link, Netgear, ASUS 等)为了方便用户,会将路由器的管理界面 IP 地址预设为这两个中的一个。当你的电脑或其他设备连接到这个家庭网络时,它们会自动从路由器那里获取网络设置,包括这个默认网关地址。
除了这两个,偶尔也可能会遇到以下地址,但相对较少:
192.168.2.1
10.0.0.1
常见的子网掩码
对于家庭网络这种小型局域网,最常用的子网掩码是:
255.255.255.0
这个子网掩码对应的 CIDR 前缀是 /24。这意味着 IP 地址的前三组数字(例如 192.168.1)是网络地址,第四组数字(例如 .100)是主机地址。使用这个子网掩码,一个局域网内可以容纳多达 254 个设备(从 xxx.xxx.xxx.1 到 xxx.xxx.xxx.254,0 和 255 有特殊用途)。对于绝大多数家庭用户来说,这个数量绰绰有余。
什么是root用户,什么是普通用户,两者有什么区别
在类 Unix 操作系统(如 Linux,包括 Ubuntu)中,用户权限管理是系统安全的核心。root 用户和普通用户是两种最基本的用户类型,它们在系统中的权限和作用截然不同。
什么是 Root 用户?
Root 用户(通常也称为超级用户或 Administrator)是 Linux 系统中拥有最高权限的用户账户。它的用户 ID (UID) 固定为 0。Root 用户可以执行系统上的任何操作,包括:
修改任何文件和目录,包括系统核心配置文件。
安装、卸载和更新软件。
管理所有其他用户账户,包括创建、删除用户,以及更改用户密码和权限。
访问和控制所有系统资源和进程。
监听特权端口(端口号小于 1024)。
可以把 root 用户想象成一个房间的“主人”,拥有所有钥匙,可以随意进入任何房间、移动任何物品,甚至拆除墙壁。
什么是普通用户?
普通用户(或标准用户)是除了 root 用户之外的所有其他用户账户。它们的用户 ID (UID) 通常大于 1000(在某些系统上可能从 500 或 1000 开始)。普通用户拥有有限的权限,主要局限于:
在其自己的主目录(例如 /home/yourusername)内创建、修改和删除文件。
运行已安装的应用程序。
访问公共文件和目录,但不能修改没有权限的文件。
监听非特权端口(端口号大于 1023)。
普通用户就像是这个房间的“房客”,只能在自己的房间里活动,不能随意进入其他房间,也不能对房间的结构进行更改。
两者有什么区别?
为什么不推荐日常使用 Root 用户?
虽然 root 用户的权力巨大,但这正是它不推荐日常使用的原因:
安全风险: 如果你一直以 root 身份操作,一旦发生误操作(例如,不小心删除了关键系统文件)或你的账户受到攻击,整个系统将面临巨大风险。
可追踪性差: 在多用户环境中,如果所有管理员都直接使用 root 账户,那么审计日志很难追踪具体是哪个管理员执行了什么操作。
方便滥用: 恶意软件如果获得 root 权限,可以对系统造成灾难性的破坏。
sudo 命令的作用
在现代 Linux 系统中(特别是 Ubuntu),为了平衡安全性和便利性,通常不直接以 root 身份登录。取而代之的是,普通用户可以使用 sudo(superuser do 的缩写)命令来临时获取 root 权限,执行特定的管理任务。
例如,如果你想安装一个软件包,你作为普通用户不能直接执行 apt install 命令,但你可以使用 sudo apt install。系统会要求你输入自己的密码(而不是 root 密码),验证通过后,该命令将以 root 权限执行。
通过 sudo,管理员可以精确地控制哪些普通用户可以执行哪些管理命令,同时保留了系统审计日志的完整性。
理解 root 用户和普通用户的区别,是 Linux 系统安全和管理的基石。始终坚持“最小权限原则”,即只授予用户完成其工作所需的最小权限。
用户组是什么,与用户有什么关系
什么是用户组 (User Group)?
在 Linux(以及其他类 Unix)系统中,用户组是一种将多个用户组织起来的方式,以便更方便地管理文件权限和系统资源访问。你可以把用户组想象成一个“团队”或“部门”,而用户则是这个团队中的“成员”。
当一个文件或目录被创建时,它不仅有一个所有者(一个用户),还会有一个所属组。通过这种方式,我们可以为整个组设置权限,而不是为每个单独的用户设置权限,从而大大简化了权限管理。
用户与用户组有什么关系?
用户和用户组之间存在着紧密且层级化的关系:
用户属于一个或多个组:
每个用户在创建时,都会被自动添加到至少一个主组 (Primary Group)。主组通常与用户的用户名相同(例如,用户 john 的主组就是 john)。
除了主组,用户还可以被添加到任意数量的附属组 (Supplementary Groups)。这允许用户拥有主组之外的额外权限。
例如,一个系统管理员 admin 可能既属于他自己的主组 admin,又属于 sudo 组(允许执行管理员命令),以及 webdev 组(允许访问网站开发目录)。
文件和目录的权限:
Linux 文件系统中的每个文件和目录都有三类基本的权限:
所有者 (User):文件或目录的创建者(通常)。
所属组 (Group):文件或目录所属的用户组。
其他人 (Others):既不是所有者,也不属于所属组的任何其他用户。
当一个用户尝试访问一个文件或目录时,系统会首先检查该用户是否是所有者。
如果不是所有者,系统会检查该用户是否属于文件的所属组。
如果两者都不是,系统则应用其他人的权限。
通过这种机制,我们可以精细地控制谁可以读、写或执行某个文件或目录。例如,一个项目团队的所有成员都可以属于同一个用户组,然后为项目文件设置该组的读写权限,这样团队成员就能协同工作,而外部用户则无法访问。
资源共享和管理:
用户组的主要目的是方便资源共享和管理。例如,你可以创建一个名为 developers 的组,将所有开发人员用户添加到这个组中。然后,为包含开发代码的目录设置 developers 组的读写权限。这样,所有 developers 组的成员都可以访问和修改代码,而无需手动为每个开发人员单独设置权限。
这种方式也常用于管理特定服务的访问权限。例如,只有 www-data 组的用户才能访问 Apache 或 Nginx Web 服务器的相关文件。
总结关系:
用户是系统中的个体账户,拥有独立的身份和登录凭证。
用户组是用户的集合,用于批量管理权限和资源访问。
一个用户可以属于多个组,从而继承这些组所拥有的权限。
文件和目录通过其所有者和所属组来定义访问权限,使用户组成为管理文件访问的核心机制。
通过用户组,系统管理员可以更高效、更安全地管理多用户环境下的权限,避免为每个用户单独配置每一个资源的权限,同时也提高了系统的安全性,因为用户只拥有完成任务所必需的权限。
什么是sshd服务,默认端口是多少
什么是 sshd 服务?
sshd 是 Secure Shell Daemon 的缩写,它是 OpenSSH 服务器进程。简单来说,它是一个在 Linux 和其他类 Unix 系统上运行的后台服务,允许用户通过 SSH (Secure Shell) 协议安全地远程连接到服务器。
SSH 协议是一种加密的网络协议,它提供了一种安全的方式来在不安全的网络(如互联网)上执行命令、传输文件和管理远程服务器。在没有 SSH 之前,远程访问工具如 Telnet 或 FTP 会以明文形式传输密码和其他敏感信息,这非常不安全。
sshd 服务的主要功能包括:
监听传入连接: sshd 持续监听网络上的特定端口,等待来自 SSH 客户端的连接请求。
用户认证: 当客户端尝试连接时,sshd 负责验证用户的身份,确保只有授权用户才能访问系统。这包括密码认证、密钥认证(更安全)等多种方式。
加密通信: 一旦认证成功,sshd 会在客户端和服务器之间建立一个加密隧道,所有数据(包括命令、文件传输)都会通过这个隧道进行加密传输,防止窃听和篡改。
提供远程 Shell: 允许用户在远程服务器上执行命令行操作,就像坐在服务器前面一样。
文件传输: 支持安全文件传输协议(SFTP)和安全拷贝(SCP),用于在客户端和服务器之间安全地传输文件。
端口转发/隧道: 可以建立安全的隧道,将其他网络服务(如数据库连接、VNC)的流量通过 SSH 加密传输,提高安全性。
简而言之,sshd 是远程管理 Linux 服务器的基石,它提供了加密、安全的远程访问和文件传输能力。
sshd 服务的默认端口是多少?
sshd 服务(即 SSH 协议)的默认端口是 22。
这意味着当你的 SSH 客户端尝试连接到一台服务器时,如果没有特别指定端口,它会默认尝试连接到服务器的 22 号端口。
为什么有时会更改 SSH 端口?
尽管 22 是默认端口,但在许多生产环境中,系统管理员会选择将 sshd 服务的监听端口更改为非默认值(例如,更改为 2222、22222 或其他随机的非标准端口)。这样做的主要目的是提高安全性:
减少自动化攻击: 许多针对 SSH 的自动化攻击(如暴力破解密码)都会默认扫描 22 号端口。更改端口可以显著减少这些自动化扫描和攻击尝试,降低服务器的“噪音”。
不作为主要安全措施: 更改端口并不能完全阻止有针对性的攻击,因为攻击者仍然可以通过端口扫描发现新的 SSH 端口。它更多的是一种“隐藏”而非“保护”措施,但可以有效减少日常的自动化威胁。
如果你更改了 SSH 端口,连接时就需要明确指定新端口,例如:ssh username@your_server_ip -p 新端口号。同时,你还需要更新服务器上的防火墙规则,允许新端口的流量通过。
sshd的配置文件在哪里,如何修改默认端口
在 Ubuntu 系统中,sshd 服务的主要配置文件是 /etc/ssh/sshd_config。这是 OpenSSH 服务器读取其配置指令的地方。
如何修改 sshd 默认端口
更改 sshd 的默认端口涉及修改 /etc/ssh/sshd_config 文件,并相应地调整防火墙设置。这是一个重要的安全措施,可以减少自动化扫描和攻击。
警告: 在进行任何更改之前,务必保持一个 SSH 连接打开,以防在新端口配置失败时,您仍然可以通过旧端口访问服务器。如果您的物理访问受限(例如云服务器),这一点尤为重要。
步骤 1:备份 sshd 配置文件
在修改任何系统配置文件之前,始终建议先进行备份。这能让您在出现问题时轻松恢复到原始状态。
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
使用您喜欢的文本编辑器(如 nano 或 vim)打开 sshd 配置文件。我们推荐使用 nano,因为它对初学者更友好。
Bash
sudo nano /etc/ssh/sshd_config
在文件中,找到以 #Port 22 开头或只有 Port 22 的行。
如果前面有 #(井号),这意味着这一行被注释掉了,sshd 会使用默认端口 22。
如果前面没有 #,则它明确指定了端口 22。
无论是哪种情况,您都需要:
取消注释(如果前面有 #,删除它)。
将 22 更改为您想要的新端口号。选择一个 1024 到 65535 之间的未被其他服务占用的端口号。例如,您可以选择 2222 或 22022。
修改后的行看起来会像这样(以 2222 为例):
Port 2222
提示: 您可以在 Port 2222 行的下方再添加一行 #Port 22,这样可以保留原始端口的记录,方便日后查阅。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 3:调整防火墙设置 (UFW)
如果您的 Ubuntu 系统启用了防火墙(UFW 是 Ubuntu 默认的防火墙管理工具),您需要允许新端口的流量通过,否则您将无法通过新端口连接。
检查 UFW 状态:
Bashsudo ufw status
如果状态显示为 inactive,则表示防火墙未启用,您可以跳过此步骤。如果显示为 active,请继续。
允许新端口:
删除旧端口规则 (可选但推荐):
如果您确定不再需要通过 22 端口访问 SSH,可以删除其规则。
步骤 4:重启 sshd 服务
为了使配置更改生效,您需要重启 sshd 服务。
Bash
sudo systemctl restart sshd
或者在某些旧版本 Ubuntu 上可能是:
Bash
sudo service ssh restart
步骤 5:测试新端口连接
这是最关键的一步。 在关闭当前 SSH 会话之前,打开一个新的终端窗口或 SSH 客户端,尝试使用新端口连接到服务器。
Bash
ssh username@your_server_ip -p 2222 # 将 '2222' 替换为你的新端口号
如果连接成功,并能登录,恭喜你,更改成功了!现在你可以安全地关闭旧的 SSH 会话了。
如果连接失败(例如“Connection refused”),请不要关闭旧的 SSH 会话。检查以下几点:
sshd_config 文件中 Port 行是否正确取消注释并设置了正确的端口号。
UFW 防火墙是否已允许新端口的 TCP 流量。
确保您选择的端口号没有被其他服务占用(您可以使用 sudo lsof -i -P -n | grep LISTEN 来查看哪些端口正在被监听)。
如果遇到问题,您可以通过旧的 SSH 会话恢复备份的配置文件,然后重新启动 sshd 服务:
Bash
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config sudo systemctl restart sshd
sshd如何禁止/允许root用户远程登录
如何禁止 root 用户远程登录
步骤 1:备份 sshd 配置文件
在进行任何修改之前,始终建议备份配置文件:
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
使用 nano 或 vim 编辑器打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
在文件中找到名为 PermitRootLogin 的行。这行可能有以下几种状态:
#PermitRootLogin yes:这是默认情况,表示被注释掉,但实际上默认行为通常是允许密码认证的 root 登录(取决于 Ubuntu 版本和初始安装设置)。
PermitRootLogin yes:明确允许 root 用户通过密码或密钥登录。
PermitRootLogin prohibit-password 或 PermitRootLogin without-password:允许 root 用户使用 SSH 密钥登录,但禁止使用密码登录(这是更安全的折衷方案)。
PermitRootLogin no:明确禁止 root 用户通过任何方式登录。
要禁止 root 用户远程登录,请将该行修改为:
PermitRootLogin no
重要提示:在禁用 root 登录之前,请务必确保您已经创建了一个具有 sudo 权限的普通用户,并且您可以使用该普通用户成功登录到服务器。否则,您可能会将自己锁定在服务器之外!
如果没有,请先创建并配置一个普通用户:
创建新用户: sudo adduser your_new_username
为用户添加 sudo 权限: sudo usermod -aG sudo your_new_username
测试新用户登录: 在禁用 root 登录前,尝试用新用户通过 SSH 登录一次,确认可用。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 3:重启 sshd 服务
为了使更改生效,您需要重启 sshd 服务:
Bash
sudo systemctl restart sshd
步骤 4:测试连接
在关闭当前会话之前,打开一个新的终端窗口或 SSH 客户端,尝试以 root 用户身份登录:
Bash
ssh root@your_server_ip
您应该会收到“Permission denied”的错误消息,这意味着 root 登录已被成功禁止。然后,您可以尝试使用您之前创建的普通用户登录,并确认一切正常。
sshd如何禁止/允许用户远程使用密码登录
如何控制 SSHD 允许/禁止用户远程使用密码登录
在 Ubuntu 系统中,控制 SSHD 服务(OpenSSH 服务器)是否允许用户通过密码进行远程登录,是通过修改其主要配置文件 /etc/ssh/sshd_config 来实现的。禁用密码登录是一种重要的安全加固措施,尤其是在服务器暴露在互联网上的情况下。
强烈建议: 禁用密码登录并改用 SSH 密钥认证。SSH 密钥认证比密码更安全,因为它使用一对加密密钥(一个私钥,一个公钥)进行身份验证,而非容易被猜测或暴力破解的密码。
1. 禁用密码登录(推荐且更安全)
禁用密码登录意味着用户只能通过 SSH 密钥进行身份验证。
步骤 1:确保已设置 SSH 密钥认证
在禁用密码登录之前,至关重要的是,您必须已经为您的用户配置了 SSH 密钥对,并且已将公钥添加到服务器上该用户的 ~/.ssh/authorized_keys 文件中。如果您还没有设置,请务必先完成这一步,否则禁用密码后您将无法登录服务器!
您可以参考以下简要步骤生成密钥并添加到服务器:
在本地电脑生成密钥对: ssh-keygen -t rsa -b 4096 (一路回车使用默认路径和空密码即可,或设置密码增强安全性)。
将公钥复制到服务器: ssh-copy-id username@your_server_ip (这个命令会自动将本地公钥复制到服务器的 ~/.ssh/authorized_keys 文件中,并设置正确权限)。
步骤 2:备份 sshd 配置文件
在进行任何修改之前,始终建议备份配置文件:
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 3:编辑 sshd 配置文件
使用您偏好的文本编辑器(如 nano 或 vim)打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
找到名为 PasswordAuthentication 的行。这行可能有以下几种状态:
#PasswordAuthentication yes (默认被注释掉,但通常会默认为 yes)
PasswordAuthentication yes
将其修改为:
PasswordAuthentication no
此外,确保以下行也被取消注释并设置为 yes:
PubkeyAuthentication yes
这是确保 SSH 密钥认证能够正常工作的关键。
保存并关闭文件。在 nano 中,按 Ctrl + O 保存,然后按 Ctrl + X 退出。
步骤 4:重启 sshd 服务
为了使配置更改生效,您需要重启 sshd 服务:
Bash
sudo systemctl restart sshd
步骤 5:测试连接
在关闭当前 SSH 会话之前,务必打开一个新的终端窗口或 SSH 客户端。 尝试使用您的用户通过密码登录。您应该会收到“Permission denied (publickey)”或类似的错误,表示密码登录已被禁用。
然后,再次尝试使用 SSH 密钥登录,确保您可以顺利进入服务器。如果可以,您就可以安全地关闭旧会话了。
2. 允许密码登录(不推荐,但有时需要)
在某些特定场景下(例如,您正在构建一个需要密码认证的服务,或在内部、高度隔离的网络中),您可能需要允许密码登录。
步骤 1:备份 sshd 配置文件
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
步骤 2:编辑 sshd 配置文件
打开 sshd 配置文件:
Bash
sudo nano /etc/ssh/sshd_config
找到 PasswordAuthentication 行。确保它被取消注释并设置为 yes:
PasswordAuthentication yes
同时,您可能还需要检查 UsePAM 选项,确保其设置为 yes(通常是默认值)。PAM (Pluggable Authentication Modules) 系统负责处理用户的认证过程,包括密码验证。
UsePAM yes
保存并关闭文件。
步骤 3:重启 sshd 服务
Bash
sudo systemctl restart sshd
步骤 4:测试连接
尝试使用密码登录您的用户账户,验证是否成功。
重要提示:
安全优先级: 禁用密码登录并通过 SSH 密钥认证是加强服务器安全的首要步骤。密码容易被猜解、暴力破解或通过字典攻击攻破。
确保可用性: 在禁用密码登录之前,务必确保您有备用且可靠的 SSH 密钥访问方式。否则,您可能会将自己锁定在服务器之外。
除了使用密码登录之外,还能使用什么方式登录服务器
1. SSH 密钥认证 (SSH Key Authentication) - 最常用和推荐的方式
SSH 密钥认证是替代密码登录最广泛使用且高度安全的方法。
工作原理:
生成密钥对: 你在本地计算机(客户端)上生成一对密钥:一个私钥 (private key) 和一个公钥 (public key)。
私钥: 必须严格保密,存储在你的本地计算机上,绝不能共享给任何人。它就像你家的钥匙。
公钥: 可以公开分享,你需要将它添加到你想要登录的服务器上的用户账户的 ~/.ssh/authorized_keys 文件中。它就像你家的门锁。
认证过程: 当你尝试使用 SSH 密钥登录时:
客户端向服务器发送你的用户名和公钥。
服务器会查找其 authorized_keys 文件中是否有匹配的公钥。
如果找到,服务器会生成一个随机数据,并使用你的公钥对其进行加密,然后发送回客户端。
客户端使用其私钥解密这个数据。
客户端将解密后的数据(可能经过哈希处理)发送回服务器。
服务器验证这个数据是否与它最初加密的数据匹配。如果匹配,认证成功,你就可以登录了。
优点:
安全性高: 私钥永远不会离开你的本地设备,不需要在网络上传输,大大降低了被截获的风险。密钥对通常比密码长且复杂得多,几乎不可能被暴力破解。
方便性: 一旦设置好,你通常不需要每次登录都输入密码(除非你的私钥也设置了密码,但可以通过 SSH Agent 管理)。这对于自动化脚本和频繁的远程操作非常有用。
密码无关: 即使你的系统密码泄露,没有私钥,攻击者也无法通过 SSH 登录。
2. SSH 证书认证 (SSH Certificate Authentication)
SSH 证书认证是更高级和企业级的密钥认证形式,特别适用于管理大量服务器和用户。
工作原理:
证书颁发机构 (CA): 你在网络中设置一个受信任的 SSH 证书颁发机构 (CA)。
签发证书: CA 使用其私钥对用户的公钥或服务器的公钥进行签名,生成一个带有额外元数据(如有效期、用户或主机身份等)的证书。
认证过程:
客户端向服务器发送其证书和密钥。
服务器检查该证书是否由其信任的 CA 签名,并验证证书是否有效。
如果证书有效,服务器接受认证。
优点:
大规模管理: 极大地简化了大量用户和服务器的 SSH 密钥管理。你不需要在每台服务器的 authorized_keys 文件中手动添加每个用户的公钥。
过期控制: 证书可以设置有效期,到期后自动失效,增强了安全性。
撤销列表: CA 可以发布证书撤销列表,禁用已泄露或不再信任的证书。
3. 多因素认证 (Multi-Factor Authentication - MFA / 2FA)
MFA 并非单独的认证方式,而是在原有认证方式(如密码或密钥)之上增加一个或多个额外的验证因素。它为 SSH 登录提供了额外的安全层。
工作原理:
用户需要提供两个或更多独立的凭据才能登录,这些凭据通常属于以下类别:
知识因素: 你知道的东西(如密码、PIN 码)。
所有权因素: 你拥有的东西(如手机上的一次性验证码、硬件安全密钥)。
生物特征因素: 你是谁(如指纹、面部识别)。
常见实现方式:
密码 + TOTP(基于时间的一次性密码): 用户输入密码后,还需要输入一个由智能手机应用(如 Google Authenticator, Authy)生成的动态 6 位或 8 位代码。
SSH 密钥 + TOTP: 用户使用其 SSH 私钥认证后,再输入一次性验证码。
SSH 密钥 + 硬件安全密钥 (U2F/FIDO2): 使用密钥认证后,再通过插入 USB 密钥并按键来完成二次验证。
优点:
极大增强安全性: 即使一个认证因素被泄露,攻击者也无法单独通过它登录。例如,即使密码被盗,没有手机上的一次性代码也无法登录。
文件的rwx权限分别是什么意思,如何用数字表示
文件的 rwx 权限分别是什么意思?
文件权限分为三组,每组都有 r、w、x 权限:
所有者 (Owner):文件或目录的创建者(通常)。
所属组 (Group):与文件关联的用户组中的所有用户。
其他人 (Others):既不是所有者,也不属于所属组的所有其他用户。
对于这三类用户,rwx 的含义如下:
1. r (Read) - 读取权限
对于文件: 允许用户查看文件的内容。你可以使用 cat、less 等命令读取文件,或用文本编辑器打开文件查看内容。
对于目录: 允许用户列出目录中的文件和子目录的名称。你可以使用 ls 命令查看目录内容。但要注意,如果没有执行权限 (x),即使有读权限,也无法进入该目录或访问其子文件。
2. w (Write) - 写入权限
对于文件: 允许用户修改、编辑或删除文件的内容。你可以在文件中添加、删除或更改文本,也可以直接删除这个文件。
对于目录: 允许用户在该目录内创建、删除、重命名文件或子目录。请注意,要对目录执行写操作,通常还需要同时拥有执行权限 (x)。
3. x (Execute) - 执行权限
对于文件: 允许用户将文件作为程序或脚本来运行。如果一个文件是一个可执行程序或脚本(如 Shell 脚本),没有 x 权限就无法运行它。
对于目录: 允许用户进入(“穿越”或“搜索”)该目录。你可以使用 cd 命令进入该目录,并访问该目录下的文件(如果你有相应的文件权限)。如果没有 x 权限,即使有 r 权限也无法进入目录查看内容。
文件权限777是什么意思
文件权限 777 在 Linux/Unix 系统中表示最高的权限级别,它意味着所有用户都对该文件或目录拥有完全的读、写、和执行权限。
让我们来详细分解一下这个数字的含义:
权限数字分解
在 Linux 权限系统中,每种权限都对应一个数字值:
r (read - 读取) = 4
w (write - 写入) = 2
x (execute - 执行) = 1
- (no permission - 无权限) = 0
文件权限由三位八进制数字组成,分别代表所有者、所属组和其他人的权限。
第一位数字:代表文件所有者的权限。
第二位数字:代表文件所属组的权限。
第三位数字:代表其他用户(既不是所有者,也不属于所属组)的权限。
777 的具体含义
当我们将每个权限位的值相加时:
7 (rwx) = 4 (读) +2 (写) +1 (执行)
所以,权限 777 的含义是:
所有者(第一个 7): 拥有 读、写、执行 的权限。
所属组(第二个 7): 拥有 读、写、执行 的权限。
其他人(第三个 7): 拥有 读、写、执行 的权限。
文件权限如何与文件所属和文件组配合
文件权限与文件所属和文件组的配合机制
每个文件和目录在 Linux 中都有三个核心属性来控制访问:
所有者 (Owner): 拥有该文件或目录的用户账户。通常是创建该文件的用户,但也可以由 root 用户使用 chown 命令更改。
所属组 (Group): 拥有该文件或目录的用户组。通常是所有者的主组,但也可以由 root 用户使用 chown 或 chgrp 命令更改。
权限 (Permissions): 分为三组,分别对应所有者、所属组和其他用户,每组包含读 (r)、写 (w)、执行 (x) 权限。
权限的判断顺序
当一个用户尝试对一个文件或目录进行操作时,Linux 系统会按照固定的顺序来检查和应用权限:
检查所有者权限:
系统首先会检查尝试访问的用户是否是该文件的所有者。
如果是,那么系统只会应用**所有者(User)**那一组的权限,而忽略所属组和其他人的权限。
示例: 如果文件权限是 rwxr-xr--,用户 alice 是文件所有者,那么 alice 对文件拥有 rwx (读、写、执行) 权限,即使 alice 也属于文件的所属组,她也不会被限制在所属组的 r-x 权限之下。
检查所属组权限:
如果尝试访问的用户不是该文件的所有者,系统会接着检查该用户是否是文件所属组的成员。
如果是,那么系统会应用**所属组(Group)**那一组的权限,而忽略其他人的权限。
示例: 文件权限仍然是 rwxr-xr--,用户 bob 不是文件所有者 alice,但 bob 属于文件的所属组 developers。那么 bob 对文件拥有 r-x (读、执行) 权限。
检查其他人权限:
如果尝试访问的用户既不是文件的所有者,也不属于文件的所属组,那么系统会应用**其他人(Others)**那一组的权限。
示例: 文件权限仍是 rwxr-xr--,用户 charlie 既不是 alice,也不属于 developers 组。那么 charlie 对文件拥有 r-- (只读) 权限。
创建两个用户,dev、ops
创建 dev 和 ops 用户
在 Ubuntu 中,你可以使用 adduser 命令来创建用户。这个命令比 useradd 更友好,因为它会自动处理一些必要的配置,比如创建用户的主目录、复制骨架文件等。
1. 创建 dev 用户
打开你的终端,然后输入以下命令来创建 dev 用户:
Bash
sudo adduser dev
执行这个命令后,系统会提示你:
输入新用户的密码: 两次输入相同的密码。请确保密码强度足够。
输入新用户的全名 (Full Name): 这是可选的,你可以直接按 Enter 跳过。
输入房间号、电话号码等信息: 这些都是可选信息,直接按 Enter 跳过即可。
确认信息是否正确: 输入 Y 然后按 Enter 确认。
2. 创建 ops 用户
以同样的方式,你可以创建 ops 用户:
Bash
sudo adduser ops
系统会再次提示你设置密码和可选的用户信息。
创建一个组,ymyw,将上面两个用户加入此组
好的,我们来创建一个名为 ymyw 的新组,然后把之前创建的 dev 和 ops 这两个用户添加进去。
1. 创建新组 ymyw
首先,我们需要创建这个新的用户组。在 Linux 中,你可以使用 groupadd 命令来完成。
Bash
sudo groupadd ymyw
这个命令会创建一个名为 ymyw 的新用户组。你不会看到任何输出,除非操作失败。
2. 将用户 dev 加入到 ymyw 组
接下来,我们将用户 dev 添加到 ymyw 这个组中。我们可以使用 usermod 命令,并结合 -aG 选项。
-a:表示“append”(追加),意味着将用户添加到新的组中,而不会将其从已有的其他组中移除。
-G:表示指定“supplementary groups”(附属组)。
Bash
sudo usermod -aG ymyw dev
3. 将用户 ops 加入到 ymyw 组
同样地,我们也将用户 ops 添加到 ymyw 组:
Bash
sudo usermod -aG ymyw ops
4. 验证用户是否已加入组
你可以通过以下命令来验证用户是否成功加入到 ymyw 组:
验证 dev 用户:
Bash
groups dev
输出应该会包含 ymyw,例如:
dev : dev ymyw (这里的 dev 是他的主组,ymyw 是他新加入的附属组)
验证 ops 用户:
Bash
groups ops
输出应该会包含 ymyw,例如:
ops : ops ymyw (这里的 ops 是他的主组,ymyw 是他新加入的附属组)
或者,查看组的成员:
你也可以查看 ymyw 组的成员列表:
Bash
getent group ymyw
输出应该类似:
ymyw❌1003:dev,ops (这里的 1003 是 ymyw 组的 GID,后面列出了 dev,ops 两个成员)
现在,dev 和 ops 用户都已经是 ymyw 组的成员了。这意味着你可以通过为 ymyw 组设置文件或目录权限,来方便地控制这两个用户对特定资源的访问。
创建一个文件,设置其权限只允许ymyw组内人员访问
1. 创建文件
你可以使用 touch 命令快速创建一个空文件,或者使用任何文本编辑器来创建并写入内容。这里我们创建一个名为 test.txt 的文件:
Bash
touch test.txt
2. 更改文件的所属组为 ymyw
默认情况下,新创建的文件的所属组会是文件所有者(即当前用户)的主组。我们需要使用 chgrp 命令来更改文件的所属组为 ymyw。
Bash
sudo chgrp ymyw test.txt
sudo: 以超级用户权限运行命令,因为修改文件的组通常需要此权限。
chgrp: 更改文件所属组的命令。
ymyw: 要设置的新的用户组名称。
test.txt: 目标文件名。
3. 设置文件权限
现在,我们将设置文件的权限,确保只有 ymyw 组的成员可以读写该文件,而文件所有者和其他用户则没有任何权限。
我们可以使用八进制数字 660 来实现这个权限设置:
6 (rw-): 文件所有者(User)的权限:读 (4) + 写 (2)。
6 (rw-): 所属组(Group)的权限:读 (4) + 写 (2)。
0 (---): 其他人(Others)的权限:无权限 (0)。
Bash
sudo chmod 660 test.txt
chmod: 更改文件权限的命令。
660: 我们设置的八进制权限。
test.txt: 目标文件名。
4. 验证文件权限和所属
你可以使用 ls -l 命令来验证文件的权限和所属组:
Bash
ls -l test.txt
输出应该类似于这样:
-rw-rw---- 1 your_username ymyw 0 Jun 18 04:15 test.txt
这里:
-rw-rw---- 表示权限:
-rw- 是文件所有者的权限(读写)。
rw- 是 ymyw 组的权限(读写)。
---- 是其他用户的权限(无权限)。
your_username 是文件的所有者(也就是你当前登录的用户,如果是由你创建的)。
ymyw 是文件的所属组,这表明我们成功将其更改为 ymyw。
如何测试访问?
现在,dev 和 ops 用户作为 ymyw 组的成员,将能够读写 test.txt。
你可以尝试用 dev 或 ops 用户登录(或使用 su - dev 切换用户),然后尝试读取或修改这个文件:
Bash
# 切换到 dev 用户(需要输入 dev 用户的密码) su - dev # 尝试读取文件 cat test.txt # 尝试修改文件 echo "Hello from dev" >> test.txt # 切换回 root 或你的管理用户 exit
然后,你可以尝试用一个不属于 ymyw 组的用户(比如你创建的另一个测试用户,或者甚至是你当前的普通用户,如果它不在 ymyw 组内)来访问它,你会发现权限被拒绝:
Bash
# 切换到某个不在 ymyw 组的用户 su - some_other_user # 尝试读取文件 cat test.txt # 预计会显示:Permission denied # 尝试修改文件 echo "Trying to write" >> test.txt # 预计会显示:Permission denied
通过这些步骤,你就成功地创建了一个文件,并将其权限设置为仅允许 ymyw 组的成员访问。
文件的x权限,和目录的x权限有什么作用
文件的 x 权限(执行权限)
对于文件来说,x 权限的含义非常直观:
允许用户将该文件作为程序或脚本来运行。
如果一个文件是可执行的二进制程序(比如编译好的 C 语言程序),或者是一个 Shell 脚本(如 .sh 文件)、Python 脚本等,它必须拥有 x 权限才能被用户直接运行。
如果没有 x 权限,即使是文件的所有者,也无法直接执行它。当你尝试运行一个没有 x 权限的文件时,你会看到“Permission denied”(权限被拒绝)的错误。
举例:
一个名为 myscript.sh 的 Shell 脚本,如果权限是 rw-r--r-- (644),你将无法直接运行它。你需要使用 chmod +x myscript.sh 将其权限更改为 rwxr-xr-x (755) 后才能运行。
如果你想执行一个没有 x 权限的脚本,你也可以通过将其作为参数传递给解释器来运行,例如 bash myscript.sh,但这与直接执行是不同的,因为它绕过了文件本身的执行权限检查。
目录的 x 权限(进入/搜索权限)
对于目录来说,x 权限的含义则有所不同,它表示“进入”或“搜索”该目录的权限:
允许用户进入(change directory into)该目录。
你可以使用 cd 命令进入到拥有 x 权限的目录中。
如果没有 x 权限,即使你拥有该目录的读 (r) 权限,你也无法使用 cd 进入该目录。你甚至不能访问该目录下的任何文件,因为你无法“穿过”目录边界。
允许用户访问该目录内的文件和子目录,前提是用户对这些文件和子目录本身也拥有相应权限。
这意味着,如果你想访问目录 A 中的文件 file.txt,你不仅需要对 file.txt 拥有读写权限,还需要对目录 A 拥有 x 权限。
允许用户搜索目录中的内容。 即使你没有读 (r) 权限来列出目录中的所有文件,但只要有 x 权限,你就可以访问已知名称的文件(如果你对该文件本身有权限的话)。
结合 r 权限来理解:
只有 x 权限,没有 r 权限 (例如 --x 或 001): 你可以进入目录(cd),也可以访问你知道名称的目录中的文件(如果你对这些文件有读写权限),但你无法使用 ls 命令列出目录中的内容。
只有 r 权限,没有 x 权限 (例如 r-- 或 400): 你可以列出目录中的内容 (ls),看到目录内有哪些文件和子目录的名称,但你无法进入该目录 (cd) 或访问其中的任何文件。你会看到“Permission denied”错误。
同时拥有 r 和 x 权限 (例如 r-x 或 500): 这是目录最常见的权限组合。你既可以列出目录中的内容 (ls),也可以进入目录 (cd) 并访问其中的文件。
举例:
如果 /home/user/mydata 目录的权限是 drwxr----- (740),用户 otheruser 不属于 user 组,那么 otheruser 就无法 cd 进入 mydata 目录,也无法访问其中的任何文件。即使 mydata 目录里有个 public.txt 文件权限是 rw-rw-rw- (666),otheruser 也无法访问,因为他无法“穿过”目录的屏障。
总的来说,x 权限在文件和目录上的作用虽然都与“执行”相关,但具体含义有所不同:
文件的 x: 允许运行文件。
目录的 x: 允许进入/遍历目录。
Linux常用的终端软件有哪些
Windows Terminal
PowerShell
XShell
Fluent Terminal
MobaXterm
Tabby
WindTerm
Wrap
sshx
Shell360
IShell
FinalShell使用任意终端连接到你的Linux机器