2016-07-06 2 views
2

Я пытаюсь использовать Runtime.getRuntime() .exe() .exe() .exe() для . открытый ключ из частного ключа с помощью утилиты ssh-keygen linux.Команда ssh-keygen в Java для извлечения открытого ключа из закрытого ключа

Когда я запускаю эту команду на терминале, он работает безупречно, и я в состоянии извлечь открытый ключ из RSA секретного ключа

ssh-keygen -y -f /home/useraccount/private.txt > /home/useraccount/public.txt 

Но когда я запускаю ту же команду с помощью Java это не создает public.txt. Это тоже не вызывает никаких ошибок.

Process p = Runtime.getRuntime().exec("ssh-keygen -y -f /home/useraccount/private.txt > /home/useraccount/public.txt"); 
p.waitFor(); 

Мне интересно, почему это так?

+0

При вводе команды с '> file' и т.д. _to в shell_, оболочка делает перенаправление перед запуском программа. Java 'Runtime.exec()' не выполняет перенаправление. Либо (1) читайте из 'Process.getInputStream()' и пишите в файл самостоятельно; (2) используйте 'ProcessBuilder' с' .redirectOutput() 'для выполнения перенаправления; или (3) использовать '.exec (String ...)' перегрузку для запуска, например. 'sh' с' -c' и (как единственный аргумент!) всю командную строку, которую оболочка затем анализирует и обрабатывает. –

+0

Можете ли вы поделиться образцом? – sunny

ответ

0

Не совсем ответ, потому что у меня нет времени, чтобы проверить, но основные варианты:

// example code with no exception handling; add as needed for your program 

String cmd = "ssh-keygen -y -f privatefile"; 
File out = new File ("publicfile"); // only for first two methods 

//// use the stream //// 
Process p = Runtime.exec (cmd); 
Files.copy (p.getInputStream(), out.toPath()); 
p.waitFor(); // just cleanup, since EOF on the stream means the subprocess is done 

//// use redirection //// 
ProcessBuilder b = new ProcessBuilder (cmd.split(" ")); 
b.redirectOutput (out); 
Process p = b.start(); p.waitFor(); 

//// use shell //// 
Process p = Runtime.exec ("sh", "-c", cmd + " > publicfile"); 
// all POSIX systems should have an available shell named sh but 
// if not specify an exact name or path and change the -c if needed 
p.waitFor(); 
Смежные вопросы