Я пытаюсь выполнить команды удаленно на сервере под 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();
}
я почерпнул из:
- http://www.jcraft.com/jsch/examples/Sudo.java.html и
- https://sourceforge.net/p/jsch/mailman/message/25119880/
надеется, что это поможет кто-нибудь с подобной проблемой!
* Как обеспечить, чтобы я записывал в выходной поток пароль? * - Что это значит? –
На этой строке: out.write ((sudo_pass + "\ n"). GetBytes()); // пишем пароль по подсказке, я считаю, что в этом письме вводится пароль su.Проблема в том, что, хотя это решение работает для http://www.jcraft.com/jsch/examples/Sudo.java.html, «su» не имеет опции -p, и я не верю, что функция out.write на самом деле вводит пароль после запроса. Я рассматривал сценарии ожидания, но искал более элегантное решение. – and0rsk
Отредактировал вопрос, чтобы быть более понятным. «Как проверить, отвечает ли out.write на запрос пароля, представленный в команде su» – and0rsk