Запуск команды 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 порождает потоки для чтения команды, она может не завершиться до закрытия сеанса.

Другие вопросы по тегам