2015-11-15 6 views
0

При использовании Grails 2.4.5 org.codehaus.groovy.runtime.ProcessGroovyMethods на Ubuntu 14.04:Плохой результат от ProcessGroovyMethods в Groovy (UNIXProcess)

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]] 

, но когда я скопировать-вставить printlined команду в мой баш я получаю правильный сброс. Что происходит?


Я также попытался:

  • изменение туздЫшпра на полный путь: /USR/бен/туздЫшпр

  • посылая аргументы как массив строк, но с такой же результат.

  • посылая команду в обычную строку для выполнения:

    "mysqldump -hlocalhost -u'root' -p'password' database table" 
    

он работает в системе Баш, это не как ProcessGroovyMethod ...

+0

ли вы попробовать без лишних "убегает? _ "mysqldump -h $ {databaseProperties.host} -u $ {databaseProperties.username} -p $ {databaseProperties.password} $ {databaseProperties.name}" + table_ – Jayan

ответ

0

Update:

Подумав об этом за одну ночь, я (все еще) убежден, что проблема связана с вашим паролем. Поскольку в командной строке действительно не рекомендуется вводить пароль (mysqldump даже предупреждает об этом), я думаю, вам следует изменить тактику, создав логин-путь.

Используйте следующую команду, чтобы создать путь для входа (это шаг разовый):

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

Затем измените команду, которую вы пытаетесь выполнить с помощью Groovy к этому:

def command="mysqldump --login-path=name database table" 

Это будет работать вокруг проблемы, которую вы видите, и является более безопасным.

Оригинальный ответ:

Я был в состоянии воспроизвести проблему. String.execute() не использует командную оболочку, и поэтому одинарные кавычки передаются 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

+0

Проблема, безусловно, связана с паролем. Я использовал .my.cnf с жестко запрограммированным паролем, и он работает! Я думаю, что буду использовать это обходное решение с * - login-path *, и я надеюсь, что он будет работать. Я проверю ваш ответ как лучший после подтверждения. Спасибо за эту ссылку со странным поведением встроенных цитат! Это действительно беспокоило меня и на самом деле ... все еще есть :) –

+0

Обновление: ProcessBuilder работает как очарование. Большое спасибо! –

+0

Выдающийся, рад, что он сработал! Это определенно неожиданное поведение с String.execute(). – matsuzine