2016-04-15 4 views
2

Я пытаюсь выполнить команды удаленно на сервере под su. В частности, я удаленно выполнение:Проверьте, предоставлен ли пароль для команды su для библиотеки JSch

su -c '[command]' 

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

Мой вопрос, надеюсь, довольно прост: как проверить, отвечает ли out.write на запрос пароля, указанный в команде su? Каналы, похоже, подключены, и программа, похоже, работает до тех пор, пока не задействован su.

В идеале последовательность действий:

удаленная команда инициализируется -> Запрашивать пароль -> ввод пароля удаленно [критическая точка] -> выполнить команду

Это должно быть su. Это не может быть sudo.

/** 
* Method to connect to session. 
*/ 
protected void connectSession(Session session){ 
    try { 

     //connect to session and open exec channel 
     session.connect(); 
     channel=session.openChannel("exec"); 

     ((ChannelExec)channel).setCommand(command); //set the command 
     ((ChannelExec)channel).setPty(true); //set PTY tru for Password input 
     ((ChannelExec)channel).setErrStream(System.err); 

     in = channel.getInputStream(); //set input stream 
     out=channel.getOutputStream(); //set output stream and connect 
     channel.connect(); 

     System.out.println("Channel was connected"); 
     out.write((sudo_pass+"\n").getBytes()); //write password upon prompt 
     out.flush(); 

     //I believe the out.write and the out.flush section is not working. It probably breaks right before here. 

     System.out.println("Wrote sudo Pass"); 

    } catch (JSchException | IOException e) { 
     System.out.println("Could not connect to session"); 
     e.printStackTrace(); 
    } 
} 
@Override 
protected Integer RunCommand() throws Exception { 
    int j = 0; 
    System.out.println("Running command: " + command); 
    connectSession(session); 

    byte[] tmp=new byte[1024]; 
    while(in.available()>0){ 
     int i=in.read(tmp, 0, 1024); 
     if(i<0)break; 
     System.out.print(new String(tmp, 0, i)); 
    } 

    if(channel.isClosed()){ 
     if(in.available()>0) continue; 
     System.out.println("exit-status: "+channel.getExitStatus()); 
     break; 
    } 

    try{Thread.sleep(1000);} 
    catch(Exception ee){} 
    channel.disconnect(); 
} 

я почерпнул из:

надеется, что это поможет кто-нибудь с подобной проблемой!

+0

* Как обеспечить, чтобы я записывал в выходной поток пароль? * - Что это значит? –

+0

На этой строке: out.write ((sudo_pass + "\ n"). GetBytes()); // пишем пароль по подсказке, я считаю, что в этом письме вводится пароль su.Проблема в том, что, хотя это решение работает для http://www.jcraft.com/jsch/examples/Sudo.java.html, «su» не имеет опции -p, и я не верю, что функция out.write на самом деле вводит пароль после запроса. Я рассматривал сценарии ожидания, но искал более элегантное решение. – and0rsk

+0

Отредактировал вопрос, чтобы быть более понятным. «Как проверить, отвечает ли out.write на запрос пароля, представленный в команде su» – and0rsk

ответ

1

Команда su отменяет и возвращает ненулевой код выхода, если вы введете неправильный пароль.

Итак, вы просто проверяете, закрывается ли канал «exec» после ввода пароля. Если он закрывается, вы «ввели» неправильный пароль.

Если ввести правильный пароль, то su запускает оболочку и держит в ожидании команд (или выполнив команду, указанную в -c)


Обратите внимание, что su команда специально разработана не быть автоматизированы. Пытаться автоматизировать - это неправильно.

Правильный способы включают в себя:

  • с использованием пароля менее sudo команда ограничена одним сценарием для конкретной задачи
  • с использованием закрытого ключа для root пользователя ограничивается одним сценарием для конкретной задачи
+0

Закрыть, но я знаю, что пароль правильный. Благодарим вас за очистку исходного запроса и добавление ясности. Я больше беспокоюсь о подтверждении ввода времени для записи пароля (в out.write) происходит в правильном слоте (после подсказки). Команда su - это su -c, которая выполняет команды непосредственно после запроса пароля. Я хочу подтвердить, что при запросе пароль правильно настроен на выходной поток для запуска команды. Поэтому последовательность событий должна соответствовать первоначальной подсказке. – and0rsk

+0

Почему вы думаете, что вам нужно это время? Входные очереди до тех пор, пока это не понадобится. Я не думаю, что вам нужно это время. –

+0

Я считаю, что мне нужно «время», потому что моя команда работает без su, и я знаю, что правильный пароль вводится на моем локальном компьютере. Проблема возникает где-то при получении пароля su удаленно, и я думал, что он слишком рано ее извлекает. – and0rsk

Смежные вопросы