Nano Hash - криптовалюты, майнинг, программирование

Работа с потоками ввода/вывода при использовании Runtime.exec

Я пытаюсь запустить команду 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.

16.01.2014


Ответы:


1

Я обнаружил, что проще настроить файлы rsa и использовать параметр -i в команде scp.

Просто используйте -i, где находится закрытый ключ HOST-машины. Вам также потребуется добавить открытый ключ с компьютера, на котором запущена команда, в файл авторизованных ключей на хост-компьютере.

Таким образом, он не будет запрашивать у вас пароль вообще. Кроме того, если вы используете параметры -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null, вам редко будет о чем беспокоиться (что не всегда хорошо!)

16.01.2014
  • Я думал, что это вариант, но я предпочитаю аутентификацию по паролю. Я думаю, что это должно быть «выполнимо». 17.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..