Я пытаюсь запустить команду scp
в Java. Вот мой код,
try {
Process p = Runtime.getRuntime().exec("scp -P" + PORT + " " + FILEPATH + " " + USERNAME + "@" + HOST + ":somefolder/");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println("LINE: " + line);
if (line.contains(USERNAME+"@"+HOST+"'s password:")) {
bw.write(PASSWORD);
bw.newLine();
}
}
System.out.println("end of while.");
} catch (IOException e) {
e.printStackTrace();
}
Как видите, я не хочу вслепую печатать пароль на p.getOutputStream()
, что предлагается почти во всех подобных вопросах. Я хочу прочитать подсказку и действовать соответственно. Например, scp может предложить что-то вроде «Невозможно установить подлинность хоста 'SOME HOST'...», что запрашивает да/нет. Или что-то еще, что я не могу представить прямо сейчас.
Проблема с моим кодом в том, что он никогда не читает строку, хотя scp запрашивает пароль, который виден в cli. Любое предложение?
EDIT: я изменил код, чтобы использовать ProcessBuilder с конструктором String[], как предложил Эндрю Томпсон. Вот полный код:
package scptest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class STest {
// args => filepath, username, host, port, password
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("scp", "-P", args[3],
args[0], args[1] + "@" + args[2] + ":folder/");
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
p.getOutputStream()));
String line;
bw.write(args[4]);
bw.newLine();
bw.flush();
System.out.println("RETURN: " + p.waitFor());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
Как видите, я перестал проверять подсказки scp и отправил пароль прямо во входной поток Process. Это тоже не работает! Я имею в виду, когда я запускаю файл jar в строке запятой, я вижу подсказку «имя пользователя @ пароль хоста:» и жду пароль. Когда я нажимаю ввод без ввода пароля, он просто повторно запрашивает пароль без какого-либо сообщения об ошибке, что означает, что во входной поток Process
не передается строка, т.е. мой BufferedWriter
, похоже, ничего не делает.
Я компилирую свою программу на машине w8 с jdk 1.7.0_45, где я запускаю программу на сервере Ubuntu x64 с jre 1.7.0_51.