java Runtime.getRuntime (). exec, используя cat и piping - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь запустить следующую команду через Java, чтобы показать текущую мощность сигнала Wi-Fi:

cat /proc/net/wireless | awk 'END { print $4 }' | sed 's/\.$//'

В терминале эта команда работает нормально.

Функция, которую я использую дляВыполнить команды можно следующим образом:

public static String[] executeNativeCommand(String[] commands, String friendlyErrorMessage, String... arguments) throws RuntimeException {
        if (commands == null || commands.length == 0)
            return new String[]{};

        Process listSSIDProcess = null;
        try {
            String[] replacedCommands = new String[commands.length];
            for (int t = 0; t < commands.length; t++) {
                replacedCommands[t] = MessageFormat.format(commands[t], (Object[])arguments);
            }
            listSSIDProcess = Runtime.getRuntime().exec(replacedCommands);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            IOUtils.copy(listSSIDProcess.getInputStream(), output);
            return new String(output.toString()).split("\r?\n");
        } catch (IOException e) {
            if (friendlyErrorMessage == null) {
                logger.error("Error masked due to the friendly error message not being set", e);
                return new String[]{};
            }

            throw new RuntimeException(friendlyErrorMessage, e);
        } finally {
            if (listSSIDProcess != null) {
                listSSIDProcess.destroy();
            }
        }
    }

Я пытался вызвать его с помощью:

public String getCurrentWiFiStrength(){
        String[] output = IOUtilities.executeNativeCommand(new String[]{"cat /proc/net/wireless | awk 'END { print $4 }' | sed 's/.$//'"}, null);
        if (output.length > 0) {
            logger.info("Wireless strength :" + output);
            return output[0];
        }
        else {
            return null;
        }
    }

Это не сработало, поэтому после некоторых исследований переполнения стека я добавил / bin / sh и -cкак это:

public String getCurrentWiFiStrength(){
        String[] output = IOUtilities.executeNativeCommand(new String[]{"/bin/sh", "-c", "cat /proc/net/wireless | awk 'END { print $4 }' | sed 's/.$//'"}, null);
        if (output.length > 0) {
            logger.info("Wireless strength :" + output);
            return output[0];
        }
        else {
            return null;
        }
    }

Это тоже не сработало.Поэтому я попытался запустить через терминал /bin/sh -c cat /proc/net/wireless | awk 'END { print $4 }' | sed 's/\.$//'

, который просто продолжает зависать и ничего не возвращает ... Так что я не уверен, что происходит и как это исправить ... Есть предложения?Я использую tinkerOS (дистрибутив на основе Debian)

заранее спасибо!

РЕДАКТИРОВАТЬ:

Так что я понял, почему он не работает вshell, это был мой выход ... Правильный синтаксис:

/ bin / bash -c "cat / proc / net / wireless | awk 'END {print \ $ 4;}' | sed 's /. $ // '"

Итак, я попытался:

public String getCurrentWiFiStrength(){
        String[] output = IOUtilities.executeNativeCommand(new String[]{"/bin/sh", "-c", "\"cat /proc/net/wireless | awk 'END {print \\$4;}' | sed 's/.$//'\""}, null);
        if (output.length > 0) {
            return output[0];
        }
        else {
            return null;
        }
    }

Без особой удачи ... Есть предложения?

...