为什么运行的cronjob会导致新的随机gpg代理进程运行,并导致gpg代理中缓存的密码短语无效



下面的简单脚本用于检查gpg代理缓存中的有效密码短语。当密码短语有效时,它只会打印"OK",但如果密码短语无效,则会打印"Warning"消息。

#!/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代理进程来存储缓存的密码短语。所以在这种情况下,它是PID3309

上面的脚本没有问题。

接下来,我有几个bash脚本,我设置它们通过cronjob运行。因此,当每个脚本都通过cronjob运行时,我突然可以看到一个随机的gpg代理进程在运行不同的PID(现在我有两个gpg代理(:

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

其中PID392612是在cronjob进程期间运行的新的随机gpg代理。

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

[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代理引起的,直到它自己终止,然后缓存的密码短语将再次生效。这就是为什么运行bash脚本也可以运行这个gpg代理进程的原因。

因此,这是one example of my cronjob scripts导致新的随机gpg代理运行(仅当我通过cronjob运行它时(。如果我通过终端运行这个,它不会导致创建随机的gpg代理(。我认为演示这段代码并不重要,因为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代理。我看不出代码有任何问题,也没有任何与gpg有关的内容。当我通过cronjob运行上面的脚本时,为什么会运行一个新的gpg代理进程?其他脚本(如备份脚本等(也会出现这种情况。有没有办法调试它的来源?我花了几个星期的时间来找出这个错误背后的原因,现在我只想知道原因以及如何防止这种情况发生。

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

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

这将导致gpg密码短语无效60秒,第二个随机gpg代理进程将运行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代理进程的原因是因为cronjob中使用了sudo命令。我仍然不确定为什么在使用sudo命令时gpg代理进程会重新出现。

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

最新更新