Linux必备知识(六)

Systemctl命令

Systemd用于管理正在运行的服务。还有service、daemon等术语,都是类似的。记住一点,systemd将服务定义为单元。

我们安装apache2测试:

sudo dnf install httpd。

ubuntu用的是sudo apt install apache2

输入:systemctl,不带参数。

将显示当前正在运行的服务,会有一大堆输出。

查询具体的服务:

systemctl status httpd

在ubuntu中将是systemctl status apache2

我们看到状态是disabled,表示系统启动时不会自动启动。我们来使它能在启动时启动。

sudo systemctl enable httpd

我们再用systemctl status httpd查看,能看到已经是enabled了。这样就可以在系统启动时自动启动。

我们手动启动:

sudo systemctl start httpd

可以通过访问网页查看是否正常http://ip地址。有些linux版本如fedora等可能还是不能访问,可以快速打开防火墙:sudo firewall-cmd –zone=public –permanent –add-service=http

同样的,停止命令也是简单的:

sudo systemctl stop httpd

禁用启动:

sudo systemctl disable httpd

enable的同时打开服务可以加上now选项:

sudo systemctl enable –now httpd

服务启动后,任何有权访问服务器的用户都可访问,有时候需要控制到特定的用户,如何做?

安装同步syncthing测试:sudo dnf install syncthing。syncthing是一个很棒的同步软件。

查看状态:

systemctl status syncthink@kelemi

我们加了@用户名表示安装它的用户,能看到具体状态。但要是不加用户,仅用systemctl status syncthink的话,但显示找不到服务。

启用及手动启动也一样加用户名:

sudo systemctl start syncthink@kelemi

sudo systemctl enable syncthink@kelemi

启动后,可以访问http:<IP>:8384看到web控制台,具体使用可以查看syncthink用法。

最后,我们看一下systemd单元文件

cd /usr/lib/systemd/system

能看到有很多服务。能找到刚装的syncthink@.service,我们查看下

有些一目了然,讲一下重点。

After:表示在这之后才启动该服务,比如这里必须要求有网络后才行network.target

User:是一个变量,表示运行它的用户

ExecStart:执行命令

Restart:这里表示在出错的时候重启。

。。。

WantedBy:表示可以命令行multi-user.target,而不是图形。

前面讲了不带参数的systemctl会列出很多,但实际上除了服务还会列出其他,我们可以用一个更优雅的命令仅列出服务。

systemctl list-unit-files –type=service

输出不仅可以看到服务名,还能看到状态,以及软件供应商的预设是enabled还是disabled。

还有一些命令:

重启:sudo systemctl restart httpd

类似重启,不用restart,而用reload:

sudo systemctl reload httpd

reload只应用新的配置,并非全部重启,推荐使用,尤其在web服务器上reload很常见。当然并非所有服务都支持reload,则会按restart运行。


符号链接Symbolic Links

符号链接可以从一个对象链接到另一个对象。 

先来了解下inode。

我们知道 ls 命令,比如ls -l查看详细列表,看到权限,是否目录等信息。

还有一个参数 i 用于查 inode

ls -i 

可以看到每个对象都有一个数字,当然也可以与其他参数一起用如 ls -li

什么是 inode?它是一个数据对象,包括文件系统中文件的元数据,包括有关文件的信息包括大小、权限,基本上除了文件名字和内容未存在inode,其他都包含。

每个存储介质都有一个inode组。比如将磁盘的文件移到移动硬盘上,inode就会改变,因为磁盘的inode组与移动硬盘的inode是不同的系统。 

回到链接,我们在windows上都用过快捷方式,其作用就是链接到其他对象。linux的链接类似这个概念。

有两路链接类型:符号链接 和 硬链接。

先说符号链接:

ln -s /home/kelemi/Documents/Weekly_Report.txt /home/kelemi/Desktop/

-s 表示符号链接,上述命令将Documents下的Weekly_Report.txt链接到桌面,注意写完整的路径。

ls -l 查看桌面文件,能看到链接文件以 l开头,并有一箭头表示。

链接文件与inode有什么关系。

我们创建链接 加上 -s 将会创建一个不同inode的对象,这个可以用ls -li可以查看到inode编号。

但要是不加 -s 将会创建硬链接,用ls -li 查看的话,前面不是 ”l“开头,而是 ”-“,也就是和普通文件没区别,而且与链接的对象是 inode编号是一样的

符号链接与硬链接的区别:

  1. 硬链接不能移到移动介质上。因为硬链接指向的是当前文件系统的inode,而在其他介质是不存在的,即便编号一样也是不一样的。而符号链接可以移到其他移动介质,因为它本身就是另外一个对象。
  2. 符号链接源文件必须用完整路径,用相对路径的话,符号链接在其他目录可能会出现路径不对找不至文件。而硬链接是可以用相对路径的,硬链接的文件即便源文件修改了文件名也不会断开。

实际使用中,符号链接用得比较多。主要是硬链接不能跨文件系统,比如无法移到移动介质中,另一个,其他人也不太容易看出硬链接,而符号链接很明显。


find命令

用find你不会在linux中漏掉要找的东西,let‘s go!

find有很多选项,这里介绍常见用法。

语法:find+开始查找的位置+选项。

find /home/kelemi -name *.txt

在我的主目录查找txt文件,其中*是通配符。

有时可能需要隐藏某些结果,比如上面的查询命令不想看.cache目录下的txt文件,可以连接grep命令

find /home/kelemi -name *.txt | grep -v .cache

过滤文件或目录:

find . -name Documents -type f

