0x00 前言:
继上次的 Windows 计划任务后, 拓展研究下 Linux 下的计划任务, 能够执行计划任务有 3 个命令 at,batch,crontab
所谓的计划任务就是定时启动某个程序, 可以是一组 shell 脚本, 也可以是单一的输出
0x01 计划任务 at 命令:
at 在 Ubuntu,kali 里面都是没有预先装好的
首先用安装 at
apt-get install at
查看使用帮助
- at --help
- # 回显
- at: invalid option -- '-'
- Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec ...
- at [-V] [-q x] [-f file] [-mMlbv] -t time
- at -c job ...
- atq [-V] [-q x]
- at [ -rd ] job ...
- atrm [-V] job ...
- batch
看到 batch 也安装了, 也说明了其实他们是一类的工具, 之后再讲 batch
首先 at 的参数含义
-V 参看版本
-q x 使用 x 队列, 可以理解为它有几组任务, 每组相互独立, x 就是组号. 一般以 abcd.... 英文来区别不同队列
-f file 使用文件
-m 给用户发送邮件
-M 不给用户发送邮件
-l 显示设置任务列表
-d x 删除编号为 x 的任
首先来设置个输出 hello 的 shell 命令
这里的 < EOT > 是按 ctrl+D 来提交任务, 使用的相对时间后移 5min, 在桌面创建个 1.txt 并写入 hello Linux
- root@Ubuntu:~/Desktop# at now +5 min
- warning: commands will be executed using /bin/sh
- at> echo "hello linux"> 1.txt
- at> <EOT>
- job 6 at Wed Mar 6 05:21:00 2019
可以查看任务
- root@Ubuntu:~/Desktop# at -l
- 6 Wed Mar 6 05:21:00 2019 a root
- root@Ubuntu:~/Desktop#
使用不同队列查看任务, 就会发现运行的时候是默认 a 队列, 所以 b 队列看不到这个任务
- root@Ubuntu:~/Desktop# at -q a -l
- 6 Wed Mar 6 05:21:00 2019 a root
- root@Ubuntu:~/Desktop# at -q b -l
- root@Ubuntu:~/Desktop#
时间到了, 文本自动生成
除了能够使用相对时间以外, 还可以使用绝对时间来进行定时操作
- root@Ubuntu:~/Desktop# at 5:27
- warning: commands will be executed using /bin/sh
- at> echo "hello sijidou"
- at> <EOT>
- job 7 at Wed Mar 6 05:27:00 2019
- root@Ubuntu:~/Desktop#
使用 - d 来进行任务的删除, 删除 - d 带的参数是最前面那个编号, 这里是 7, 上面那个例子的编号是 6
- root@Ubuntu:~/Desktop# at -l
- 7 Wed Mar 6 05:27:00 2019 a root
- root@Ubuntu:~/Desktop# at -d 7
- root@Ubuntu:~/Desktop# at -l
- root@Ubuntu:~/Desktop#
任务无论是删除, 还是到时间正常运行, 它都是累加的
使用 file 来进行命令设置, 首先创建个 2.txt, 写入命令
然后使用 - f 2.txt 参数来设置任务
- root@Ubuntu:~/Desktop# at -f 2.txt now +1 min
- warning: commands will be executed using /bin/sh
- job 8 at Wed Mar 6 05:33:00 2019
- root@Ubuntu:~/Desktop#
时间到了之后, 产生了 3.txt 文件
因为 Linux 下的文件, 其实后缀用处不大, 都是看用什么指令来解释文件的内容的, 看 warning 都知道这里 at 使用的 / bin/sh, 所以就把 2.txt 的内容当做 shell 来解释的
最后说明下两个和 at 有稍微区别的 atq 和 atrm 不一的
atq 列出当前的计划任务效果同 "at -l" 一样
atrm 删除计划任务
- root@Ubuntu:~/Desktop# at -f 2.txt now +1 min
- warning: commands will be executed using /bin/sh
- job 10 at Wed Mar 6 05:36:00 2019
- root@Ubuntu:~/Desktop# at -f 2.txt now +1 min
- warning: commands will be executed using /bin/sh
- job 11 at Wed Mar 6 05:36:00 2019
- root@Ubuntu:~/Desktop# atq
- 10 Wed Mar 6 05:36:00 2019 a root
- 11 Wed Mar 6 05:36:00 2019 a root
- root@Ubuntu:~/Desktop# atrm 10
- root@Ubuntu:~/Desktop# atq
- 11 Wed Mar 6 05:36:00 2019 a root
- root@Ubuntu:~/Desktop#
最后是关于使用 at 权限问题, 因为 at 可以使用 / bin/sh 啊, 这个权限还是不错的
能够限制权限的地方在安装 at 后, 在 / etc / 目录下存在
- at.deny #一开始存在的, 它默认是空, 它会限制里面的用户不能使用 at
- at.allow #刚安装好, 并没有这个文件, 但是如果创建它, 它只会允许里面的用户使用 at
在 at.allow 和 at.deny 都存在的情况下, 看 at.allow
在 at.allow 和 at.deny 都不存在的情况下, 只能 root 使用 a
但是我测试了下, at.allow 中, 如果没有 root, 但是 root 还是能用 at
0x02 计划任务 batch 命令:
batch 同 at 一样都是没有默认安装的, 但是安装 at 的时候就带了 batch
但是 batch 不需要设置时间, 那么不需要设置时间, 它的任务是怎么执行的呢
在系统平均负载量降到 0.8 以下时执行某项一次性的任务
我这里直接输入了, 就直接蹦出来了, 说明此时平均负载量很低, 也就是系统很清闲, 没有大量运算
batch 支持些命令
-f file 使用文件里面的 shell 脚本
-q x 将计划任务加入某个队列
-m 发送邮件给用户
还可以看到上面截图是 job 14, 说明它这个任务表和 at 是一起的, batch 相当于 at 命令的一部分
0x03 计划任务 crontab 命令:
在渗透测试中, 如果 Linux 下的计划任务设置最常使用的就是 crontab 命令了吧
因为相比较 at 命令, 它首先是默认安装的(我的 kali 和新装的 Ubuntu 都有), 其次它与 at 不同在于, at 只能定时某次的时间然后运行一次, 而 crontab 能够设置每天多久自启动的计划任务, 可以一次设置多次触发
然后 crontab 的用户使用权限问题和 at 一样
cron.deny 不允许使用 crontab 的用户
cron.allow 允许使用 crontab 的用户
cron.allow 优先度高于 cron.deny
# 注意唯一不同在于
cron.allow,cron.deny 都不存在时候, 都可以用 crontab
而默认配置中 cron.allow 和 cron.deny 都是不存在的, 因此意味着所有用户默认都能用 crontab
首先看 crontab 的语法
- sijidou@Ubuntu:~$ crontab --help
- crontab: invalid option -- '-'
- crontab: usage error: unrecognized option
- usage: crontab [-u user] file
- crontab [ -u user ] [ -i ] { -e | -l | -r }
- (default operation is replace, per 1003.2)
- -e (edit user's crontab)
- -l (list user's crontab)
- -r (delete user's crontab)
- -i (prompt before deleting user's crontab)
- sijidou@Ubuntu:~$
这里各个参数说明一下
-e 进入编写
-l 列出任务
-r 删除任务
-i 删除前给提示
-u 指定某用户运行任务
每条计划任务的格式书写如下
- min hour day month week [user] command
- 0-59 0-23 1-31 1-12 0-7 echo "sijidou"> /home/sijidou/Desktop/1.tx
前面 5 个参数可以是这些形式
每个参数间用空格隔开
* 表示任意
1,2 表示 1,2 号都可以(这里假设是 day 的值)
1-20 表示 1 号到 20 号都可以(这里假设是 day 的值)
/10 表示每隔 10 天就执行一次(这里假设是 day 的值)
举几个例子
每月每周每日每小时 51 分的在桌面上生成有着 "hello world" 的 1.txt 文件
51 * * * * echo "hello world"> /home/sijidou/Desktop/1.tx
每过 10 天, 在那天的每小时 21 分钟生成文件
21 */10 * * echo "hello world"> /home/sijidou/Desktop/1.txt
每天的凌晨 1 点和 2 点的 31 分生成文件
31 1,2 * * * echo "hello world"> /home/sijidou/Desktop/1.txt
每周三到周五的每小时 41 分生成文件
31 * * * 3-5 echo "hello world"> /home/sijidou/Desktop/1.txt
接下来是如何把命令写进去
带参数 e 会进入设置的文本文件 (第一次会让你选是 nano 还是 VIM, 它会看你系统装了什么编译器) 进行编写, 之后是直接跳进去
它的原理是在 / tmp / 下生产一个随机后缀的文件, 然后文件里面按每行算一条计划任务
写好了后, 查看任务, 任务已经写进去了, 但是这是 sijidou 用户, 想要向 root 目录下写东西有点痴心妄想了 2333
再用 crontab -e 打开还可以看还可以看原来的命令, 但是文件名有变化
删除文件直接使用 crontab -r 不需要带参数, 它会把 / tmp / 目录下的临时文件直接删除, 意味着你设置的所有计划任务都没了
而 - u 参数只有 root 才能设置, 这里用 sijidou 账号带 - u 参数, 回显不能使用
那么切换成 root 用户给 sijidou 设置任务
再切换回 sijidou 来, 发现写进去了, 如果要继续编译直接输入 crontab -e
用 root 账号查看, 删除 sijidou 账户的计划任务
也可以不用依赖 crontab 生成的零时文件, 用自己编译的文件设置计划任务
0x04 结语:
参考链接
at 命令参考: https://www.cnblogs.com/diantong/p/9366449.html
batch 命令参考:
crontal 命令参考: https://www.jianshu.com/p/9619076b1172
总参考:
来源: https://www.cnblogs.com/sijidou/p/10485983.html