# 写在前面
本文主要介绍一些`Linux`中的自有服务
# Linux自有服务
## 主机名
### 查看主机名
- hostname
- hostname -f 查看主机的FQDN(全限定域名)
### 设置主机名
#### 临时设置
- hostname test

#### 永久修改
- 修改`/etc/hostname`文件

重启登陆后

#### 设置服务器的FQDN
- 修改`/etc/hosts`


尝试去`Ping`一下自己的网站,此时显示的`ip`为,
自定义解析地址,再去`Ping`发现`IP`地址已经更换


## systemctl命令介绍
以`apache`为例
- 使某服务自动启动
`systemctl enable httpd.service`
- 使某服务不自动启动
`systemctl disable httpd.service`
- 检查服务状态
`systemctl status httpd.service`
- 显示所有已启动的服务
`systemctl list-unit-files`
- 启动某服务
`systemctl start httpd.service`
- 停止某服务
`systemctl stop httpd.service`
- 重启某服务
`systemctl restart httpd.service`
## 扩展
### sysv-rc-conf
- 安装`sysv-rc-conf`, `apt-get -y install sysv-rc-conf`
- 启动服务,`sysv-rc-conf`

操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,`X`表示开启该服务。 用`Ctrl+N`翻下一页,用`Ctrl+P`翻上一页,用`Q`退出。
补充:
- 表头代表`Ubuntu`不同启动级别
- 第一列代表服务名称
## 防火墙
`Linux`原始的防火墙工具`iptables`比较繁琐,`ubuntu`默认提供了一个基于`iptable`之上的防火墙配置工具`ufw`,使管理`iptables`更简单。
### 常用命令
- 安装
`apt-get -y install ufw`
- 启用/禁用
`ufw enable / disable`

此时外部无法访问该虚拟机(SSH,IP)都不可以
- 查看防火墙当前状态
`ufw status`
- 允许 / 拒绝访问
- `ufw allow / deny 80` #允许/禁止外部访问80端口
- `ufw allow 80/tcp` #80后面加/tcp或/udp,表示tcp或udp封包
- `ufw deny smtp` #禁止外部访问smtp服务
- `ufw allow from 192.168.100.38` #允许此IP访问本机所有端口
- `ufw allow / deny serviceName` #对service服务的端口进行过滤,/etc/services中对应端口
- 外来访问默认允许 / 拒绝
`ufw default allow / deny`
- 删除规则
- `ufw delete allow 80`
- `ufw delete allow from 192.168.100.38`
- 开启 / 关闭日志
`sudo ufw logging on / off`
- 查看说明
`ufw --help`

- 查看配置文件
- 路径`/etc/ufw`

- `user.rules`用来设置的防火墙规则,修改后重启`ufw`生效
- 启动`ufw`后,`/etc/ufw/sysctl.conf`会覆盖系统的`/etc/sysctl.conf` 文件。
- 可以通过修改 `/etc/default/ufw` 中的 `IPT_SYSCTL=` 来设置系统使用哪个 `sysctrl.conf`

### 推荐配置
建议默认拒绝,然后按照自己的需求添加规则。
## dpkg管理
### 作用
> `dpkg` 即 `package manager for Debian` ,是 `Debian` 和基于 `Debian` 的系统中一个主要的包管理工具,可以用来安装、构建、卸载、管理 `deb` 格式的软件包。
### 安装软件
- 使用 `dpkg` 命令安装软件时,可以使用 `-i` 选项并指定 `deb` 安装包的路径。和 `Ubuntu` 下的另一个包管理工具 `apt-get`有所不同。
- `apt-get` 命令并不直接操作 `deb` 安装包文件,而是从 `/etc/apt/sources.list` 配置文件中定义的软件镜像源里下载软件包并安装,使用时也只需指定软件的名称(或者也可以附加上版本号)。
- 使用`apt-get` 命令安装软件
- `apt-get install <package_name[=version]>`
- `dpkg` 命令安装软件
- `dpkg -i <package_file_path>`
因此,`dpkg` 主要是用来安装已经下载到本地的 `deb` 软件包,或者对已经安装好的软件进行管理。而 `apt-get` 可以直接从远程的软件仓库里下载安装软件。
### 列出已安装的软件包
`dep -l`

