#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);