更新:此问题不会得到最终答复;我已经转移到另一个发行版,从那以后就没有观察到这个问题。我当时无法使用有见地的答案来解决它,但是您的燃油效率可能会有所不同(YMMV)。
crontab -e
并且crontab -l
工作得很好:
$ crontab -l | grep -v '^#'
* * * * * /usr/bin/env
* * * * * echo 'Hello from crontab'
Run Code Online (Sandbox Code Playgroud)
但是,我每分钟看到两条这样的消息/var/log/syslog
:
Mon DD hh:mm:01 username CRON[PID]: Permission denied
Run Code Online (Sandbox Code Playgroud)
因此正在读取 crontab,但不知何故它根本无法执行任何操作(当然,我在以同一用户身份登录时验证了这些命令)。知道为什么吗?
/etc/cron.allow
并且/etc/cron.deny
不存在。
crontab 设置组 setuid:
$ stat --format '%A %U %G' /usr/bin/crontab
-rwxr-sr-x root crontab
Run Code Online (Sandbox Code Playgroud)
crontabs 目录似乎具有正确的权限:
$ stat --format '%A %U %G' /var/spool/cron/crontabs
drwx-wx--T root crontab
Run Code Online (Sandbox Code Playgroud)
crontab 本身归我所有(这并不奇怪,因为我可以编辑它):
$ sudo stat --format '%A %U %G' /var/spool/cron/crontabs/$USER
-rw------- username crontab
Run Code Online (Sandbox Code Playgroud)
我不是crontab
小组成员。
这些行/var/log/auth.log
每分钟出现一次(感谢@Alaa):
Mon DD hh:mm:01 username CRON[1752]: pam_unix(cron:session): session opened for user username by (uid=0)
Mon DD hh:mm:01 username CRON[1752]: PAM bad jump in stack
Run Code Online (Sandbox Code Playgroud)
也许 PAM 坏了?pam-auth-update
(感谢@coteyr)列出了所有这些,并且所有这些都已启用:
他们中的任何一个都可以安全地禁用吗?我没有使用任何加密的文件系统。
根据我尝试运行的Debian 错误条目debconf-show libpam-runtime
,我收到以下错误消息:
debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied
Run Code Online (Sandbox Code Playgroud)
内容/etc/pam.d/cron
:
# The PAM configuration file for the cron daemon
@include common-auth
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session required pam_env.so
# In addition, read system locale information
session required pam_env.so envfile=/etc/default/locale
@include common-account
@include common-session-noninteractive
# Sets up user limits, please define limits for cron tasks
# through /etc/security/limits.conf
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid
Run Code Online (Sandbox Code Playgroud)
提到的文件 ( /etc/environment
, pam_env.so
, /etc/default/locale
, pam_limits.so
, pam_succeed_if.so
) 都可以被我的用户读取。
在另一台装有 Ubuntu 13.04 的主机上,使用相同的用户 crontab,没有/etc/cron.{allow,deny}
,与上述相同的权限,并且不是crontab
组的成员,它工作得很好(记录命令但不记录输出/var/log/syslog
)。
通过更改第一个 crontab 行:
* * * * * /usr/bin/env >/tmp/env.log 2>&1
Run Code Online (Sandbox Code Playgroud)
并检查 /tmp 是否是世界可写的:
$ sudo -u nobody touch /tmp/test
$ ls /tmp/test
/tmp/test
$ ls -ld /tmp
drwxrwxrwt 15 root root 12288 May 27 10:18 /tmp
Run Code Online (Sandbox Code Playgroud)
我已经验证crontab 命令根本没有运行:Permission denied
消息仍然显示在 中/var/log/syslog
,但/tmp/env.log
没有创建。
根据随机/etc/pam.d
设置的列表,我发现了以下差异:
$ grep '^[^#]' /etc/pam.d/sshd
@include common-auth
account required pam_nologin.so
@include common-account
@include common-session
session optional pam_motd.so # [1]
session optional pam_mail.so standard noenv # [1]
session required pam_limits.so
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
@include common-password
$ grep '^[^#]' /etc/pam.d/common-session
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session optional pam_umask.so
session required pam_unix.so
session optional pam_ecryptfs.so unwrap
session optional pam_ck_connector.so nox11
$ grep '^[^#]' /etc/pam.d/common-account
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
$ grep '^[^#]' /etc/pam.d/common-session-noninteractive
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session optional pam_umask.so
session required pam_unix.so
session optional pam_ecryptfs.so unwrap
Run Code Online (Sandbox Code Playgroud)
安装的 PAM 包:
$ dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam
libpam-cap
libpam-ck-connector
libpam-gnome-keyring
libpam-modules
libpam-modules-bin
libpam-runtime
libpam0g
python-pam
Run Code Online (Sandbox Code Playgroud)
我尝试重新安装这些 - 没有帮助:
$ sudo apt-get install --reinstall $(dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam)
Run Code Online (Sandbox Code Playgroud)
由于未满足的依赖性,我无法清除然后重新安装这些。
PAM bad jump in stack
是一个很大的线索。
您的/etc/pam.d/cron
版本与库存版本不同,在末尾添加了一行:
session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid
Run Code Online (Sandbox Code Playgroud)
该success=1
位的意思是“如果该模块成功,则跳过下一条规则”。只是没有下一条规则,因为这是 PAM 配置中的最后一行。
您的 PAM 配置出现问题。如果您使用了“外部”身份验证方法(例如指纹扫描仪、LDAP 帐户、USB 密钥或类似方法),这种情况很常见。基本上 cron 无法使用指纹扫描仪,因此它无法以您的身份登录。
您需要从中删除有问题的配置,/etc/pam.d/common-*
尽管跟踪它可能有点困难,特别是如果您没有手动启用某些功能(例如,如果指纹扫描仪设置脚本打开了某些功能)。
我无法告诉您这些文件中应该包含哪些内容。根据您的设置,很多事情可能会有所不同。但是禁用“必需的”身份验证方法直到您只使用“Unix 身份验证”可能是一个很好的第一步。
您可以通过pam-auth-update
以 root 身份运行并取消选中其他框来完成此操作。请务必非常小心,因为如果操作不当,您可能会无法登录系统。一次禁用它们,为了安全而重新启动,然后进行测试。切勿禁用“Unix 身份验证”