用JAVA执行CMD命令备份PG数据库,解决需要输入口令的问题

梓逸
2021-07-01 / 0 评论 / 0 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年11月19日,已超过12天没有更新,若内容或图片失效,请留言反馈。

最近要用JAVA做一个PostgreSQL的备份功能,没想到遇到一个大坑。

在网上搜索,很快就找到一个用JAVA的Runtime.getRuntime().exec()执行cmd命令来备份的方法。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

执行代码后发现,没有导出对应的SQL文件。我觉得可能是命令有问题,于是我在cmd执行了这条命令,才发现问题所在。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

原来是执行命令后还要输入数据密码的,这就是我说的那个大坑。

我马上就想到再用Runtime.getRuntime()执行一遍密码不就得了?但是结果果然不出所料,报错了。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

于是又网上查,JAVA怎么执行交互式的cmd命令。让我查到可以获取上一个命令的OutputStream,然后用OutputStream写入密码。

于是把代码改成下面这样:

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

执行并没有报错,但是还是没有生成对应的SQL文件。

于是继续网上查,结果都找不到JAVA执行cmd备份PostgreSQL怎么来输入密码。

然后我决定转换思路,既然不知道怎么输入密码,那干脆查一下pg_dump免密码导出。果然找到了。那就是在环境变量里加上PGPASSWORD。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

然后在cmd窗口执行导出命令,不用输入密码,成功导出。

但在很不幸,代码执行的时候,还是没有生成对应的SQL文件。难道是代码里执行不认这个环境变量?

本以为就一直卡在密码这里过不去了,没想到让我发现了另一个类ProcessBuilder。这个类也能执行cmd命令。于是把Runtime.getRuntime()全部换成ProcessBuilder。然后执行代码。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

结果依然是那么的不出所料,没有生成对应的SQL文件。

不过幸好我鼠标多滚了两下,在ProcessBuilder类的API页面。被我看到了一个environment()方法。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

就是environment()可以设置环境变量,于是我把刚刚的免密导出环境变量PGPASSWORD用ProcessBuilder类来设置。

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

然后执行代码,我对这次执行的结果并没抱多大希望。

但是结果依旧是那么的不出所料

用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

导出成功了!

0

评论

博主关闭了所有页面的评论