Как изменить каталог (cd) с помощью Ganymed SSH API? - PullRequest
2 голосов
/ 02 октября 2011

Я, должно быть, что-то здесь упускаю, но как мне назвать что-то вроде "cd / root / some / dir /" с Ganymed SSH API?

  1. Я создал Connectionобъект

  2. В первом созданном сеансе я вызвал "cd / root / some / dir"

  3. Во втором созданном сеансе я вызвал"лс"или "./myApp"

Это не сработало, поскольку ganymed, вероятно, запускает каждый сеанс со своего собственного каталога

Так что мне нужно выполнить обе команды в одном сеансе?что-то вроде:

session.getStdin().write("cd /root/somedir \n".getBytes());
session.getStdin().write("ls . ".getBytes());

Это правильный путь ??если так, зачем нам Session.execCommand?

Ответы [ 3 ]

1 голос
/ 04 октября 2011

После некоторых исследований единственное хорошее решение, которое мне удалось найти, - это вызвать команду "cd" в том же коде, что и команда "ls", например,

session.execCommand("cd /root/somedir ; ls .");

Точка с запятой разделяет две команды, как в любом коде bash.

Таким образом, вы можете запросить результат сеанса [session.getExitStatus()] обеих команд cd и ls, что на намного лучше, чем запись двух команд в session.getStdIn() ( после записи в stdin вы теряете возможность проверять состояние выхода ...)

Надеюсь, это поможет остальным

Эяль

1 голос
/ 17 апреля 2018

В соответствии с часто задаваемыми вопросами Ganymed (http://www.ganymed.ethz.ch/ssh2/FAQ.html), вам не разрешено отправлять более одной команды на каждый сгенерированный вами объект Session. Именно так SSH-2 явно хочет, чтобы вы справились с этим. Вы можете выбрать один из двух вариантов: объединить две команды, такие как

session.execCommand("cd /root/somedir ; ls .");

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

Session sess = conn.openSession();
sess.requestDumbPTY();
sess.startShell();

OutputStream os = sess.getStdin();
os.write("cd /root/somedir\n".getBytes());
os.write("ls -1\n".getBytes());
os.write("exit\n".getBytes());

InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

//TODO

Обратите внимание на использование команды заключительного выхода. Так как это обрабатывается как окно терминала, если вы не выйдете из программы, любой цикл, который вы читаете с выхода сервера, никогда не прекратится, потому что сервер будет ожидать больше ввода

0 голосов
/ 02 октября 2011

Хорошо, я быстро взглянул на Javadoc Ganymed и, хотя сам не пробовал, я предполагаю, что вы должны использовать метод execCommand() сессии вместо записи в STDIN. Я уверен, что сессия связана с удаленной оболочкой и поэтому обрабатывает состояние оболочки, включая текущий каталог, переменные окружения и т. Д.

Итак, просто сделайте следующее:

session.execCommand("cd /root/somedir \n".getBytes());
session.execCommand("ls . ".getBytes());

Надеюсь, это сработает для вас. Удачи.

...