Хобрук: Ваш путь к мастерству в программировании

java — использование curl с Runtime.getRuntime().exec

Я хочу использовать curl в программе Java, используя Runtime.getRuntime().exec

Полный фрагмент приведен ниже, но моя проблема сводится к тому, что я получаю ответ об ошибке, когда использую curl command в Runtime.getRuntime().exec(command) но когда я System.out.println ввожу команду, копирую и вставляю ее в оболочку и выполняю ее там, все работает нормально.

System.out.println(command);
Runtime.getRuntime().exec(command);

Что может вызвать такой разный результат между выполнением во время выполнения и выполнением команды в оболочке.

Спасибо за любые подсказки

Мартин

обновления:

  • Ответ об ошибке, который я получаю при использовании Runtime: {"error":"unauthorized"}

  • Как я вижу из команд, это кажется неясным. Я не получаю никаких исключений, через которые проходит команда curl, но ответ json такой, как указано выше.


String APP_ID = "XXX";
String REST_API_KEY = "YYY";

String header = "-H \"X-Parse-Application-Id: " + APP_ID
        + "\" -H \"X-Parse-REST-API-Key: " + REST_API_KEY
        + "\" -H \"Content-Type: application/zip\" ";

public void post2Parse(String fileName) {

    String outputString;

    String command = "curl -X POST " + header + "--data-binary '@"
            + fileName + "' https://api.parse.com/1/files/" + fileName;

    System.out.println(command);

    Process curlProc;
    try {
        curlProc = Runtime.getRuntime().exec(command);

        DataInputStream curlIn = new DataInputStream(
                curlProc.getInputStream());

        while ((outputString = curlIn.readLine()) != null) {
            System.out.println(outputString);
        }

    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}
17.09.2012

  • Опубликуйте исключение/ошибку, которую вы получаете 17.09.2012
  • {ошибка: неавторизованный} 17.09.2012
  • вы получаете исключение? какой код ошибки и сообщение у него есть? или вывод показывает несанкционированный? 17.09.2012
  • ответ об ошибке с опубликованным ответом json 17.09.2012
  • мой вопрос действительно больше о том, что может иметь значение между выполнением команды Runtime.getRuntime().exec() и выполнением той же самой команды в оболочке 17.09.2012
  • Не забывайте, что любой созданный вами дочерний процесс унаследует разрешения/права доступа своих родителей. Убедитесь, что Java работает со всеми необходимыми разрешениями. 17.09.2012
  • Права администрации! но это не должно влиять на ответ Curl 17.09.2012
  • Только что сделал Runtime.getRuntime().exec(который завиток) и обнаружил, что он использует другой завиток, чем завиток, используемый в оболочке - дерьмовая настройка. Тем не менее, когда я вызываю curl с полным путем, поскольку он используется в оболочке, он все равно не работает. Поэтому, поскольку мне нужно двигаться дальше, я просто сделал что-то уродливое, но работающее. Я написал сценарий оболочки, выполняющий завиток и вызывающий этот сценарий оболочки из java, и пока он работает... 17.09.2012

Ответы:


1

У меня нет прямого ответа, но немного на пути к тому, что апостроф кодируется по-другому. Хотя это старый вопрос, я отвечу на него для дальнейшего использования, и, возможно, кто-то сможет объяснить полный ответ позже.

Когда я тестирую наш API подобным образом, я замечаю следующее:

curl -i http://localhost:8080/auth/login -d '[email protected]&password=test'

Эта команда, отправленная из оболочки, попадает на сервер как:

[email protected],\npassword=test,\n

но при отправке из Runtime.getRuntime().exec(command) это заканчивается так:

'[email protected],\npassword=test',\n

Если я изменю команду curl и уберу апострофы, это сработает (из-за сути этой команды)

 curl -i http://localhost:8080/auth/login -d [email protected]&password=test

Таким образом, можно предположить, что если код в вопросе изменен на этот, он может действительно работать, если имя файла не содержит пробела...:

String command = "curl -X POST " + header + "--data-binary @"
        + fileName + " https://api.parse.com/1/files/" + fileName;

Одним из вариантов может быть использование команды execute с массивом входных данных, как описано здесь: Похоже, что Runtime Exec игнорирует апострофы В сочетании с анализом команды curl (если не жестко закодировано), как описано здесь: Разделить строку на пробелы в Java, за исключением случаев, когда она заключена в кавычки (т. е. рассматривать \hello world\ как один токен)

22.11.2016
  • Вы спасли мне жизнь, сэр. Я несколько часов бился головой об эту стену. Я хотел просто загрузить файл с помощью curl из gradle (в качестве быстрой реализации). Это заняло больше времени, чем ожидалось. Ура! 26.01.2018
  • Вы спасли мою жизнь. Спасибо большое. 25.02.2020

  • 2

    Я предполагаю, что вы получаете код ошибки от Curl, а не исключение, снова проверьте API Curl, и вы найдете любой отсутствующий параметр, такой как «Пользователь» или что-то еще.

    Вы можете попробовать проверить некоторые подсказки, упомянутые в этом ответе.

    17.09.2012
  • спасибо - да, не исключение, а ответ об ошибке, как уже упоминалось. Та же самая команда curl работает при выполнении в оболочке, поэтому на самом деле это не проблема на той стороне API Curl... 17.09.2012
  • я видел этот другой пост, но для простоты я решил пойти на Runtime, как это было предложено в одном из комментариев 17.09.2012
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..