2

私はJavaにかなり慣れていないので、Javaを使用してWindowsコマンドでSSHを実行したいと考えています。

ここに私が作成したコードがあります、

Process pr1 = Runtime.getRuntime().exec("cmd /k" + "ssh root@host" + "&&" + "passwd" );
Process pr = Runtime.getRuntime().exec("ls");
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line=null;

while((line=input.readLine()) != null)
    System.out.println(line);

私はいつもエラーを与えられました:

java.io.IOException: プログラム "ls" を実行できません: CreateProcess エラー = 2、指定されたファイルが見つかりません

誰でもこれについて私を助けることができますか?

4

5 に答える 5

2

実際には非常に簡単に答えることができます。問題は、SSH コマンドを実行してlsから、Windows コンソールに (SSH 経由ではなく) 送信される別のコマンドを実行することです。Windows には ls コマンドがありません。

ProcessSSHコマンドのexecによって返されたに送信する必要があります。結果のプロセスを保存し、そのプロセスを取得しOutputStreamてそこにコマンドを書き込むことで実行できます。もちろん、それを使用しInputStreamて結果を取得する必要があります。2番目exec()はまったく存在しないはずです。

于 2012-09-14T18:33:58.787 に答える
1

Runtime.exec を気にせず、Apache Commons Execを使用してください。それをあなたの質問に適用すると、次のようになります。

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
CommandLine pr1 = CommandLine.parse("cmd /k" + "ssh root@host" + "&&" + "passwd");
CommandLine pr = CommandLine.parse("ls");
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);

int exitValue = executor.execute(pr1);
exitValue = executor.execute(pr);
于 2012-09-14T18:31:36.547 に答える
0

プロセスの標準入力に書き込みたい。

pr.getOutputStream().write("ls\n".getBytes());
于 2012-09-14T18:35:17.750 に答える
0

https://github.com/zeroturnaround/zt-execを使用してください。Apache Commons Exec には多くの欠点があり、それを正しく行うにはかなり多くのコードが必要です。すべてがここで説明されています: https://zeroturnaround.com/rebellabs/why-we-created-yaplj-yet-another-process-library-for-Java/

于 2018-03-11T06:20:07.023 に答える
0

JSch使用(または他の Java SSH 実装)とは別に、環境変数を介してパスを渡すことはおそらく機能しません。ほとんどの SSH デーモンは反対側からの変数の小さなセットしか受け入れないためです (主にローカリゼーションまたは端末タイプに関連する)。

ssh (または、ChannelExec で JSch を使用する場合は「コマンド」) への引数がリモート シェルに渡されて実行されるため、このコマンドでパスを定義することができます (デフォルトのシェルが POSIX sh と互換性のあるものである場合)。 ):

PATH=path_needed_toRun_myProg /absPathToMyProg/myProg

したがって、Runtime.exec の配列は次のようになります。

String[] cmd = {"/usr/bin/ssh", "someRemoteMachine",
                "PATH=path_needed_toRun_myProg /absPathToMyProg/myProg"};

Runtime.exec を使用するのが難しくない場合は、Apache の Exec ライブラリを試してください...

このリンクを参照してください:

http://commons.apache.org/exec/

于 2012-09-14T18:32:11.507 に答える