查找名为Documents的文件,有时候目录和文件同名容易混淆,指定type为f表示只查找文件。

我们在前面基础上再增加点复杂度:

find . -name Documents -type f -exec  rm {} +

执行后,将删除名为Documents的文件。

执行类似的命令要非常小心,它将删除找到的所有项目,有些时候可能会超出你的想象。

-exec 表示执行找到的每个项目

rm 是具体的执行命令,这里是删除

{} 是占位符,代表找到的每一个项目

+ 是终止符,终止每一次迭代。现在也比较常见用 \; 代替,但分号需要在前面加个转义符。总之 加号和分号都是有效的。

批量修改权限:

假设 Pictures目录下有一些旅行目录,我想将这些目录里的图片权限改成600,也就是只有我本人可以读写。传统的方式是用chmod

chmod -R 600 Pictures/

其中 -R表示递归执行修改该目录下的所有文件和目录。

这样执行之后,你会发现即便自己也不能打开目录,因为目录需要执行 x 权限,我已成功地将自己锁在外面。

所以只好再执行

chmod -R u+x Pictures/

现在目录能打开了,但Pictures下的图片文件也被赋了x权限,这是没必要的!

用find则能精确控制:

find /Pictures -type f -exec chmod 600 {} +

find /Pictures -type d -exec chmod 700 {} +

将所有图片文件赋600权限,而对需要执行权限的目录则赋700权限,完美。所以批量修改权限建议使用find。

再看一个清除日志的例子。

/var/log下有很多日志,我们可能想清除,用find可以很方便处理。

首先查一下日志,确认准备清除的日志清单

find /var/log -type f -name *.log

确认可以清除,则执行

find /var/log -type f -name *.log -exec truncate -s 0 {} +

truncate表示截取,这里是将文件内容截取为0大小,但文件不删。

find还有很多其他选项,但我们已掌握最基本的用法了。其他选项也是很容易就会了解的。

我们可以将查询结果重定向到文件,如:

find . -name *.mp3 > results.txt


理解文件和目录权限

用ls -l 命令我们看到的第一列就是权限字符串,类似

drwxr-xr-x

权限字符串有四部分:

第一部分,左边第1个字符,d 表示目录,- 表示文件,l 表示链接;

第二部分,3个字符,表示文件或目录所属用户的权限,rwx 分别表示读写和执行,没有相关权限用-表示,比如 r-x表示具体读和执行权限,但没有写权限。对于执行,文件跟目录是不同的,文件可执行就表示该文件包含执行命令是一个脚本或程序,目录可执行则表示可以进入该目录。对于写,目录可写表示可以在该目录里添加删除文件。

第三部分,3个字符,表示文件目录所属组的权限。

第四部分,3个字符,表示其他人对该文件目录的权限。

实际例子来一个:

在主目录上创建文件testfile.txt,用nano或vim键入一行:

ls -l /etc

保存文件。

通过查看,我们知道该文件的权限字符串是 -rw-rw-r–

在当前目录执行下: ./testfile.txt

得到提示是没权限。原因是我们未赋予该文件执行权限。

*用 bash testfile.txt 执行查看的话,是能看到/etc目录列表的,说明脚本没问题。

我们来添加执行权限:

chmod +x testfile.txt

再用ls -l 查看时,发现权限字符串变成了 -rwxrwxr-x ,同时文件颜色也变成了绿色(绿色是由shell设定的,每个发行版未必都将可执行文件设为绿色)。

+前面不加 说明用户、组、其他人都加上执行权限,我们可以单独给某部分加上权限或减去权限:

chmod u-x testfile.txt

chmod u+x testfile.txt

chmod g-x testfile.txt

chmod o-x testfile.txt

赋予执行权限后,就可以执行该文件了。

./testfile.txt

除了x,当然也可能控制读写rw,如

chmod g-r testfile.txt

chmod g-w testfile.txt

chmod o-r testfile.txt

chmod o-w testfile.txt

。。

我们也可以组合权限位,不必每修改一个权限位就执行一条命令,如:

chmod g+rw testfile.txt

。。

权限位可以用数字表示:r=4,w=2,x=1

比如:

chmod 770 testfile.txt

执行之后权限字符串将是 -rwxrwx—

750 为 -rwxr-x—

725 为 -rwx-w-r-x 这是一个可怕的权限,组成员能写文件却读不出来。

再来看一个例子,我们需要将Downloads目录的文件都改成600

新手容易写成 chmod -R 600 Download,这会将自己锁在外面,因为对当前目录也有效,没有执行权限将进不去目录,最佳实践当然是用上节谈到的find赋权。

简陋的方法是:

chmod 600 Downloads/*

注意不能用 -R 递归,因为它只支持同类型的对象目录。

再来介绍更改所有者命令chown

比如我们需要将Downloads目录的所有者改成 batman(当然本机得有这个batman用户)

sudo chown -R batman Downloads/

注意要加sudo,即便是将自己的所有权转给别人也如此,-R 表示递归。

执行之后用ls -l检查,发现用户属主已改成batman,但组仍然是自己,我们修复下:

sudo chown -R batman:batman Downloads/

chown命令允许同时提供用户名和组名,用冒号分隔。 

我们再将Downloads改回自己 kelemi,当然可以用

sudo chown -R kelemi:kelemi Downloads/ 但实际我们可以省略组名,只保留冒号,如下:

sudo chown -R kelemi: Downloads

省略组名,将赋予用户默认的用户组,一般都是与用户同名的。再查看时,发现Downloads/的用户和用户组已变回 kelemi:kelemi了。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注