使用作业调度自动化任务
AUTOMATING TASKS WITH JOB SCHEDULING
像任何使用 Linux 的人一样,黑客经常有他们想要定期运行的任务、脚本或其他任务。例如,你可能希望为你的系统设置一个自动文件备份, 或者你希望像我们在第 11 章做的那样转存日志文件。另一方面,黑客可能希望每天晚上或者在他们工作或上学的时候让他们的系统运行第 8 章里的 MySQLscanner.sh 脚本。这些都是调度自动化作业的例子。调度任务允许你在无须考虑的情况下运行任务,并且你可以在不使用系统的时候运行调度任务,这样你就有了大量的空闲资源。
Linux 系统管理员,或者是黑客,可能希望在系统启动时自动启动特定的脚本或服务。在第 12 章,我们讲述了使用 PostgreSQL 数据库和黑客/渗透测试框架 Metasploit 关联。比起每次启动 Metasploit 前手动启动 PostgreSQL 数据库,你可以让 PostgreSQL(或者是任何服务或脚本)在系统启动时自动启动。
在本章节,你将学到如何使用cron守护进程和crontab设置一个脚本,让其甚至在系统无人操作时自动运行。你还将学到如何设置开机时自启动脚本,从而为你提供运行黑客攻击时所需的必要服务。
任务调度或使其自动运行
cron 守护程序和 crontab 是用于调度常规任务的最有用的工具。 第一个是 crond,它是一个在后台运行的守护进程。cron 守护程序检查 cron 列表以在指定时间运行哪些命令。 我们可以更改 cron 列表,以安排任务或工作在特定日期或时间,每天特定时间或每隔这么多周或几个月定期执行。
想要调度一个任务或作业,需要在/etc/crontab 目录下的 crontab 文件里输入它们。crontab 列表有七个字段:前五个字段用于计划运行任务的时间,第六个字段指定用户,第七个字段用于要执行的命令的绝对路径。如果我们使用 crontab 来调度脚本,我们可以将脚本的绝对路径放在第七个字段里。
五个时间字段中的每一个都代表一个不同的时间元素:按顺序来是分钟、小时、日、月、周。时间的每一个元素都必须用数字表示,所以 3 月表示为 3(你不能直接输入“March”)。周从 0 开始,就是代表周日,到 7 结束,也是代表周日。表 161 总结了这个。
表 161: crontab 里的时间表示
时间单位 | 表示 |
---|---|
Minute | 0-59 |
Hour | 0-23 |
Day of the month | 1-31 |
Month | 1-12 |
Day of the week | 0-7 |
因此,如果我们编写了一个扫描全球易受攻击的开放端口的脚本,并希望它在周一到周五的凌晨 2:30 运行,我们可以在 crontab 文件中调度它。我们将简要介绍如何将这些信息输入 crontab,但首先让我们讨论需要遵循的格式,如代码清单列表 16-1 所示。
M H DOM MON DOW USER COMMAND
30 2 * * 15 root /root/myscanningscript
清单 161: 调度命令的格式
crontab 文件已经帮助您标记了列。注意第一个字段提供分钟(30),第二个字段提供小时(2),第五个字段提供周(1-5, 周一到周五),第六个字段定义了用户(root),第七个字段是脚本的路径。第三个和第四个字段包含了星号 (*),因为我们希望这个脚本在每周一至周五启动,而不在意是几月几日。
在配置列表 16-1 中,第五个字段使用数字间的短横杠(-)定义了周的范围。如果你希望在非连续的周执行脚本,你可以用逗号(,)将值分开。例如周二和周四就是 2,4。
要编辑 crontab,可以运行 crontab 命令,后面接 -e(编辑)选项:
kali >crontab -e
Select an editor. To change later, run 'selecteditor'.
/bin/nano \<easiest
/usr/bin/mcedit
/usr/bin/vim.basic
/usr/bin/vim.gtk
/usr/bin/vim.tiny
Choose 15 [1]:
第一次运行此命令时,它将询问你要使用哪个编辑器。默认值为/bin/nano,选项 1。如果选择此选项,它将直接打开 crontab。
另一个选择是直接在你最喜欢的文本编辑器中打开 crontab,这对于 Linux 新用户来说说更好的选择,你可以这样做:
kali >leafpad /etc/crontab
我已经使用命令用 Leafpad 打开了 crontab。你可以在清单 16-2 中看到文件片段。
# /etc/crontab: systemwide crontab
# Unlike any other crontab, you don't have to run the 'crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# which no other crontabs do.
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && runparts report /etc/cron.hourly
25 6 * * * root test x /usr/sbin/anacron II ( cd / && runparts
47 6 * * 7 root test x /usr/sbin/anacron II ( cd / && runparts
52 6 1 * * root test x /usr/sbin/anacron II ( cd / && runparts
#
清单 162: 使用文本编辑器打开 crontab 文件
现在,要设置一个新的定期计划任务,只需新输入一行并保存文件。
设置一个备份计划任务
让我们从系统管理员的角度看这个工具。作为一个系统管理员,作为系统管理员,你经常希望在当系统未被使用,资源随时可用时,每小时备份所有文件。(系统备份往往需要工作时间无法提供的系统资源。)理想的时间可能是周末的午夜。而不是必须在周六晚上/周日早上 2 点登录(我确定你当时还有其他优先事项),你可以安排备份在那个时候自动启动,即使你不在你的电脑旁。
注意小时字段使用 24 小时制而不是 AM 和 PM 制,所以例如下午 1 点是 13:00。并且注意周字段(DOW)从周日开始(0)到周六结束(6)。
要想创建任务,你只需要编辑 crontab 文件,添加固定格式的一行。所以,假设你想要创建一个使用一个叫“backup”的用户运行的备份任务。你需要写一个用于备份系统的脚本并保存为/bin 目录下的 systembackup.sh,然后让这个备份脚本每周六晚上/周日早上 2 点启动,在 crontab 中添加下行:
00 2 * * 0 backup /bin/systembackup.sh
注意 * 通配符是用来表示 “任何”,并且使用在日,月,或周里使用它将读作每日或每月。如果你阅读这行,它表示:
在 0 分,每个小时的开始 (00),
在 2 点(2),
在每日 (*),
在每月 (*),
在周日 (0),
作为 backup 用户,
运行位于/bin/systembackup.sh 的脚本。
cron 守护进程将在每月周日早上 2 点执行那个脚本。
如果你只希望在每月 15 号和 30 号备份,而不管那天是周几,你需要修改 crontab,如下所示:
00 2 15,30 * * backup /root/systembackup.sh
注意日字段 (DOM) field 现在是 15,30。这告诉系统只在每月 15 日和 30 日运行脚本,大概每两周运行一次。当你想指定多个日、多个小时或多个月时,你需要用逗号分隔它们,就像我们在这里所做的那样。
接下来,让我们假设公司需要你对备份特别谨慎。即使在停电或系统崩溃的情况下,也不能损失一天的数据。你就需要每周晚上备份,如下所示:
00 23 * * 15 backup /root/systembackup.sh
这个任务会在晚上 11 点 (hour 23),每日每月,但只在周一到周五运行。尤其要注意我们使用短横杠分隔(-)表示周一到周五(1-5)。这也可以用 1,2,3,4,5 表示,两种方法都行。
使用 crontab 计划执行 MySQLscanner
现在你已经了解了使用 crontab 命令计划任务的基本知识,让我们计划 MySQLscanner.sh 脚本,这是你在第 8 章写的用来搜寻开启的 MYSQL 端口的脚本。这个扫描器查看 3306 端口来搜索运行 MySQL 的系统。
要将 MySQLscanner.sh 输入到 crontab 文件中,需要就像我们在系统备份中做的那样编辑文件。我们会计划让他在你工作的时候运行,这样它就不会在你使用家里电脑的时候占用资源。输入下面一行到你的 crontab 文件:
00 9 * * * user /usr/share/MySQLsscanner.sh
我们预计设置了让任务在 00 分,9 点,每月每日每周使用常规用户运行。我们只需要简单地保存 crontab 文件。
下载,假设你希望特别小心,并且只在周末上午 2 点当其他人不太可能盯着网络流量时运行这个扫描器。你也只希望在夏天 6 到 8 月运行,如下所示:
00 2 * 68 0,6 user /usr/share/MySQLsscanner.sh
你会像这样把它添加到 crontab 文件:
# /etc/crontab: systemwide crontab
# Unlike any other crontab, you don't have to run the 'crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# which none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && runparts report /etc/cron.hourly
25 6 * * * root test x /usr/sbin/anacron II ( cd / && runparts report /etc/cron.daily
)
47 6 * * 7 root test x /usr/sbin/anacron II ( cd / && runparts report
/etc/cron.weekly )
52 6 1 * * root test x /usr/sbin/anacron II ( cd / && runparts report
/etc/cron.monthly )
00 2 * 6-8 0,6 user /usr/share/MySQLsscanner.sh
现在,你的 MySQLscanner.sh 只会在六月,七月,八月的周末早上两点启动。
crontab 快捷方式
crontab 文件有些内置的快捷方式,用来代替具体的时间,日期,月份。它包含这些:
\@yearly
\@annually
\@monthly
\@weekly
\@daily
\@midnight
\@noon
\@reboot
所以,如果你希望 MySQL 扫描器每天午夜运行,你可以添加下行到 crontab 文件:
\@midnight user /usr/share/MySQLsscanner.sh
使用 RC 脚本开机运行任务
每当你启动 Linux 系统时,都会运行一些脚本来为您配置环境。这些脚本就是 rc 脚本。在内核初始化并加载了所有模块之后,内核将启动一个守护进程叫做 init 或 init.d。这个守护进程开始运行/etc/init.d/rc 中的一些脚本。这些脚本包括一些命令,用于启动运行 Linux 系统所需的服务。
Linux 运行级别
Linux 有多个运行级别,用于指示启动时需要启动哪些服务。例如,运行级别 1 是单用户工作状态,类似于网络一样的服务不会是 运行级别. rc 脚本会根据运行级别运行。
0 系统停机状态
1 单用户工作状态
2–5多用户状态
6 重启
将服务添加到 rc.d
你以使用 update-rc.d 命令为 rc.d 脚本添加启动时要运行的服务。此命令允许你从 rc.d 脚本中添加或删除服务。update-rc.d 的语法很简单,输入命令,后面输入脚本的名字然后输入动作,像这样:
kali >update-rc.d \
\
举个 update-rc.d 的例子,假设你总是希望 PostgreSQL 数据库在系统启动时运行,这样你的 Metasploit 框架可以使用它储存黑客攻击和渗透测试的结果。你需要使用 update-rc.d 添一行到你的 rc.d 脚本来让它每次系统启动时运行。
在你做这件事之前,检查 PostgreSQL 是否已经在你的系统中运行来。你可以使用 ps 命令然后使用 grep 导出到过滤器来查找 PostgreSQL,像这样:
kali >ps aux | grep postgresql
root 3876 0.0 0.0 12720 964pts/1 S+ 14.24 0.00 grep postgresql
结果告诉我吗只有我们的查询进程包含了 PostgreSQL 字段,所以现在没有 PostgreSQL 数据库在这个系统上运行。
现在,更新我们的 rc.d 来让 PostgreSQ 启动时自动运行:
kali >update-rc.d postgresql defaults
这会添加一行到 rc.d 文件。你需要重启系统来让更改生效。当你做完后,再使用 ps 命令和 grep 查找 PostgreSQL 进程:
kali >ps aux | grep postgresql
postgresql 757 0.0 0.1 287636 25180 ? S March 14
0.00 /usr/lib/postgresql/9.6/bin/postgresql D
/var/lib/postgresql/9.6/main
c config_file=/etc/postgresql/9.6/main/postgresql.conf
root 3876 0.0 0.0 12720 964pts/1 S+ 14.24 0.00 grep postgresql
可以看到,在我们没有手动输入任何命令的情况下,PostgreSQL 正在运行。它在你系统启动时自动运行来,等待你使用 Metasploit!
通过 GUI 添加开机启动服务
如果你更习惯使用 GUI 添加服务,你可以从 kali 源下载基本的基于 GUI 的工具 rcconf,像这样:
kali >apt-get install rcconf
安装完成后,可以通过输入以下内容启动 rcconf:
kali >rcconf
这会打开一个 GUI,像图 161 中的那样。你可以滑动查看可用的服务,选择一个你希望开机启动的,然后点 OK。
图 161: rcconf GUI 添加开机启动服务
在图中,你可以看到 PostgreSQL 服务在倒数第二个。按空格键选择这个服务,按 TAB 键高亮\,然后按 ENTER 键。下次启动 Kali 时,PostgreSQL 将会自动启动。
总结
系统管理员和黑客都经常需要计划服务,脚本和工具有间隔地运行。Linux 允许你使用 cron 守护进程计划几乎任何脚本或工具,就是从 crontab 运行这些任务。并且,你可以让使用命令 update-rc.d 或基于 GUI 的工具 rcconf 更新 rc.d 脚本来让服务开机自动启动。