当试图从通过java进程执行的shell脚本保存bash文件时,它总是空的

nzk0hqpo  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(313)

使用java进程,我尝试用gpg解密一个文件,并将其作为.txt文件保存到本地文件系统。如果我从终端执行这个脚本,它就会正常工作。当我通过java进程执行它时,它会在我的项目根目录上创建一个文件,但它总是空的。我没有任何错误,所以很难诊断。
sh脚本:

gpg --batch --yes --passphrase-file pass --import private-key.asc
gpg --batch --yes --passphrase-file pass -d fileStillEncrypted.txt.pgp > decrypted_file.txt

上面的第一行是有点多余的,因为它只需要做一次,但现在留在那里。
我将文件权限更改为777进行测试,只是为了查看是否存在权限问题:

-rwxrwxrwx   1 user  767211335   6037 Aug 10 11:24 fileStillEncrypted.txt.pgp
-rw-r--r--@  1 user  767211335   2667 Aug 10 11:36 private-key.asc
-rwxrwxrwx   1 user  767211335    141 Aug 21 08:33 decryptFile.bat
-rwxrwxrwx   1 user  767211335    178 Aug 21 09:08 decryptFile.sh

“pass”文件包含pw,并且与sh脚本位于同一目录中。
java代码:

public void decryptFile() {

    Process p;
    try {
        String[] cmd = {"sh", "/Users/user/path/to/decryptFile.sh"};
        p = Runtime.getRuntime().exec(cmd);
        p.waitFor();

    } catch (IOException e) {
        // TODO catch exception properly
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO catch exception properly
        e.printStackTrace();
    }
}

任何帮助都将不胜感激,即使只是关于如何调试进程的建议,因为我在过去没有使用过它。

jrcvhitl

jrcvhitl1#

令人惊叹的。得到标准错误后,我发现尽管我用路径命中shell脚本,但它并不是在该路径中查找我引用的文件,而是在java应用程序的根路径中查找。我把文件移到那里,它把它们捡起来了。一开始我确实在文件中看到了“不适当的ioctl”错误。我发现,通过更新gnu中的以下配置并重新启动,文件将正确填充。
在./.gnupg中:创建了gpg-agent.conf和gpg.conf
gpg.conf格式:

use-agent
  pinentry-mode loopback

gpg-agent.conf格式:

allow-loopback-pinentry

然后需要使用以下命令重新启动gnu进程:

➜  .gnupg echo RELOADAGENT | gpg-connect-agent
  OK

相关问题