Featured image of post Linux基础(十):Linux 重要服务

Linux基础(十):Linux 重要服务

ssh服务、cornd计划任务服务

SSH 服务

ssh 简介

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?

  1. 提供远程连接服务器的服务

    1)linux 远程连接协议: ssh 服务端口 22

    2)windows 远程连接: RDP 协议端口 3389

  2. 对传输的数据进行加密

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#笔试题:请说明以下服务对应的端口号或者端口对应的服务
ssh             22
telnet          23
http            80
https           443
ftp             20 21
RDP             3389
mysql           3306
redis           6379
zabbix          10050 10051
elasticsearch    9200 9300
rsync           873
rpcbind         111

强调:用ssh或者与scp相关的命令时,会产生登录shell,加载下面相关配置文件,切记这些配置文件中不能有任何会产生输出的指令

1
2
3
4
5
6
7
8
# 1、系统级配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc 
 
# 2、用户级配置
~/.bash_profile
~/.bashrc

ssh 使用

  • 服务端
    • openssh-server —–》sshd
  • 客户端
    • xshell
    • openssh-client—-》命令ssh
      • ssh root@服务端的ip
      • ssh -p 2222 root@服务端的ip
1
2
ssh [选项] user@hostname "要执行的命令"
ssh [email protected] "date"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
xshell 连接不上服务器怎么办
1.查看网络
    ping 10.0.0.31
2.查网卡,网卡是否启动
3.查端口
    telnet 10.0.0.31 22
4.检查sshd服务是否启动
5.防火墙
6.虚拟机的虚拟网络编辑器
7.查看windows的网卡

scp 命令

类似于rsync命令,远程拷贝,scp时全量,rsync时增量

scp 也支持推和拉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
scp 源文件路径 目标文件路径

本机的文件拷贝到远程主机
	scp /tmp/1.txt  [email protected]:/abc
	
远程主机的文件拷贝到本地
	scp [email protected]:/abc/1.txt /aaa/	

-P 指定端口,默认22端口可不写
-r 表示递归拷贝目录
-p 表示在拷贝文件前后保持文件或目录属性不变
-l 限制传输使用带宽(默认kb)
  1. scp 通过 ssh 协议加密方式进行文件或目录拷贝。
  2. scp 连接时的用户作为为拷贝文件或目录的权限。
  3. scp 支持数据推送和拉取,每次都是全量拷贝,效率较低。

sftp

  1. xftp
  2. filezilla
  3. flashfxp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sftp user@hostname      # 默认使用 22 端口
sftp -P 2222 user@host # 指定非默认端口

# 非交互式下载整个目录(需先进入目录)
sftp user@host <<EOF
cd /remote/dir
get -r .
exit
EOF

# 单行命令上传文件
echo "put localfile.txt /remote/path/" | sftp user@host

公钥与私钥

