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コマンドで自動化プロセスを実行するだけでは問題を再現できません。
誰も問題を解決する方法を知っていますか?
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
内部サーバーの場合、ブラインドecho y | ...
トリックはおそらく適切です(そして非常にシンプルです)。
ただし、インターネット経由でアクセスする外部サーバーの場合、毎回盲目的に受け入れるのではなく、サーバーのホストキーを1回受け入れる方がはるかに安全です。
クライアントマシンで実行できる.regファイルを作成します。
plink ...
regedit
を開きますHKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
に移動しますrsa2@<port>:<address>
などの名前になります)クライアントマシンでホストキーをキャッシュする
plink
を実行するユーザーアカウントを使用してログインしてください(つまり、サービスアカウントの場合)ローカルシステムアカウントを使用するバッチスケジューラを使用しているときにも、この問題が発生しました。このアカウントでは、ホストキーを受け入れるためにログオンしたり、HKEY_CURRENT_USER
値。次のキーを作成していることがわかりました。
HKEY_USERS\.DEFAULT\Software\SimonTatham\PuTTY\SshHostkeys
ここにホスト文字列値を追加すると、ローカルシステムアカウントで機能しました。
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サーバーがキーを再計算する場合は、ホストキーを変更する必要があることに注意してください。
echo y | plink -ssh <username@remotemachine> -pw <password> exit
plink -ssh <username@remotemachine> -pw <password> [yourcommand]
説明:エコーにパイプを使用して、ユーザーは選択されたコマンドに「y」を入力して終了します。次のステートメントは、コマンドを実行するためにplink実行可能ファイルをもう一度呼び出します。
Bazaar を使用し、sshクライアントを組み込みのparamikoではなくPuTTYに手動で設定するときにこの問題が発生し、キーがあったと言っていたのとまったく同じ問題が発生していました「既知のホスト」ではなく、確認するかどうかを尋ねますが、通常の端末ではなく別のプログラムで実行されているため、すぐに終了しました。
可能な場合は、PuTTYを実行し、サーバーに手動で接続してレジストリにssh公開キーを保存するように手動で接続するだけで、自動化されたプログラムが接続しようとしたときにy/nオプションが表示されません。
または、PuTTYとopensshが使用する2つの「既知のホスト」形式間で変換するために作成した小さなpython3スクリプトを使用できます。 https://github.com/mgrandi/openssh-PuTTY-knownhost-converter =
`
コードによる解決: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ホストキーを受け入れてレジストリに保存します。
Windows PowerShellから管理モードで実行する
pscp -i /path/to/private_key source_file user@ip:/home/location