问题描述
以下简单脚本用于检查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命令来最终避免此错误。解决了。