5

私の質問はここで尋ねられたものに似ています: Antscpタスクの失敗

ビルドに失敗しましたcom.jcraft.jsch.JSchException:HostKeyを拒否します:...。

私の質問は、knowedhostsファイルにキーが見つからないのはなぜですか?

私が持っているknown_hostsファイルの種類に関係なく、ホストキーは拒否されます。sshを介した接続は完全に正常に機能し、関連するエントリを追加しますが、OpenSSHによって生成されたファイルjschを読み取ることができない可能性がありますか?known_hosts

Antのドキュメントには、knownhostsファイルはSSH1ではなくSSH2形式である必要があると記載されています。皮肉なことに、OpenSSHのSSH2形式のknown_hostsファイルはであると想定されてい~/.ssh/known_hosts2ますが、knownhostsのデフォルト値はです~/.ssh/known_hosts

SSH2によって作成された既知のhostsファイルはに~/.ssh2/knownhosts/あるので、予想される形式でそれを数えるのはおそらく安全です。これまでのところ、OpenSSHにknown_hosts2ファイルを作成させることができず、マニュアルページもあまり役に立ちません。では、ドキュメントは、ファイルがSSH2形式である必要があることを実際に何を意味しているのでしょうか。

私はキーを試しましたがdsarsaどちらも機能しません(どちらもOpenSSHで機能します)。

私は2日間検索しましたが、見つけた答えは' set trust="true'だけです。はい、それでタスクは機能しますが、セキュリティに目をつぶることなくしてはなりません。

4

3 に答える 3

2

jchのより新しいバージョンで動作することがわかったフォーマットは次のとおりです。

[xx.xx.xx.xx]:22 ssh-rsa .......

古いバージョンでは、次のようになりました。

xx.xx.xx.xx ssh-rsa ......

つまり、角かっこやポート番号はありません。(ポート22を使用している場合、ポート番号が必要かどうかはわかりませんが、SSHにデフォルト以外のポートが割り当てられているサーバーでテストしました。不明な場合xx.xx.xx.xxは、サーバーのIPアドレスにする必要があります。 、またはホスト名など。)

JCraft / jschライブラリを取得してknown_hostsファイルを生成することで、この形式を見つけました。www.jcraft.comにアクセスすると、jschソースコードのzipといくつかの例をダウンロードできます。ソースをビルドしてjarを作成するか、既製のjarもダウンロードします。zipダウンロードを解凍してから、同じディレクトリにjarファイルを配置しました。

examplesを含むフォルダがありますKnownHosts.java。そのファイルをコンパイルして実行する必要があります-known_hostsファイルを要求されます(最初にデフォルトの場所に空のファイルを作成し(~/.ssh/known_hosts)、それを選択します。次に、サーバーに接続するための詳細を要求します。 。たとえばsshusername@xx.xx.xx.xx、これらを入力すると、プログラムは接続を試みてから、known_hostsファイルに入力します。

コマンドラインから何かを行う方法を思い出せない私のようなWindowsユーザーを大失敗させるために、そのKnownHosts.javaファイルをコンパイルして実行するために必要なものは次のとおりです。

まず、ディレクトリに移動します(上記で説明したように、解凍してjarファイルを中に入れます)。

次に、以下を実行します。

javac -cp jsch-0.1.49.jar examples/KnownHosts.java

KnowHosts.javaをコンパイルします。その後:

java -cp "examples;jsch-0.1.49.jar" KnownHosts

それを実行します。上記の手順に従うと、known_hostsファイルが機能しているはずです。

最後に、KnownHostsプログラムは22のポートを想定しています。sshusername@xx.xx.xx.xx:8888カスタムポートを使用してサーバーを指定し、上記のように機能させることができるように編集しました。KnowHosts.javaのソースで、次のような行を探しました。

Session session=jsch.getSession(user, host, 22);

そしてそれを次のように置き換えました:

int port = 22;
final int colonIndex = host.indexOf(':');
if (colonIndex > -1) {
    final String[] split = host.split(":");
    host = split[0];
    port = Integer.parseInt(split[1]);
}
Session session=jsch.getSession(user, host, port);

次に、上記のようにコンパイルして実行しました。

于 2013-02-22T19:03:21.113 に答える
1

sshexec antタスクは、デフォルトで${user.home}/。ssh/known_hostsのファイル'known_hosts'を探しています。

'user.home'システムプロパティの値を確認します。おそらくそれは思いもよらない場所を指しています。または、antタスクのプロパティで「knownhosts」値を明示的に指定します。

于 2012-12-21T17:16:58.123 に答える
0

興味があるかもしれない2つのパラメータがあります:

  • trusttrueに設定すると、不明なホストが信頼されます。デフォルトはfalseに設定されています。
  • knownhosts既知のhostsファイルの場所に設定します。

1つ目は、既知のホストであるかどうかをチェックしないようにタスクを設定できるようにします。2つ目は、既知のホストを含​​むファイルを指定できるようにします。${user.home}/.ssh/known_hosts2このように、それをとして指定し、デフォルトをオーバーライドすることができます。

ちなみに、これを行う良い方法は、これらの値のプロパティを使用してから、プロパティファイルを使用してこれらのプロパティをオーバーライドすることです。

[...]
<property name="build.properties" value="build.properties"/>
<property file="${build.properties}"/>

<!-- Can be overridden via 'build.properies' file -->
<property name="knownhosts.file" value="${user.home}/.ssh/knownhosts"/>

<property name="remote.host" value="foo-system"/>
[...]

    <scp file="${copy.this.file}"
       todir="${user}@{host}:${remote.dir}"
       knownhosts="${knownhosts.file}"/>
[...]
于 2012-12-21T17:52:32.003 に答える