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

问题描述

以下简单脚本用于检查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

上面的脚本没有问题。

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

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

其中PID 392612是在cronjob进程中运行的新的随机gpg代理。

我不介意它正在运行,但是这里最大的问题是,当新的随机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="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进程?其他脚本(例如备份脚本等)也会发生这种情况。有没有办法调试它的来源?我花了几周的时间来找出导致此错误的原因,现在我只想知道原因以及如何防止这种情况。

解决方法

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

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

这将导致gpg密码短语无效60秒,并且第二个随机gpg-agent进程将运行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进程。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...