Невозможно выполнить мою команду после SSH на удаленном сервере - PullRequest
1 голос
/ 12 июля 2011

Я написал код, который выполняет SSH на серверах и запускает файл Java с аргументами.

Проблема, с которой я сталкиваюсь, заключается в том, что код успешно выполняет SSH, но после этого не запускает команду.Странно, если я запускаю команду только с сервера, она работает.Любые предложения по этому вопросу, пожалуйста?Ниже приведен код:

public void  getSSH(String code, String newCode, JspWriter out){   

    try{
        File f = new File("/usr/site/html/Output.txt");
        BufferedWriter output = new BufferedWriter(new FileWriter(f));
        String Servers[] = {"root@web233.xyz.com","root@web234.xyz.com","root@web235.xyz.com","root@web153.xyz.com"};
        for(int i =0;i<Servers.length && i<1 ;i++){

            Process p = Runtime.getRuntime().exec("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'");
            out.println("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'"+"<br>");
            Utils.waitFor(10000); 
        }

    }
}

Мне также рекомендовали JSch, но я еще не изучал его.

1 Ответ

1 голос
/ 12 июля 2011

Причина, по которой он не работает, заключается в том, что кавычки в этой версии не имеют того же эффекта, что и в командной строке.Когда вы вызываете SSH из bash, вы помещаете удаленную команду в кавычки, чтобы она все интерпретировалась как один аргумент.Баш делает разделение аргументов за вас.С exec Java разделяет аргументы за вас.Документация для exec описывает, как она разделяется.Он использует StringTokenizer, который довольно тупой и разделяет строку на основе пробелов (игнорируя кавычки).Это означает, что массив аргументов, передаваемых в команду, выглядит примерно так:

{ "/usr/site/swapimages.sh", "root@something", "'/root/testRemote.sh",
  code, newCodeContents + "'" }

Может быть даже больше строк, если в code или newCode есть пробелы.Обратите внимание, что ваша команда состоит из нескольких элементов в массиве и поэтому будет рассматриваться как несколько аргументов ssh.Кроме того, ssh фактически попытается выполнить команду, которая находится в каталоге с именем '.Однако вы хотите передать следующее:

{ "/usr/site/swapimages.sh", "root@something",
  "/root/testRemote.sh " + codeContents + " " + newCodeContents }

Обратите внимание, что кавычек нет, и вся команда является третьим элементом в массиве.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...