使用无登录权限的用户身份执行任务

在通常的 WEB 服务器配置中, 默认的会配置服务的执行用户为: www-data, 然而这个用户是不允许登录的.

可以在 /etc/passwd 中查看改用户的具体配置:

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

可以看到用户: www-data 的用户目录被配置为: /var/www, 然而shell是被指定为: /usr/sbin/nologin. 这个配置表明了改用户不允许登录.

  • 日常操作的用户身份

我们在使用 su www-data 时会被提示错误:

# su www-data
This account is currently not available.

在某些场合通常我们把Web项目的代码目录的拥有者都会指向该用户. 那么在做某些文件操作时会引起麻烦, 比如使用root身份执行 composer 操作会被警告等. 这种情况下我们可以给用户临时分配一个shell来支持身份切换. 比如这样:

# su www-data -s /bin/sh

这样就可以已 www-data 身份进行文件操作了. 避免新产生的文件的拥有者为 root.

  • 定时任务的用户身份

通常配置 crontab 执行任务, 通常是用当前的用户身份进行 crontab -e 进行编辑一个任务即可. 然而大部分ssh管理服务器的用户都使用 root, 那么由 root 添加的定时任务执行者会是 root, 这样会有额外的附加效果.

比如任务脚本在执行过程中会产生日志, 日志会写入到日志文件, 然而定时任务通常会被安排在凌晨这种低负载时进行, 某些按天的的日志会被任务创建, 然而当天的日志文件被新创建后, 日志的所有者是root, 在接下来当天的业务运行中提供服务的用户是www-data, 再由 www-data 往日志文件中写日志就会产生权限问题. 这个时候在创建定时任务的时候进行指定用户身份是推荐的做法.

使用指定用户运行的定时任务有几种方法. 这里推荐直接修改 /etc/crontab 来实现. 在这个文件最后添加需要安排的定时任务即可.

定时任务指令格式:

分钟 + 空格 + 小时 + 空格 + 天(月) + 空格 + + 空格 + 天(周) + 空格 + 用户名 + 空格 + 任务指令

设定一个指定用户: www-data 每分钟往 /tmp/test.log 写入一句话的任务指令:

* * * * * www-data echo "Hello, www-data" >> /tmp/test.log

具体的任务可以根据业务的需要在 /etc/crontab 文件里进行调整修改. 避免日志文件权限等冲突.

推荐阅读更多精彩内容