为什么 运行 cronjob 会导致新的随机 gpg-agent 进程 运行 并导致 gpg-agent 中缓存的密码无效?

Why a running cronjob causes a new random gpg-agent process running and causes cached passphrase in gpg-agent invalid?

下面的简单脚本用于检查 gpg-agent 缓存中的有效密码。当密码有效时,它只会打印 OK,但如果密码无效,则会打印警告消息。

#!/bin/bash
# checkgpg
KEY_ID=2B705B8B6FA943B1
test=$(echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user "$KEY_ID" --passphrase-fd 0 > /dev/null)
RET_VAL=$?

if [ $RET_VAL -eq 0 ]; then
        echo "OK, passphrase cached in gpg-agent is valid!"
else
        echo "Warning, passphrase cached in gpg-agent is invalid!"
fi

当我运行上面的脚本时,它还会运行一个新的gpg-agent进程来存储缓存的密码。所以在这种情况下它是 PID 3309

上面的脚本没有问题。

接下来,我通过 cronjob 将几个 bash 脚本设置为 运行。因此,当每个脚本通过 cronjob 运行ning 时,突然之间我可以看到一个具有不同 PID 运行ning 的随机 gpg-agent 进程(现在我有 2 个 gpg-agents):

[root@earth chkrootkit]# pidof gpg-agent
392612 3309

其中 PID 392612 是新的随机 gpg-agent,它在 cronjob 过程中 运行ning。

我不介意它是 运行ning 但这里的大问题是,当新的随机 gpg-agent 进程是 运行ning 时,当我重新 运行上面的 bash 脚本检查 gpg-agent 中的有效密码我会得到以下错误:

[root@earth]# ./checkgpg
gpg: signing failed: Inappropriate ioctl for device
gpg: signing failed: Inappropriate ioctl for device
Warning, passphrase cached in gpg-agent is invalid!

如果 cronjob 脚本已完成 运行ning,那么我可以再次看到有效密码:

[root@earth chkrootkit]# ./testgpg
OK, passphrase cached in gpg-agent is valid!

所以错误是由随机 gpg-agent 引起的,它 运行ning 直到它自己终止,然后缓存的密码短语将再次有效。这就是让我困惑的是为什么 运行ning bash 脚本也可以 运行 这个 gpg-agent 进程。

所以,这是 one example of my cronjob scripts 导致新的随机 gpg-agent 运行(仅当我通过 cronjob 运行 它时)。如果我通过终端 运行 这不会导致随机 gpg-agent 创建)。我认为演示此代码并不重要,因为来自 cronjob 的所有脚本都产生了相同的问题:

#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
echo "======================================"
echo "[chkrootkit | info]: Chkrootkit is checking system..."

#Global variables
MYHOSTNAME=`/bin/hostname`
MYEMAIL="webmaster@sofibox.com"
CHKROOTKIT_LOG_PATH="/usr/local/maxicron/chkrootkit/log"
REPORT_FILE="/usr/local/maxicron/chkrootkit/log/chkrootkit-file.log"
REPORT_FILE_GREP="/usr/local/maxicron/chkrootkit/log/chkrootkit-file-grep.log"
MAIL_BIN="/usr/local/bin/mail"
WARNING_STATUS="N/A"

mkdir -p $CHKROOTKIT_LOG_PATH

sudo touch $REPORT_FILE
sudo chown root:adm $REPORT_FILE
sudo chmod 640 $REPORT_FILE
cat /dev/null > $REPORT_FILE

sudo touch $REPORT_FILE_GREP
sudo chown root:adm $REPORT_FILE_GREP
sudo chmod 640 $REPORT_FILE_GREP
cat /dev/null > $REPORT_FILE_GREP

echo "[chkrootkit | info]: Please wait..."
echo "Chkrootkit checked on `date`" >> $REPORT_FILE
/usr/local/chkrootkit/chkrootkit >> $REPORT_FILE
echo "Rootkit scan return: $?"
echo "" >> $REPORT_FILE
echo "==================SCAN COMPLETED=================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "================= WARNING NOTICE ================" >> $REPORT_FILE

if (grep -e "Warning" -e "INFECTED" -e "were found" $REPORT_FILE >> $REPORT_FILE_GREP) then
        WARNING_STATUS="WARNING"
        cat $REPORT_FILE_GREP >> $REPORT_FILE
        echo "[chkrootkit | info]: You may Check chkrootkit update manually" >> $REPORT_FILE
        echo "================== END OF NOTICE ================" >> $REPORT_FILE
        $MAIL_BIN -s "[chkrootkit | $WARNING_STATUS] Check Rootkit Scan Report  @ $MYHOSTNAME" $MYEMAIL < $REPORT_FILE
else
        WARNING_STATUS="OK"
        echo "" >> $REPORT_FILE
        echo "NO WARNING FOUND" >> $REPORT_FILE
        echo "" >> $REPORT_FILE
fi
$MAIL_BIN -s "[chkrootkit | $WARNING_STATUS] Check Rootkit Scan Report  @ $MYHOSTNAME" $MYEMAIL < $REPORT_FILE
echo "[chkrootkit | info]: Scan Status: $WARNING_STATUS"
echo "[chkrootkit | info]: Done checking system. Email notification is set to $MYEMAIL"
echo "======================================"

上述脚本的 crontab 如下所示:

26 18 * * * root /root/testgpg > /dev/null

所以,在确切的时间,18:26,我创建了一个新的随机 gpg-agent。我没有看到代码有任何问题,也没有与 gpg 相关的内容。当我通过 cronjob 运行 上述脚本时,为什么新的 gpg-agent 进程正在 运行ning?这也发生在其他脚本中,如备份脚本等。有没有办法调试它来自哪里?我花了几个星期的时间来找出这个错误背后的原因,现在我只想知道原因以及如何防止这种情况发生。

终于可以重现这个问题了。当我在 cronjob 上 运行 这个脚本时:

!#/bin/bash
#testscript.sh
sudo sleep 60 

这将导致 gpg 密码在 60 秒内无效,并且第二个随机 gpg-agent 进程将 运行ning 持续 60 秒。

但是如果我在 cronjob 中 运行 这个脚本(没有 sudo),我看不出问题:

!#/bin/bash
#testscript.sh
sleep 60 

不仅如此,如果我 运行 整个脚本在 cronjob 中作为 sudo 这样也是一个问题:

14 23 * * * root sudo /root/testscript.sh > /dev/null

请注意,如果我 运行 脚本作为 sudo 直接从终端像这样:

sudo testscript.sh

那么它不会创建新进程。只有在 cronjob 中使用 sudo 时才会发生这种情况。

所以简而言之,创建随机 gpg-agent 进程的原因是因为在 cronjob 中使用了 sudo 命令。我仍然不确定为什么在使用 sudo 命令时 gpg-agent 进程会重生。

这绝对是一个 mystery-bug,我认为这是一个 programming-related 错误,但没关系,我终于可以通过不在我的每个脚本中使用 sudo 命令来防止这个错误。已解决。