为什么 运行 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 命令来防止这个错误。已解决。
下面的简单脚本用于检查 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 命令来防止这个错误。已解决。