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

马西32

下面的简单脚本用于检查 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 进程来存储缓存的密码。所以在这种情况下它是PID3309

上面的脚本没有问题。

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

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

其中 PID392612是在 cronjob 过程中运行的新的随机 gpg-agent。

我不介意它正在运行,但这里的大问题是,当新的随机 gpg-agent 进程正在运行时,并且当我重新运行上述 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 脚本已完成运行,那么我可以再次看到有效的密码:

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

因此,错误是由运行的随机 gpg-agent 引起的,直到它自行终止,然后缓存的密码将再次有效。这就是让我困惑为什么运行 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="[email protected]"
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 进程正在运行?这也发生在备份脚本等其他脚本中。有没有办法调试它来自哪里?我花了几个星期来找出这个错误背后的原因,现在我只想知道原因以及如何防止这种情况发生。

马西32

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

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

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

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

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

不仅如此,如果我sudo像这样在 cronjob 中运行整个脚本也会出现问题:

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

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

sudo testscript.sh

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

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

这绝对是一个神秘的错误,我认为这是一个与编程相关的错误,但没关系,我终于可以通过不在我的每个脚本中使用 sudo 命令来防止这个错误。解决了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章