解释:
```python
$ dpkg -l
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称 版本 体系结构 描述
+++-=============================================-===================================-============-===============================================================================
ii 2048-qt 0.1.6-1build1 amd64 mathematics based puzzle game
ii accountsservice 0.6.50-0ubuntu1 amd64 query and manipulate user account information
ii acl 2.2.53-4 amd64 access control list - utilities
ii acpi-support 0.143 amd64 scripts for handling many ACPI events
ii acpid 1:2.0.31-1ubuntu2 amd64 Advanced Configuration and Power Interface event daemon
ii adduser 3.118ubuntu1 all add and remove users and groups
ii adwaita-icon-theme 3.32.0-1ubuntu1 all default icon theme of GNOME (small subset)
ii alsa-base 1.0.25+dfsg-0ubuntu5 all ALSA driver configuration files
ii alsa-utils 1.1.8-1ubuntu1 amd64 Utilities for configuring and using ALSA
...
```
- `ii` 表示软件包的安装和配置状态,其格式为`期望状态|当前状态|错误`
- 期望状态:
- u:即 unknown,软件包未安装且用户未请求安装
- i:即 install,用户请求安装该软件包
- r:即 remove,用户请求卸载该软件包
- p:即 purge,用户请求卸载该软件包并清理配置文件
- h:即 hold,用户请求保持续当前软件包版本
- 当前状态:
- n:即 not-installed,软件包未安装
- i:即 installed,软件包已安装并完成配置
- c:即 config-files,软件包已经被卸载,但是其配置文件未清理
- u:即 unpacked,软件包已经被解压缩,但还未配置
- f:即 half-configured,配置软件包时出现错误
- w:即 triggers-awaited,触发器等待
- t:即 triggers-pending,触发器未决
- 错误:
- h:软件包被强制保持
- r:即 reinstall-required,需要卸载并重新安装
- x:软件包被破坏
- eg
- ii:表示软件需要安装且已安装,没有错误
- rc:表示软件已经被删除,但是配置文件还没被清理
- iu:表示软件已经被安装但是配置未正确
- 还可以使用 `dpkg -l <package_name_pattern>` 命令筛选出名称中包含指定模式的软件包

### 卸载软件
`dpkg -r 需要卸载的软件的名称`
需要注意的是,`-r` 选项只会移除指定的软件包而不对其配置文件产生影响,可以使用 `-P`, 选项在删除软件包的同时清理配置文件。`dpkg -P <package>`
### 其他包管理操作
- 查看软件包的内容
`dpkg -c <package_file_path>`
- 查看软件包(已安装)的详细信息
`dpkg -s <package>`或`dpkg --status <package>`
- 查看软件包的安装位置
`dpkg -L <package>` 或 `dpkg --list-files <package>`
## apt
### 简介
虽然我们在使用`dpkg`时,已经解决掉了 软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而`apt`这个工具解决了这样的问题,`linux distribution` 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。
### 工作原理
`Ubuntu`采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的`Ubuntu`用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)
然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在`Ubuntu`系统中,使用软件源配置文件`/etc/apt/sources.list`列出最合适访问的镜像站点地址。
- `apt-get`的更新过程
- 执行`apt-get update`
- 程序分析`/etc/apt/sources.list`
- 自动连网寻找`list`中对应的`Packages/Sources/Release`列表文件,如果有更新则下载之,存入`/var/lib/apt/lists/`目录
- 然后 `apt-get install` 相应的包 ,下载并安装。
- `apt-get install`原理图

### 常用命令
- apt-get update #更新源
- apt-get dist-upgrade #升级系统到相应的发行版(根据 source.list 的配置)
- apt-get upgrade #更新所有已经安装的软件包
- apt-get install package_name #安装软件包(加上 --reinstall重新安装)
- apt-get install package_name=version #安装指定版本的软件包
- apt-get remove package_name #卸载一个已安装的软件包(保留配置文件)
- apt-get -purge remove package_name #卸载一个已安装的软件包(删除配置文件)
- apt-get check #检查是否有损坏的依赖
- apt-get clean #把安装的软件的备份也删除,不过这样不会影响软件的使用
## crontab
### 作用
`crontab`命令被用来提交和管理用户的需要周期性执行的任务,与`windows`下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动`crond`进程,`crond`进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
### 用法
crontab 选项
常见选项:
- -e:编辑该用户的计划任务列表;
- -l:列出该用户的计划任务列表;
- -r:删除该用户的计划任务列表设置;
- -u<用户名称>:指定要设定计划任务的用户名称,如果不加,默认当前用户。

### 编辑计划任务
`Linux`下的任务调度分为两类:系统任务调度和用户任务调度
#### 系统调度
系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc/crontab`文件,这个就是系统任务调度的配置文件。

图列解释:
- 第一行:`SHELL`变量指定了系统要使用哪个`shell`,这里是`bash`
- 第二行:`PATH`变量指定了系统执行命令的路径
#### 用户调度
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 `crontab` 工具来定制自己的计划任务。所有用户定义的`crontab`文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下:
- `/etc/cron.deny` 该文件中所列用户不允许使用`crontab`命令
- `/etc/cron.allow` 该文件中所列用户允许使用`crontab`命令
- `/var/spool/cron/` 所有用户`crontab`文件存放的目录,以用户名命名
#### 文件含义
用户所建立的`crontab`文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
> minute hour day month week command 顺序:分 时 日 月 周
其中:
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
#### 案例
每1分钟往`~`家目录中的`ls.txt`中输入当前的列表的信息,为了看到效果使用追加输出
计划任务:* * * * * ls-la ~>> /~/ls.txt
# 补充
本文借鉴的文章
[rollingstarky](https://www.jianshu.com/u/58f183c39554)
[Nosee123](https://www.jianshu.com/p/6432015c52a6)
Linux学习记录(六)