su
の下にあるサーバーでリモートでコマンドを実行しようとしています。具体的には、リモートで実行しています。"su"コマンドに提供されたパスワードがJSchライブラリで補完されているかどうかをテストします
su -c '[command]'
これはリモートサーバーにログインしているときに機能します。
私の質問はうまくいけばかなり簡単です:out.write
がsu
コマンドで提供されたパスワードプロンプトに返信しているかどうかを確認するにはどうすればよいですか?チャンネルが接続されているように見え、プログラムはsu
が関与していない限り動作するように見えます。
理想的動作のシーケンスである:初期化
リモートコマンド - パスワードの>プロンプト - リモート>入力されたパスワード[不良点] - >コマンドを
を実行これはsu
なければなりません。 sudo
にはできません。
- http://www.jcraft.com/jsch/examples/Sudo.java.htmlと
- https://sourceforge.net/p/jsch/mailman/message/25119880/
ホープスこれは、同様の問題を誰にも役立ちます
/**
* 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();
}
私はから重く借りてきました!
*パスワードを出力ストリームに書き込むにはどうすればよいですか?* - それはどういう意味ですか? –
この行には: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