本篇是《Linux实务问答与操作》系列文章的第二个部分-系统篇。主要讨论在Linux操作系统配置和管理相关的内容,包括系统信息和状态、磁盘和文件系统管理、网络管理、程序执行等方面的内容。主要目的是为了回答在Linux系统安装完成后,作为使用者随之会提出的几个基本哲学问题: 我是谁?我在哪里?我能做什么?我要做什么?
具体如下:
- 如何与系统进行操作和交互?
- 如何配置和使用SSH?
- 作为管理员,应该注意什么?
- 如何管理程序的运行,包括启动、结束和中断?
- 如何查看当前系统的基本信息?
- 如何管理磁盘和文件?
- 如何编辑配置文件?
- Linux文件权限是怎么管理的?
- 如何配置网络?
- 如何安装和管理软件?
- 如何使用管道,重定向,和其他辅助指令?
本篇内容中相关的命令和配置方式,都是基于Debian操作系统,其他Linux系统其实也是类似的,可能会有差异,但不会差异太大。此外,笔者相信“实践出真知”,并强烈建议读者在阅读本系列文章的过程中,找一个实际的Linux系统进行相关的操作,这样可以最大程度的理解本文叙述的内容和思想,甚至从异常和错误中,都可以更形象和深刻的理解和掌握相关的知识和信息。
如何与系统进行操作和交互?
在一个正常的系统上,我们都使用常规的鼠标、键盘和显示器,连接到物理主机上进行系统管理。Linux系统正常安装完成重新启动后,会在显示器上显示一个命令行的登录界面,用户可以使用安装时设置的用户名和密码登录系统,并进行后续的管理工作,通常也是在命令行界面里面进行的。Linux实现这种操作模型,主要通过两类组件来完成。TTY(终端设备,来源于TeleTypewriter电传打字机)是Linix系统提供的虚拟接口,通过这个接口,可以接收键盘命令并且输出处理结果;Shell是一个命令解释器,它可以负责解释和执行TTY输入的命令,Linux系统默认的命令解释器是Bash,其他可选的解释器可以如sh,zsh等等,取决于使用的Linux发现版本的选择和配置。
显然,如果必须直接连接到物理系统上进行操作,对于运维人员而言,是非常不方便的。所以,在大多数运维的场景中,我们都是通过网络连接远程系统进行操作的,即所谓"无头"的系统。早期时候通常使用Telnet(电话网络、远程终端)协议进行连接,但这个协议不安全,已经被淘汰了。现在我们常用SSH(Secure S Host)这个协议和技术来实现远程主机的安全连接,由于使用非常广泛,SSH已经成为linux远程系统管理的工具的事实标准。无论是Telnet还是SSH,它们都有一个特点就是可以直接对TTY进行映射,这样即便是远程操作,也和在本地操作的习惯和模式是完全相同的。
由于TTY是一个虚拟接口,所以它可以支持各种不同的连接方式,如本地的键盘和显示器、串口远程连接(很多交换机和路由器就是这样配置的)、IP网络连接(Telnet或者SSH)。关于SSH这个协议,它的功能远超一般想象中的就是一个加密的Telnet,非常强大也非常有趣,笔者后面有机会将单独撰写一篇文章进行讨论。
所以我们知道,无论使用何种连接方式,我们最终会得到一个Shell(bash)程序界面,并可以使用命令行方式和相关命令来对系统进行操作和管理了。
如何配置和使用SSH
最理想的情况下,安装完成linux系统重启后,SSH就可以使用了。这个情况也包括很多云服务提供的Linux虚拟机系统。
作为一个标准的网络CS模式应用软件,SSH也是客户端/服务器软件的使用模式。 通常在我们需要管理的主机上,运行SSH服务器系统;我们在管理工作站系统上,可以使用SSH客户端软件,通过网络去远程连接这个服务器进行操作。
在Linux系统上,标准的SSH客户端就是一个ssh命令行程序,可以使用下列方式来连接:
ssh user@host
连接成功后,可能会提示所使用的服务端公钥,并提示输入远程系统的用户名和密码,登录成功后,可以通过当前状态的提示符,看到已经登录并连接到了远程的系统。
如果无法顺利连接,可以参考以下方法和命令进行故障的排查,这些操作可能只能在本地操作,ssh服务器的程序名称为sshd(SSH Deamon, 守护程序), 而ssh命令,在Linux系统中其实是客户端:
- 检查SSH软件是否安装
sudo which sshd
- 检查SSH服务是否启动,或者程序是否在执行
sudo systemctl status sshd sudo ps aux | grep sshd
- SSH监听的IP地址和端口
sudo netstat -lpnt | grep ssh
ssh服务默认使用22端口,如果使用其他的端口,在连接时需要指定(使用 -p 参数)不能忽略。
- 检查防火墙是否阻拦了SSH服务端口
这里虽然只是讨论SSH这个协议和应用,但实际上,这个步骤和方法论几乎适用于所有客户端/服务器模式的应用,也就是通用的。
如果用户使用的管理工作站是Windows系统,那么情况就比较复杂,通常需要安装一个兼容SSH客户端协议的终端软件。一些推荐的软件包括:
- Windows Linux Subsystem: 是的,现代的Windows系统已经内置了Linux子系统
- Putty: 这是经典常用的终端软件,个人觉得功能比较简陋薄弱,另外好像对中文的支持不是很好
- Termius: 笔者在用的软件,它的连接配置管理功能很强大,还支持sftp和端口转发,但偶尔会假死
- Xshell, Powershell, Tabby: 爱用哪个用哪个,都差不多
- 如果你用Mac,就用默认的终端程序吧
作为管理员,应该注意什么?
Linux系统默认管理员账号是root,比如在系统安装的时候,可能会遇到配置root账号密码的环节。但直接使用root账号来进行系统的管理和操作,在系统安全上,并不是一个好的做法,因为其权限范围太大,违法了权限最小、按需授权的原则。
一个比较好的做法,就是对授权进行分级处理。管理员不直接使用root账号,而是创建普通用户的账号,然后对其授权为管理员,这样,根账号得到了保护,并且可以随时对用户账号进行授权和撤销管理。这个操作,可以使用sudo来完成,使用以下命令,可以将一个普通用户设置为管理员(意思是修改用户到sudo组中,还有一些linux版本是修改sudo文件):
usermod -aG sudo username
在授权用户管理员之后,用户就可以使用sudo命令,来临时的执行管理员权限和任务了:
sudo apt update ## 更新软件库
sudo -i ## 切换到root角色
sudo su - postgres ## 切换到另一个账号
作为系统管理,需要注意什么问题呢?其实,在Linix系统中,已经有了一个很好的答案。当你作为系统管理员,第一次尝试要执行一个系统管理任务的时候(比如sudo ....),可能会看到下面的提示,笔者强烈建议所有系统管理员都能够认真阅读、思考并理解这些内容,因为它有关于职业道德和专业精神:
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
我们相信你已经收到如下关于本地系统管理员的常规告诫,它可以归结为以下三点:
1 尊重他人的隐私
2 在键入命令之前,思考一下
3 权力越大,责任越大
如何管理程序的运行,包括启动、结束和中断?
在Linux终端Shell中,执行一个命令非常简单,直接输入命令的可执行文件,再可选的加入相关参数即可。但真正的命令执行程序,却远非那么简单。
首先是它怎么知道这个命令程序在那里? 通常情况下,都不会在当前的目录中,因为默认用户登录后,所在的文件夹是其home目录,不可能有所有的可执行文件。Linux系统是这样处理的,它的大部分工具命令,都在/usr/bin,或者/sbin等文件夹中(这里的bin是binary,二进制文件的意思);然后当用户登录系统后,它将这些文件夹加入了用户的环境变量,当用户输入命令时,系统就在这些文件夹中搜索是否有匹配的项目了。
其次,作为一个安全的设计和机制,所有程序都是以当前或者指定的用户账号的身份来执行的,也继承用户的身份和权限。包括用户是否有权限来执行这个程序。Linux系统中,专门为文件设计了一个“执行”权限,只有匹配权限的用户,才能够运行这个程序。如果没有执行权限,系统会报相关权限不足的错误。
还有一个问题也是和权限相关的。比如程序在执行时,需要对文件系统进行访问和操作。用户可能有权执行程序,但没有权限通过程序来操作文件,这时可能也会出现权限不足的问题(典型的比如复制文件到一个无写入权限的文件夹)。
程序在正常运行当中,可以使用ps命令检查其状态。在其中,我们可以看到系统给程序分配的进程ID,程序当前使用的CPU和内存等资源。对于网络服务类的应用,要检查和确认其侦听的网络端口,可以使用netstat命令。
在linux系统中,运行的程序,大体可以分为三种程序。普通的程序可以通过Shell命令来启动,执行一个阶段性的任务,完成后程序就自动退出了,比如常用的文件复制命令,就是执行一个文件复制的操作,完成后就自动退出了。有的程序是持久化的程序,比如Linux系统中很多的服务程序比如nginx web服务都是这样的,启动后,就会永远运行下去,直到主动或者被动的中断其运行。有些持久化程序依附于shell,如果shell中断(比如SSH连接中断,或者注销),该程序也会中断;有些程序则可以脱离shell,在系统后端运行,和终端状态无关,我们可以称之为服务程序。
首先需要明确,所谓的“服务程序”和普通程序其实是没有本质的区别的,对于系统而言都是一个用户程序。所以我们可以很容易的将一个普通的程序“改造”为一个服务程序,或者用下面几种方式,可以让程序的运行和shell状态分开。
- &和nohup 指令
可以使用 &和nohup 指令,告知系统需要在后台运行程序,而不是占用shell会话。
command & ## 后台执行
nohup command & ## 后台执行,并忽略挂起信号
nohup ./script.sh > output.log & ## 后台执行命令,并重定向输出信息
nohup的意思是忽略挂起信号,这个信号会在终端关闭、会话关闭或者连接中断时发送,这样可以真正的实现在后台运行,和启动的终端、用户完全隔离。
- screen
如果要持续监控程序输出信息,但又希望不受SSH连接中断的影响,可以考虑使用screen命令。screen是一个终端多路复用工具,可以让你在当前会话中,创建一个虚拟的会话和终端,这样你可以在其中执行一个正常的程序,但不受当前会话和终端的影响。比如由于某种原因SSH中断后,可以恢复screen和会话。比如,我们需要在远程的主机上,从互联网下载一个很大的文件,预期时间会非常长,担心SSH中断,会影响下载过程,就可以使用如下操作:
screen -S download ## 创建一个名为download的会话,并进入
wget ... ## 开始一个长时间的下载
ctrl+a+d ## 退出download会话,回答初始会话
screen -ls ## 列表当前会话
screen -r -d download ## 恢复并回到download会话
screen其实还有很多有趣而强大的特性,笔者有机会另外撰文讨论。
- 程序本身提供的参数和功能
一个典型的例子,就是新型的web应用程序: caddy。它可以使用下面的参数和命令来启动:
caddy start ## 启动后在后台运行
caddy run ## 普通运行
- systemd 服务脚本
我们现在看到的最常见的服务应用系统,比如sshd,它们安装完成之后,可以作为系统服务来启动和执行。其实这个没有什么太神秘的东西,它是通过编写一个规范化的配置脚本来实现的,以sshd为例,它的配置信息是sshd.service文件,可执行文件就是sshd:
cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
有了这个服务配置脚本,我们就可以使用通过的服务程序操作方式,来执行这个服务程序了。这里使用的系统和服务管理程序是systemd(原来也有用service和rc.d的),现在新的版本基本上都是这个了。systemd的标准操作包括:
systemd start sshd ## 启动一个服务
systemd stop sshd ## 停止服务
systemd restart sshd ## 重启服务
systemd status sshd ## 查看服务状态
systemd reload sshd ## 重新加载配置,不中断连接?
对于一般的非持久化和依附于shell的持续化程序而言,在其运行过程当中,如果我们希望主动终端,可以在其运行状态下,通过键盘输入ctrl-c(中断)命令来中断其运行,很多程序,可以使用q命令来从程序中退出。但如果其在后台运行,我们可能需要使用kill命令来中断其运行状态了。
ps aux | grep node ## 获取node进程id,如12345
kill 12345 ## 终止ID为12345的进程
kill -9 12345 ## 强行终止,慎用!!
如何查看当前系统的基本信息?
登录系统后,可以做的第一件事情,就是先查看一下当前系统的配置、状态等方面的信息,后续操作做到心中有数。 查看当前系统的信息,包括硬件、软件、网络、磁盘、外部设备、当前运行的程序等,相关的主要常用命令如下:
// 当前系统版本,内核版本,发行版
uname -a ## 内核版本
cat /etc/issue ## 发行版本,不同的发现版略有差异
// 当前用户(我是谁)
whoami
// 切换到管理员身份(很多系统管理任务需要这个权限)
sudo -i
// 当前系统时间和校时
date
ntpdate pool.ntp.org ## 网络校准时间
// 当前系统用户列表
cat /etc/passwd ## 用户信息是保存在 /etc/passwd文件中的
// 当前的文件夹
pwd
// 当前系统cpu、内存、磁盘、扩展槽设备
lscpu ## CPU架构、型号、核心数、频率、指令集标记...
lsmem ## 内存模块、容量
lsblk ## 检查可识别的磁盘和分区
lspci ## 常用于检查网卡、显卡型号配置
// 查看文件和磁盘使用情况
ls / ## 查看根文件夹
df -h ## 查看分区和使用情况, -h 是使用人类友好的单位,如M,G等等
cd / && du -h -d 1 ## 查看根目录个子目录的大小, du命令是查看文件和子文件夹大小, -d 是查询深度
// 当前网络配置信息和状态
ip addr ## 网络信息
hostname ## 网络主机名
routel ## 路由表
netstat -lpnt ## 检查当前系统使用端口的软件和有疑问的端口
// 当前运行的软件
top
ps aux | grep node ## 检查特定软件运行的状态
// 确认某个命令或者执行文件的存在
which which
这里简单提醒一下: 如果没有特别的要求,保持系统时间的正确,对于很多安全相关的应用是很重要的。比如如果时间不准,很多网络认证和软件安装,是不能正常完成的。
如何管理磁盘和文件?
管理磁盘和分区,最常见的场景和操作就是添加了一个新硬盘,如何将其加入现有的文件系统了。我们以一个典型的简化后的场景为例,其基本操作过程和命令包括:
# 1 查看磁盘驱动器是否已经被识别, linux一般是即插即用的
lsblk
# 2 磁盘分区
fdisk /dev/sdh
# 相关子命令包括
p-显示当前分区
g-使用gpt分区表
n-创建一个分区
w-写入分区表
# 3 分区格式化
mkfs.ext4 /dev/sdh1
# 4 挂载分区(可能需要先创建 /mnt/disk2子文件夹)
mount /dev/sdh1 /mnt/disk2
# 5 检查挂载
df -h
文件操作的主要任务,可能包括列表,复制,移动,删除等等,这些命令包括:
cd - 改变当前目录 ls - 列表当前目录内容 cp - 复制文件 mv - 移动文件 rm - 删除文件和文件夹
当然,这些命令都有很多选项和参数,如果需要,可能需要查询相关资料和手册。这些内容太多,就不在这里讨论了。
这里需要注意,Linix系统中,EveryThing is File,所以有些东西看起来是文件,比如/dev文件夹下面那些,但其实并不是真正的文件,所以一个比较好的操作习惯是,作为用户,只在自己的主文件夹中,或者/opt文件夹中进行文件的管理和操作。
Linux系统还内置了打包和压缩文件的程序,通过tar命令来完成。tar的常见参数,c-创建归档, z-压缩,f-文件名 ,t-检查内容,x-提取, v-详情:
tar cvfz backup.tar.gz file folder ## 打包并压缩文件
tar xvzf backup.tar.gz ## 提取并解压缩
如何编辑配置文件
Linux系统中,很多系统管理的任务,特别是持久化配置(重新启动后仍然生效)的任务,都是通过编辑相关的配置文件完成的。作为规范,Linux系统通常使用/etc 文件夹保存相关的配置信息和文件。
配置文件有了,如何对其进行编辑呢?就需要用到相关的编辑工具软件了。在Debian系统中,通常使用两个编辑工具:vi和nano,当然用户可以使用任何自己喜欢的编辑工具,只不过这两个编辑工具是内置在系统中的,开箱就可以使用,对于一般的配置任务而言足够了而已。
vi是从unix时代起就在使用的文本编辑器,可以称之为“上古神器”了。但对于不是从那个时代来的用户而言,总是感觉有点奇怪。我们可以使用“vi 文件名” 打开文件和编辑界面,但这时候并不能直接开始编辑。它有查看和编辑两种模式,可以输入"i"进入编辑(插入)模式,才能够真正进入编辑模式进行编辑。退出也不能直接退出,需要输入":",进入命令模式,然后输入“wq”保存退出,或者"q!"不保存退出。
相比vi而言,nano就显得比较“常规”了。它就是一个正常的文本编辑器,打开文件后,可以使用光标在内容中移动进行编辑,完成后可以使用ctrl-x,退出并保存完成编辑工作。
不管是vi还是nano,这类编辑工具都有很多快捷方式,比如nano中ctrl-k可以删除整行等等。职业的管理员,或者大量经常需要进行管理配置的用户,就有必要认真仔细研究这些编辑工具的扩展功能,可以大大提高工作效率。这里只是给大家一个基本概念,就不深入探讨了。
如何配置网络
简单而言,配置网络,有实时配置和永久配置两者方式。
由于linux系统的网络配置和管理功能非常强大,比如动态增加ip地址,路由,给网卡分配多个ip,同时使用DHCP和手动配置等等,并且很多网络设置可以是实时的,都可以使用命令行完成,并且配置完成之后就可以立刻生效。
当然,如果要无头操作,最好还是一次配置好,这样系统重启之后配置信息就不会丢失。通常通过修改网络接口配置文件来完成。以Debian为例,其配置文件在 /etc/network/interfaces 中。
可以选择的配置项目包括
- 配置为使用DHCP
- 配置为静态IP
- 设置 address, netmask, gateway, nameserver
- 为同一个网卡配置不同的IP地址,甚至不同的类型(DHCP/STATIC)
ip link ## 确认要配置的网卡名称
nano /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug ens18
iface ens18 inet dhcp
iface ens18:1 inet static
address 192.168.9.201
netmask 255.255.255.0
gateway 192.168.9.1
配置文件中,需要注意网卡的名称,可以使用ip link来事先查看和获取。在修改完成配置文件后,如果不想重新启动系统,可以重启networking服务来使配置生效(也有用ifdown ifup命令的,但要注意SSH中断的问题)。
除了网络配置文件外,也可以使用命令行来配置网络,以前经常使用ifconfig命令,现在通常直接使用ip命令配合选项参数来进行操作,以下相关的一些命令(最简单的):
// 列举当前网络配置和网卡连接状况
ip addr
ip link
// 给特定网卡加一个ip地址
ip addr add 192.168.9.134/24 dev enp5s0:1
// 只是想体验一下ip命令的强大
ip
// 修改一下DNS
nano /etc/resolv.conf
// 本机主机名
nano /etc/hostname
// 手动配置主机-ip地址
nano /etc/hosts
// 重启网络服务
sudo systemctl restart networking
如何安装和配置软件
我们前面已经提到,这几个主要的Linux发行版家族,其实是通过不同的包管理程序,也就是应用软件的安装和管理方式,来进行区分的。比如Debian这一族的Linux系统,使用的就是apt作为其软件包管理工具。
使用软件包管理的常见场景和命令如下:
// 更新仓库 升级系统
apt update && apt upgrade
// 搜索软件
apt search netstat
// 安装软件和常用软件包
apt install wget curl net-tools build-essential
// 卸载软件
apt remove curl
如何监控系统运行状态
监控系统运行状态,也是常见和日常的系统管理任务。常见的系统监控任务和指标是查看系统在CPU,内存,IO,网络等方面的使用和负载情况。具体涉及的工具和命令如下:
// 监控面板
top ## 默认性能面板
// 内存使用
free
// 磁盘使用和文件占用
df -h
du -h -d 1
// 当前执行的程序和进程
ps aux
ps aux | grep node ## 过滤显示
// 下面的工具可能需要安装
iftop ## 网卡流量监控
htop ## 一个功能更丰富的性能面板,需要安装
glance ## 另一个功能丰富的性能面板,需要安装
除了监控性能指标之外,管理员还有一个职责是查看系统异常和安全事件,这些通常通过查看和分析运行日志来完成。当然,由于一个繁忙的系统,可能会产生大量的日志,超过人工的处理能力,所以业界也提供了很多自动化分析工具来帮助完成这些任务,这里只列举日常管理我们可能关心的问题和事件,通常这些都是和安全和系统稳定性相关的:
- 异常登录尝试: 有可能黑客试图攻击你的系统
- Web服务日志异常巨大: 要么就是长时间未清理,要么就是可能受到DDOS攻击
- 磁盘和文件损害信息: 可能磁盘有故障或者坏道了
- 应用程序错误信息: 应用程序(特别是自己开发的)可能有缺陷或者bug
Linux文件权限是怎么管理的?
要理解Linux文件系统的权限,其实只需要理解以下几个概念,再进行组合就可以了。
- 属主用户- 标明这个项目属于某个用户
- 属主组: 标明这个项目属于某个用户组
- 所有用户: 不解释
- 读: 可以访问项目内容,对于目录而言,就是可以查看目录里面的文件和第一层子文件夹项目
- 写: 可以修改项目内容,对于目录而言,就是可以增加或者删除文件或者子文件夹
- 执行: 如果项目是可执行,比如可执行二进制文件,或者程序脚本,就可以执行
我们先来看一个文件的信息,我们随便在系统中,执行下面的命令:
root@db11-minio2:/# ls / -l
total 60
lrwxrwxrwx 1 root root 7 Aug 4 2022 bin -> usr/bin
drwxr-xr-x 3 root root 4096 Aug 4 2022 boot
drwxr-xr-x 17 root root 3140 May 30 10:43 dev
drwxr-xr-x 72 root root 4096 Jun 27 15:52 etc
drwxr-xr-x 3 root root 4096 Aug 5 2022 home
lrwxrwxrwx 1 root root 31 Aug 4 2022 initrd.img -> boot/initrd.img-5.10.0-16-amd64
lrwxrwxrwx 1 root root 30 Aug 4 2022 initrd.img.old
这个列表,其实就已经包括了丰富的信息。
- ls / -l 的意思是以列表的方式展示根文件夹中所有文件和子文件夹
- 一共60个项目
- ->表示,这是一个软连接(别名),这个在Linux系统中非常常见
- 文件信息中,第二列为硬连接数量,可以简单理解为关联项目如子文件夹的数量
让我们来看,其中boot项目,它的权限配置信息就是 drwxr-xr-x。它包括了以下几个信息:
- d表示这是一个目录(l是连接,-是普通文件)
- 后面的root:root,表示这个目录的属主用户和属主组是root用户和root组
- 后面的rwx...其实分成了三个权限组,分别是属主用户、属主组和所有用户
- 每个权限组中,都有三个权限项目,表示读(r,read)、写(w, write)和执行(x, excute)
- 在权限组中,-的意思是无权限
- 文件权限,也可以用数字来表示,如 751的意思是: 属主用户读写执行(1+2+4)、属主组读写、其他人只读
由于文件权限系统的存在,在权限配置错误的情况下,我们经常会遇到程序执行错误并提示权限不足的问题。这时,就需要进行权限的修改和配置。一般会用到修改属主的命令chown和修改权限的命令chmod。当然修改权限之前,首先需要有修改权限的权限,我们通常使用管理员角色来完成。
sudo mkdir /home/guser ## 创建用户文件夹
sudo chown -R guser:guser /home/guser ## 修改用户文件夹的属主
sudo chmod a+rw /home/guser ## 授权所有用户都可以读写
sudo chmod 777 /home/guser ## 开放所有权限,慎用!!
可执行x是一个比较特殊的权限,当我们编写了执行脚本,或者从网上下载了可执行文件时,可能需要先设置它们的执行权限(a+x)。
另外,除了默认和经典的Linux(其实是Unix)文件权限模型之外,Linux系统还扩展了基于ACL(Access Control List,访问控制列表)的权限模型,来提供更细粒度的权限控制机制。ACL的设置和启用比较复杂,如果没有特别的要求,实际应用中很少涉及,这里就不再赘述了。
如何配置和管理防火墙?
防火墙是Linux的一个很重要的网络安全机制,几乎所有发行版本都内置了防火墙系统,而且由于现在对网络安全越来越重视,防火墙是默认启动,并且默认安全的。我们经常会遇到部署和运行了一个网络应用系统,但无法从外部访问的情况,大概率是由于防火墙的存在和作用。在这种情况下,考虑到安全的问题,笔者不建议直接关闭防火墙,而是建议花一点时间了解和掌握其常用的操作和配置。
一般Linux系统提供了几种常用的防火墙软件系统,如firewalld等。
下面是firewalld的常见使用和配置命令;
// 查看某(活动)区域的规则
firewall-cmd --list-all --zone=home
// 打开一个端口
firewall-cmd --zone=home --add-port=8131/tcp --permanent
// 加载规则
firewall-cmd reload
如何使用管道,重定向,和其他辅助指令?
Linux在shell中提供了管道和重定向操作符,大大方便了系统管理,特别是文件相关操作和输入输出信息处理的工作。来看几个例子:
- cat
cat通常用于显示文件的内容。其实质是读取文件内容,并且显示在标准输出(终端)屏幕上。
- split
split命令可以用于文件切割,然后可以使用cat命令来进行合并。
// 分割文件
split -v -l1000 logfile log. ## 行文本模式, 1000行
split -v -b100M 1.mp4 1.mp4. ## 二进制模式,100M
// 合并分割的文件
$ cat 1.mp4.?? > 1.mp4
$ cat log.?? > logfile
- more
more的字面意思很简单,“更多”的意思,实际上它是一个分页器程序,它可以将内容分页依次显示。
more 1.log
cat 1.log | grep ssh | more
- grep
grep(global regular expression)是一个全局正则表达式过滤程序,你可以定义一个正则搜索条件,它可以来帮助你在内容中,过滤显示匹配条件的内容行。
- tail
tail可以显示一个文件的尾部内容(默认最后10行)。经常用于显示和跟踪日志文件的内容。如:
tail 1.log ## 显示log文件最后10行
tail -f 1.log ## 持续显示log文件最后10行,可以用于监视程序执行
- |管道命令
|可以把命令的输出和输入连接起来,来完成一些复合型的任务。比如我们要检查某个程序的运行情况,可以使用程序名称来对进程列表进行过滤(可能不严格,但应该可以满足需求)。
ps aux | grep ssh
- 重定向
重定向符包括两类,输出重定向">"和输入重定向"<"。“>>”和“<<”是追加模式。
使用重定向符,可以对文件和内容进行以下操作:
| 示例 | 说明 |
|---|---|
| command > file | 将输出重定向到 file。 |
| command < file | 将输入重定向到 file。 |
| command >> file | 将输出以追加的方式重定向到 file。 |
| n > file | 将文件描述符为 n 的文件重定向到 file。 |
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
| n >& m | 将输出文件 m 和 n 合并。 |
| n <& m | 将输入文件 m 和 n 合并。 |
| << tag | 将开始标记 tag和结束标记 tag之间的内容作为输入。 |