2015-05-28 3 views
0

Я пытаюсь написать код Java, который подключается к рабочей станции Linux, выполняет команду с sudo, а затем блокирует, пока команда не будет завершена.Выполнение команды sudo по j2ssh

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

Хорошо работает, но не с судо. Я попытался установить команду:

«su -c \» touch/tmp/whatever \ "" (касание не является той командой, которую я запускаю, просто используя ее для тестирования). Это не работает.

"sudo touch/tmp/whatever" Это не работает.

Какая магическая формула для этого ???? Заранее спасибо.

+0

ли он ожидает пароль для команды Sudo? – user489041

+0

Нет, он не ждет пароля. Я не настроил пароль в файле sudoers. Но спасибо за предложение. – caris

ответ

0

Вы использовали оператор wait в исходном подходе «startShell»?

session.getState().waitForState(ChannelState.CHANNEL_CLOSED); 

Код в сообщении, как представляется, пытается захватить вывод команды сразу после записи команды sudo. Поскольку IOStreamConnector генерирует потоки для чтения команды, она может не завершиться до закрытия сессии.

0

Я предложил бы использовать что-то вроде этого, хорошо работает для меня:

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();.... 
Смежные вопросы