web-dev-qa-db-ja.com

Hudsonでスクリプトを実行すると、Puttyはサーバーにアクセスするためのキーをキャッシュしません

LinuxサーバーからWindowsにSSH経由でいくつかのファイルをコピーするために必要な簡単な自動化プロセスがありました。これはPuTTYを使用して実現できます。

プロトコルの一部としてのSSHは、ホストのIDを検証し、正しいことがわからない場合は、ホストのIDを受け入れるように求めます。 LinuxサーバーをPuTTYに手動で接続すると、ホストのIDを受け入れるための情報を要求しません。しかし、この自動化プロセスをスケジュールジョブとしてHudsonに投入すると、正確なメッセージは次のとおりです。

サーバーのホストキーはレジストリにキャッシュされません。サーバーがあなたが考えているコンピューターであるという保証はありません。サーバーのrsa2キーフィンガープリントは次のとおりです。ssh-rsa 1024 cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9このホストを信頼する場合は、「 y "を使用してキーをPuTTYのキャッシュに追加し、接続を続けます。キーをキャッシュに追加せずに、一度だけ接続を続けたい場合は、「n」を入力します。このホストを信頼しない場合は、Returnキーを押して接続を中止します。キーをキャッシュに保存しますか? (y/n)放棄された接続。

通常、ホストキーが正しいと仮定して、将来の接続で保存するために、ここで「Y」を押します。このストレージは、HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeysの下のレジストリに保存されます

しかし、残念ながら、Hudsonで実行されている自動化プロセスは、「Y」を押してホストキーをPuTTYキャッシュに保存することで対話を行うことができません。また、DOSコマンドで自動化プロセスを実行するだけでは問題を再現できません。

誰も問題を解決する方法を知っていますか?

35
Charlotte Xu
echo y | pscp -i /path/to/key/file user@remote:/tmp/file  .
echo y | plink -i /path/to/key/file scripts.sh

最初にホストキーの指紋を次の場所に保存し、次回は「y」を無視します

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
40
Jay

内部サーバーの場合、ブラインドecho y | ...トリックはおそらく適切です(そして非常にシンプルです)。

ただし、インターネット経由でアクセスする外部サーバーの場合、毎回盲目的に受け入れるのではなく、サーバーのホストキーを1回受け入れる方がはるかに安全です。


クライアントマシンで実行できる.regファイルを作成します。

  • 任意のマシンからインタラクティブに接続しますplink ...
  • ホストキーを確認して受け入れます
  • regeditを開きます
  • HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeysに移動します
  • エントリを右クリックします(rsa2@<port>:<address>などの名前になります)
  • .regファイルにエクスポート

クライアントマシンでホストキーをキャッシュする

  • そのサーバーに接続するクライアントマシンで.regファイルを実行します
  • plinkを実行するユーザーアカウントを使用してログインしてください(つまり、サービスアカウントの場合)
18
Clay

ローカルシステムアカウントを使用するバッチスケジューラを使用しているときにも、この問題が発生しました。このアカウントでは、ホストキーを受け入れるためにログオンしたり、HKEY_CURRENT_USER値。次のキーを作成していることがわかりました。

HKEY_USERS\.DEFAULT\Software\SimonTatham\PuTTY\SshHostkeys

ここにホスト文字列値を追加すると、ローカルシステムアカウントで機能しました。

15
Toby Vinnell

2014年9月9日の時点で、対応するバージョンのplink(plink 0.66でテスト済み)では、ここに記載されているように、-hostkeyオプションを使用できます。

http://www.chiark.greenend.org.uk/~sgtatham/PuTTY/wishlist/accept-Host-keys.html

元の質問でキーを使用する:

plink -hostkey cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9 user@remote 

最初のホストキープロンプトの問題を回避するために、スクリプトで「-hostkey」を使用しました。

「-hostkey」もpscp(バージョン0.66)で動作するように文書化されています。

ホストを変更するか、sshdサーバーがキーを再計算する場合は、ホストキーを変更する必要があることに注意してください。

9
Stephen Rondeau
echo y | plink -ssh <username@remotemachine> -pw <password> exit
plink -ssh <username@remotemachine> -pw <password> [yourcommand]

説明:エコーにパイプを使用して、ユーザーは選択されたコマンドに「y」を入力して終了します。次のステートメントは、コマンドを実行するためにplink実行可能ファイルをもう一度呼び出します。

6
Sumit Gupta

Bazaar を使用し、sshクライアントを組み込みのparamikoではなくPuTTYに手動で設定するときにこの問題が発生し、キーがあったと言っていたのとまったく同じ問題が発生していました「既知のホスト」ではなく、確認するかどうかを尋ねますが、通常の端末ではなく別のプログラムで実行されているため、すぐに終了しました。

可能な場合は、PuTTYを実行し、サーバーに手動で接続してレジストリにssh公開キーを保存するように手動で接続するだけで、自動化されたプログラムが接続しようとしたときにy/nオプションが表示されません。

または、PuTTYとopensshが使用する2つの「既知のホスト」形式間で変換するために作成した小さなpython3スクリプトを使用できます。 https://github.com/mgrandi/openssh-PuTTY-knownhost-converter =

`

4
mgrandi

コードによる解決:PuTTY/plinkをコンパイルして、sshキーを自動的に受け入れて保存します

SSHのホストキーをキャッシュに保存するよう求められます。ユーザーアカウントはplinkを実行するため、レジストリにホストがありません。応答を待機するため(yes/no ..)、ハングします。
コードでこれを解決する場合は、PuTTYソースコードを取得し、変更を加え、コンパイルして、プロンプトなしでsshホストキーを保存する新しいplinkバイナリを使用します。
どうやってするの ? Windowsの場合、次のことを行います。

  • 以下から最新のPuTTYソースコードをダウンロードします。 https://www.chiark.greenend.org.uk/~sgtatham/PuTTY/latest.html
    (「ソースコード」セクションを探し、「Windowsソースアーカイブ」をダウンロードします)
    注意:Visual StudioでPuTTYソースコードを開くには、リリースバージョンをダウンロードする必要があります、特定のコミット(またはヘッド)にチェックアウトした場合、Visual Studioソリューションファイルはビルド中に作成されるため存在しません。
    取得元: Windows/MSVCサブディレクトリがないため、WindowsでPuTTY、Plink、またはPscpをコンパイルできません

  • ソースコードを更新する必要があります。変更するものは、「wincons.c」の関数verify_ssh_Host_key(..)にあります。yes/ noを要求するコードの一部をコメント化し、キーを保存するだけです。プロンプトコードをコメントアウトして:

    /*hin = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hin, &savemode);
    SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT |
             ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT));
    ReadFile(hin, line, sizeof(line) - 1, &i, NULL);
    SetConsoleMode(hin, savemode);
    
    if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') {
    if (line[0] == 'y' || line[0] == 'Y')
    store_Host_key(Host, port, keytype, keystr);
    return 1;
    } else {
      fprintf(stderr, abandoned);
      return 0;
    }*/  
    

代わりに、次の行の追加を続けます(ホストキーの保存を担当するコード):

store_Host_key(Host, port, keytype, keystr);
return 1;

ソリューションをコンパイルし、plink/pscpを実行します。プロンプトなしで実行できます。sshホストキーを受け入れてレジストリに保存します。

1
ilansch

Windows PowerShellから管理モードで実行する

pscp -i /path/to/private_key source_file user@ip:/home/location