Запуск команды sudo над j2ssh
Я пытаюсь написать код Java, который подключается к рабочей станции Linux, выполняет команду с помощью sudo, а затем блокирует ее до тех пор, пока она не будет завершена.
session.getOutputStream().write("sudo -s \n".getBytes());
session.getOutputStream().write(command.getBytes());
session.getOutputStream().write("\n exit\n".getBytes());
IOStreamConnector output = new IOStreamConnector();
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
output.connect(session.getInputStream(), bos);
String theOutput = bos.toString();
похоже, не ожидает завершения программы или возврата обратно вывода.
session.executeCommand(command);
IOStreamConnector output = new IOStreamConnector();
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
output.connect(session.getInputStream(), bos);
session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
theOutput = bos.toString();
Работает хорошо, но не с sudo. Я попытался установить команду:
"su -c \" touch /tmp/what \ "" (touch - это не команда, которую я запускаю, просто использую ее для проверки.) Это не работает.
"sudo touch /tmp/what" Это не работает.
Какая волшебная формула для этого???? Заранее спасибо.
2 ответа
Я бы предложил использовать что-то вроде этого, хорошо работает для меня:
if ( session.executeCommand("echo "+"/'your_sudo_password/' "+"| "+ "sudo -S "+command) ) {
IOStreamConnector output = new IOStreamConnector();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
output.connect(session.getInputStream(), bos );
session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
theOutput = bos.toString();....
Использовали ли вы оператор ожидания в оригинальном подходе на основе startShell?
session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
Код в посте, кажется, пытается захватить вывод команды сразу после написания команды sudo. Так как IOStreamConnector порождает потоки для чтения команды, она может не завершиться до закрытия сеанса.