【问题标题】:run gpg encryption command through cronjob通过 cronjob 运行 gpg 加密命令
【发布时间】:2015-04-27 09:57:12
【问题描述】:

我有一个脚本,它通过 cronjob 在 sh 脚本中执行 gpg 加密命令。 这是我脚本的一部分

    do
    gpg --batch --no-tty --yes --recipient $Key  --output $Outputdir/${v}.pgp --encrypt  ${v}
    echo "$?"
    if  ["$?" -eq 0 ];
    then 
    mv $Inputdir/${v} $Readydir/
    echo "file moved"
    else
    echo "error in encryption"
    fi
    done

回声 $?给出的值为 2。

也试过下面的命令

    gpg --batch --home-dir dir --recipient $Key  --output $Outputdir/${v}.pgp --encrypt  ${v}

其中 dir=/usr/bin/gpg


我的完整脚本

    #set -x
    PT=/gonm1_apps/xfb/ref/phoenix_drop
    Inputdir=`grep Inputdir  ${PT}/param.cfg | cut -d "=" -f2`
    Outputdir=`grep Outputdir ${PT}/param.cfg | cut -d "=" -f2`
    Key=`grep Key ${PT}/param.cfg | cut -d "=" -f2`
    Readydir=`grep Readydir ${PT}/param.cfg | cut -d "=" -f2`
    echo $USER
    if [ "$(ls -la $Inputdir | grep -E 'S*.DAT')" ]; then
     echo "Take action $Inputdir is not Empty"
     cd $Inputdir
   for v in `ls SID_090_*`
   do
    gpg --recipient $Key  --output $Outputdir/${v}.pgp --encrypt  ${v}
            echo "$?"
   if  ["$?" -eq 0 ];
   then
    mv $Inputdir/${v} $Readydir/
            echo "file moved"
    else
            echo "error in encryption"
   fi
   done
  cd ${PT}
  else
  echo "$Inputdir is Empty"
  fi

【问题讨论】:

  • 您应该会打印出一条错误消息。如果您要在任何地方丢弃输出(2>/dev/null 或类似的),请将其删除。您是否使用手动测试脚本的同一用户执行 cronjob?
  • 是的,我已经用同一个用户执行了 cron,我尝试了一个新的 java 代码来做同样的事情,并收到错误消息,因为找不到公钥。
  • 真的确定在同一用户下运行 cron 作业吗?如果你运行echo $USER 会发生什么?看起来 GnuPG 正在尝试在另一个用户的 GnuPG 主目录中查找密钥。 --home-dir dir 将使用用户主目录中的一些 dir 子文件夹,最好给出绝对路径。如果使用--homedir,请记住注意权限。
  • 那么上一个我没有提到---homedir的命令呢。它有什么问题吗?
  • 请发布一个最小但完整的示例脚本来重现错误以及用于执行脚本的确切 crontab 行,并在脚本中包含echo $USER。将确切的输出添加到问题中。您提供的信息太模糊,现在回答只是猜测。通常,cron 下 GnuPG 的问题都是因为权限或 GnuPG 主目录错误。

标签: linux shell cron gnupg


【解决方案1】:

GnuPG 为每个用户管理单独的密钥环和“GnuPG 主目录”。从 Web 服务或 cronjobs 调用 GnuPG 时的一个常见问题是作为另一个用户执行它们。

这意味着其他用户的 GnuPG 确实在错误的密钥环(主目录)中查找密钥,如果已修复,则它根本不应该拥有对 GnuPG 主目录的访问权限(在运行 cron 或Web 服务器以 root 身份,但由于这个原因,不应该直接这样做)。

有不同的方法可以缓解这个问题:

  • 在另一个用户下运行 Web 服务器或 cron 作业。 这对于 cron 作业可能是一个可行的解决方案,但很可能不适用于 Web 服务。 sudosu 可能有助于以其他用户身份运行 GnuPG。
  • 将所需的(私有/公共)密钥导入其他用户的 GnuPG 主目录,例如通过切换到 www-dataroot 用户(或您机器上调用的任何名称)。李>
  • 更改 GnuPG 的行为以使用其他用户的主目录。如果您的 shell 解析了速记,您可以使用 --home-dir /home/[username]/.gnupg 或更短的 --home-dir ~username/.gnupg 来执行此操作。最好不要这样做,因为 GnuPG 在验证访问权限方面非常严格,如果过于宽松就会拒绝工作。 GnuPG 完全不喜欢允许除所有者以外的其他用户访问 GnuPG 主目录的权限,这是有充分理由的。
  • 更改 GnuPG 的行为以使用一个完全不相关的文件夹作为主目录,例如在您的应用程序存储数据的地方。通常,最好的解决方案。确保正确设置所有者和访问权限。一个例子是选项--home-dir /var/lib/foo-product/gnupg

【讨论】:

  • 我们可以将我们的公钥导出给服务器上的所有用户吗?
  • 当然——只需浏览所有这些,只需要几行脚本。但是这样做的必要性感觉不是一个可靠的解决方案。您需要从多个用户运行它吗?如果是这样,最好在使用前将密钥存储在硬盘上并gpg --import (如果密钥已经存在,重新导入不会破坏任何内容)。
【解决方案2】:

如果

       the echo $USER prints as root when executed on cronjob and as 
       username when executed manually

然后您需要以用户身份登录并使用诸如“crontab -e”之类的命令为该用户添加一个 cronjob 以运行您的脚本

【讨论】:

  • 如果我们没有权限通过我们的用户添加 crontab 呢??
  • 您显然拥有添加根 crontab 的特权,所以我很惊讶您无法为您的用户添加 crontab。如果您真的做不到,请询问您的系统管理员
  • 我们可以将我们的公钥导出给服务器上的所有用户吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多