gpt4 book ai didi

grails - groovy的ProcessGroovyMethods(UNIXProcess)导致的错误结果

转载 作者:行者123 更新时间:2023-12-02 15:56:00 25 4
gpt4 key购买 nike

在Ubuntu 14.04上使用Grails 2.4.5 org.codehaus.groovy.runtime.ProcessGroovyMethods时:

def command = "mysqldump -h${databaseProperties.host} -u'${databaseProperties.username}' -p'${databaseProperties.password}' ${databaseProperties.name} " + table
print command
def proc = command.execute()
def oneMinute = 60000
proc.waitForOrKill(oneMinute)
if(proc.exitValue()!=0){
println "[[return code: ${proc.exitValue()}]]"
println "[[stderr: ${proc.err.text}]]"
return null
}else{
return proc.in.text.readLines()
}

我有
[[return code: 2]]
[[stderr: mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect]]

但是,当我将打印行的 命令复制粘贴到我的bash中时,会收到正确的转储。到底是怎么回事?

我也尝试过:
  • 将mysqldump更改为完整路径:/ usr / bin / mysqldump
  • 将参数作为String数组发送,但具有相同的参数
    结果。
  • 作为常规字符串发送命令执行:
    "mysqldump -hlocalhost -u'root' -p'password' database table"

  • 它可以在系统bash中工作,而不是作为ProcessGroovyMethod ...

    最佳答案

    更新:

    经过一整夜的思考,我(仍然)确信该问题与您的密码有关。由于在命令行上提供密码确实不是最佳实践(mysqldump甚至会警告您),因此我认为您应该通过创建登录路径来更改策略。

    使用以下命令创建登录路径(这是一次性步骤):

    mysql_config_editor set --login-path=name --host=localhost --user=youruser --password

    然后将您尝试从Groovy执行的命令更改为以下命令:
    def command="mysqldump --login-path=name database table"

    这样可以解决您遇到的问题,并且更加安全。

    原始答案:

    我能够重现问题。 String.execute()不使用命令 shell ,因此单引号将被传递给mysqldump,就好像它们是密码的一部分一样。

    编辑:经过一番思考,我不认为Groovy的 String.execute()是去这里的方法,因为它对引号的处理是意外的。如果您的密码不包含空格,那就很好了,但这可能很脆弱。

    如果您需要更多控制权,则应考虑使用 ProcessBuilder:
    ProcessBuilder pb = new ProcessBuilder("mysqldump", "-h${databaseProperties.host}", "-u${databaseProperties.username}", "-p${databaseProperties.password}", databaseProperties.name, table);
    pb.inheritIO();
    Process p = pb.start();

    编辑:进一步的研究,刚刚使用包含空格的密码对其进行了测试。 command.execute()无法正确处理此问题,但可以使用 ProcessBuilder方法。

    这是另一篇文章,解释String.execute()方法的某些意外行为:

    Groovy: strings with embedded quotes don't execute as expected

    关于grails - groovy的ProcessGroovyMethods(UNIXProcess)导致的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714852/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com