PsExec и Java для подключения к удаленному серверу Windows

#windows-server-2008 #remote-desktop #psexec

#windows-server-2008 #удаленный рабочий стол #psexec

Вопрос:

У меня есть требование, при котором мне нужно подключиться к серверу Windows с другого персонального компьютера Windows. Мне также нужно иметь возможность загружать компакт-диск в определенную папку на удаленном компьютере, получать список файлов в этой папке и проверять наличие файла в этой папке. Когда я начал изучать это, я мог понять, что есть два варианта:

  • Установите OpenSSH на сервере Windows и используйте для подключения такие клиенты, как JSch — моя команда infra может одобрить или не одобрить этот запрос.
  • Используйте PsExec для подключения и проделайте аналогичную вещь — вот где я могу подключиться, но не могу понять, как перейти на компакт-диск в каталог и получить список файлов в любой папке там.

Вот что у меня есть с точки зрения кода:

     private static void authenticateAndExecute() {
    String psCommand = PATH_TO_PSEXEC   "\PsExec.exe \\"   "testdev19"   " -u "   "userName"
              " -p "   "password";
    psCommand = psCommand   " "   "cmd cd c:\destdir"   " dir ";
    String[] cmd = new String[5];
    cmd[0] = "cmd.exe";
    cmd[1] = "/C";
    cmd[2] = psCommand;
    cmd[3] = "";
    cmd[4] = "";
    // Run remote command
    Process p = null;
    try {
        p = Runtime.getRuntime().exec(cmd, null);
        System.out.println("Connected..."   p.getOutputStream());
        InputStream is = p.getInputStream();

        OutputStream os = p.getOutputStream();

        InputStream es = p.getErrorStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        BufferedReader errReader = new BufferedReader(new InputStreamReader(es));
        String line;

        // Read STDOUT into a buffer.
        while ((line = errReader.readLine()) != null) {
            System.out.println(line);
        }
        // If no STDOUT check STDERR.
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        // Wait for the process to end.
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (p != null) {
            p.destroy();
        }
    }
}
 

Все, что я вижу после запуска, это то, что процесс завершился с кодом возврата 0. Я хочу увидеть список файлов в каталоге назначения. Возможно ли это вообще с помощью PsExec или я иду по неправильному пути?

Любая помощь приветствуется…

Комментарии:

1. Вы не можете использовать общий доступ к файлам? \testdev19c$destdir должен показать вам файлы в этой папке.

2. Спасибо Гарри за ваше предложение, но, к сожалению, мне нужно сделать это на более чем 500 серверах, и не все владельцы серверов разрешат совместное использование папки. Вот почему я хотел бы сделать это программно, используя Java, поскольку мне удобнее на этом языке!

3. К вашему сведению, по моему опыту, если общий доступ к файлам отключен, psexec также не будет работать. Могут быть крайние случаи, я не уверен в деталях. (Но, говоря как системный администратор, я бы предпочел предоставить кому-то доступ к общему файловому ресурсу с соответствующим ограничением, чем предоставить им доступ администратора через psexec!)

4. Но чтобы ответить на ваш первоначальный вопрос, команда должна выглядеть примерно так psexec \target cmd /c "cd /d c:destdir amp; dir"

5. Пробовал это как в командной строке, так и в программе, но, похоже, ни то, ни другое не сработало — программа выдает мне список файлов в папке проекта, в которой выполняется класс Java, а не файлы в указанной папке назначения. Тест командной строки вообще ничего не возвращает. Не уверен, что я делаю неправильно!

Ответ №1:

Пожалуйста, взгляните на:

 https://www.ibm.com/developerworks/community/blogs/738b7897-cd38-4f24-9f05-48dd69116837/entry/programmatically_connecting_to_remote_systems2?lang=en
 

это может решить вашу проблему

Комментарии:

1. Пожалуйста, предоставьте подробную информацию об ответе в сообщении, а не просто предоставьте ссылку.

Ответ №2:

 String psCommand = "<path_of_psexec>/psexec.exe \\" currentServerHostname   " -u "   currentServerUser   " -p "   currentServerPass;
      psCommand = psCommand   " "   commandToRunOnRemoteMachine   " "   parameters;
      String[] cmd = new String[5];
      cmd[0]="cmd.exe";
      cmd[1]="/C";
      cmd[2]=psCommand;
      cmd[3]="";
      cmd[4]="";
      // Run remote command
      File f = new File(getCurrentWorkingDirectory()   "\lib");
      Process p = Runtime.getRuntime().exec(cmd,null,f);