生成密钥对 ssh-keygen

  • 生成后得到两个文件:
    • 私钥:~/.ssh/id_算法类型(如 id_rsa
    • 公钥:~/.ssh/id_算法类型.pub(如 id_rsa.pub) 将公钥发送至要免密登录的服务器
  1. 手动复制公钥
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	1.查看公钥
     [root@m01 ~]# cat .ssh/id_rsa.pub
  
 2.在其他服务器创建文件,将内容粘贴进去
     [root@nfs ~]# mkdir .ssh
     [root@nfs ~]# vim .ssh/authorized_keys
  
 3.授权文件
     [root@nfs ~]# chmod 700 .ssh/
     [root@nfs ~]# chmod 600 .ssh/authorized_keys
  
 4.测试连接
     #首次连接需要记录服务器信息到 .ssh/known_hosts
     [root@m01 ~]# ssh 172.16.1.31
     The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
     ECDSA key fingerprint is SHA256:sYhpMuszVGaHSeWKyLXMGQQ72f/6KxyExWabnY/cz6w.
     ECDSA key fingerprint is MD5:bc:9c:0b:45:b5:27:71:cd:da:02:68:c0:48:71:9d:69.
     Are you sure you want to continue connecting (yes/no)? yes
     Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.
     Last login: Tue Nov 24 10:37:03 2020 from 172.16.1.7
     [root@nfs ~]# 
  
     #再一次连接
     [root@m01 ~]# ssh 172.16.1.31
     Last login: Tue Nov 24 11:00:39 2020 from 172.16.1.61
     [root@nfs ~]#
	
	
  1. 使用命令推送公钥
1
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname -p 22

安全设置

禁用密码登陆

1
2
3
编辑 /etc/ssh/sshd_config,设置:
PasswordAuthentication no
PermitRootLogin no

crond 计划任务服务

定时任务介绍

定时+任务:每到达一个时间点,就会自动触发执行的指令。

日常运维过程中会遇到很多周期性重复执行的任务,有执行起来耗费的时间还很长,需要有一种支持配置定时任务的软件来解放我们

例如这些任务:

1、备份数据的脚本/命令

2、定时采集主机监控数据的脚本/命令

crond: 是一款支持配置定时任务的软件,在几乎所有的 Linux 发行版中都是预安装的。

你只需要按照它规定的格式写好时间点+待执行的指令,就可以,非常简单

crond 服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作

crond 相关文件

日志文件 :/var/log/cron

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Crontab定时任务一般可以分为两种主要类型:用户crontab任务和系统crontab任务。
1、用户级定时任务
(1)通常由用户自己维护,系统管理员当然也可以维护
(2)定时任务的配置最终都会记录到文件中,用户级的定时任务文件位于/var/spool/cron/下,文件名是用户名。
(3)用户可以使用 crontab -e 命令来编辑自己的定时任务文件,使用 crontab -l 命令来列出自己的任务。
 
2、系统级定时任务
(1)只有系统管理员可以编辑。
(2)系统级定时任务文件位于/etc目录下,文件名有crontab、cron.d/、cron.daily/、cron.hourly/、cron.monthly/及cron.weekly/。
/etc/crontab:这是主crontab文件,包含了系统任务表,以及在预设时间执行的工作。
/etc/cron.d/:此目录存放任何想被cron守护进程执行的任务。
/etc/cron.daily/:此目录下存放的任务脚本会被系统安排在每天凌晨执行。
/etc/cron.hourly/:此目录下存放的任务脚本会被系统安排每小时执行一次。
/etc/cron.monthly/:此目录下存放的任务脚本会被系统安排在每月的某一天执行。
/etc/cron.weekly/:此目录下的任务脚本会被系统安排在每周的某一天执行。
 
系统级定时任务主要用于如:临时文件清理例/tmp和/var/tmp等、系统信息采集、日志文件切割等场景
用户级定时任务主要用于如:定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据等场景

定时任务管理

系统级计划任务(必须指定用户名)

定义方式一:编辑文件/etc/crontab(必须指定用户名)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# vim /etc/crontab 
[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
分钟
小时
* * * * * egon echo "$(date) 执行拉" >> /tmp/system_run.log

定义方式二:把脚本放到该目录下,注意要给脚本x权限: chmod +x

1
2
3
4
5
6
7
/etc/cron.hourly/ # 系统定时任务每个小时运行这个目录里的内容
 
/etc/cron.daily/ # 系统定时任务每天运行这个目录里的内容
 
/etc/cron.weekly/ # 系统定时任务每周运行这个目录里的内容
 
/etc/cron.monthly/ # 系统定时任务每月运行这个目录里的内容

用户级计划任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# crontab -e                  # 创建计划任务
* * * * * echo `date` >> /tmp/a.log
[root@localhost ~]# crontab -l                  # 查看计划任务
* * * * * echo `date` >> /tmp/a.log
[root@localhost ~]# ls /var/spool/cron/
root
[root@localhost ~]# cat /var/spool/cron/root  # 都是写在这里呢
* * * * * echo `date` >> /tmp/a.log
[root@localhost ~]# tail /var/log/cron          # 查看日志
[root@localhost ~]# crontab -u egon -e
 
# /etc/cron.deny 是定时任务的黑名单,使用root将需要拒绝的用户加入/etc/cron.deny
[root@localhost ~]# echo "egon" >> /etc/cron.deny 
[root@localhost ~]# su - egon  # 登陆该普通用户,无法编写定时任务
上一次登录:四 8月 13 19:44:10 CST 2020pts/1 上
[egon@localhost ~]$ crontab -e
You (egon) are not allowed to use this program (crontab)
See crontab(1) for more information

当/etc/cron.allow和/etc/cron.deny两个文件同时存在时,系统首先检查/etc/cron.allow文件。

计划任务语法格式

crond是按照分钟进行计算的,不支持秒

crontab的时间范围可以参考/etc/crontab中的注释,例如0或7代表周日

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
* 表示任意时间
 
- 表示一个时间范围段, 如小时设置为:5-7,则表示从5点到7点
 
, 表示分隔时段, 例如日设置为6,0,4,则表示周六、周天、周四
 
/10 表示每隔n单位时间, 如分支设置为*/10,则表示每隔10分钟
 
  此外强调以下几点:
(1)cron 守护进程每分钟都会自动检查 /etc/crontab 文件、etc/cron.d/ 等目录中的改变。如果发现了改变,它们就会被载入内存。所以你如果修改了计划人文导致其crontab文件改变后,并不需要重启守护进程。
 
(2)crontab的用户手册中推荐每一个命令使用绝对路径,例如调用rm命令时写作:/bin/rm,这是为了防止由于每一个用户的PATH环境变量不同而导致命令无法找到的错误。
 
(3)编写定时任务时,先在命令行上面执行一次,查看是否可以执行成功。
 
(4)把定时任务执行的结果定向到空&>/dev/null,如果不定向到空的话,邮件服务postfix开启时,系统会一直发送邮件信息日积月累会白白耗费磁盘空间
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
* * * * *   #每分钟执行一次
*/1 * * * * #每分钟都执行一次
 
*/3 * * * *   #每隔3钟执行一次
*/10 02 * * * #每天凌晨2点,每隔10分钟执行一次
 
00 02 * * * #每天的凌晨2点整执行一次
 
00 02 1 * * #每月的1日的凌晨2点整执行一次
 
00 02 14 2 * #每年的2月14日凌晨2点执行一次
 
00 02 * * 7 #每周天的凌晨2点整执行一次
 
00 02 * 6 5 #每年的6月份整个月中、每到周五凌晨2点就会执行一次
 
"日期穿刺"问题:当日期字段和星期字段都被特定的值所指定时,那么满足其中任意一个字段的条件,任务就会被执行
00 02 14 * 7 #每月14日或每周日的凌晨2点都执行
00 02 14 2 7  #每年的2月14日或每年2月的周天的凌晨2点执行
 
00 00 14 2 * #每年2月14日的凌晨00:00执行一次
 
00 02 * 1,5,8 * #每年的1月、5月、8月的每天凌晨2点都会执行一次
 
00 02 1-8 * * #每月1号到8号凌晨2点都会执行一次
 
00 21 * * * #每天晚上21:00执行一次
 
45 4 1,10,22 * * #每月1、10、22日的4:45执行一次
 
45 4 1-10 * * #每月1到10日的4:45执行一次
 
3,15 8-11 */2 * * #每隔两天的上午8点到11点的第3和第15分钟执行
 
0 23-7/2 * * * #晚上11点到早上7点之间,每隔两小时执行
 
15 21 * * 1-5 #周一到周五每天晚上21:15执行

定时任务的执行有时候会不可避免的出一些各种各样的错误信息,如果每次都发送邮件到/var/spool/mail/下,日积月累会耗费过多磁盘空间

你可以在命令后加&>/dev/null,把定时任务命令执行的结果都丢掉,这样即便邮件服务开启的状态也没内容给它发送了

1
2
[root@localhost ~]# crontab -l
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null

每分钟把系统时间追加到一个文件中,以2019-06-15_13:54:10格式

务必注意加上转义符号,因为在定时任务中,有些特殊符号会被误解,不转义是无法执行的。

1
2
[root@localhost ~]# crontab -l
* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt

示例:每天凌晨3点做一次备份?将/etc/目录进行打包,备份到/backup下面,且只能保留最近三天的数据。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# cat /root/bak.sh 
#!bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 防止下述命令出问题
mkdir /backup
cd /
tar -czf backup/$(hostname)_$(date +\%F_\%T)_etc.tar.gz /etc   
find backup -type f -name "*.tar.gz" -mtime +3 |xargs rm -rf
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/bak.sh &>/dev/null

crontab 不执行的问题

查看cron服务是否起作用: cat /var/log/cron # 每执行一次计划任务就会记录日志到该文件里

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
第一,脚本代码有问题,解决:先手动调试跑通
 
第二,执行环境问题:手动执行成功而crontab不能执行的时候,很可能就是执行环境的问题,例如相关路径的设置问题,可以在代码最前面执行 source /home/user/.bash_profile
 
第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********
 
第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
 
第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。
 
第六,crontab不执行的问题困扰了好长时间,脚本写的都正确,但是就是不执行,最终解决方法如下:
crontab -u root /var/spool/cron/root
这样root用户的crontab就生效了
[root@localhost ~]# systemctl restart crond
重启下服务就好了
 
第七,crond没有启动
 
第八,脚本编码问题,脚本在window下编写,传到linux下后报“锘?!/bin/bash”,用vi编辑器新建新shell脚本,输入内容后保存。
 
第九:特殊符号无法识别,需要添加转义
 
* * * * * tar czf /tmp/`date '+%Y'` /etc 该计划任务中命令的执行流程是crond->tar命令,而crond在执行tar命令时,无法识别通配符%的意思(shell能识别),所以该命令无法正常执行
 
解决方案一:添加转义符号
* * * * * tar czf /tmp/`date '+\%Y'` /etc
 
解决方案二:直接将命令扔到脚本里
通常都会把要执行的操作放到文件中,然后/bin/bash a.sh去执行,* * * * * /bin/bash a.sh  ,这样的执行流程就变成了crond->bash shell->a.sh,这样a.sh内即便是写%号,也能被识别出来
使用 Hugo 构建
主题 StackJimmy 设计