ssh-copy-id for windows 作ったよー

linuxには ssh-copy-id っていう便利なコマンドがあってキーをリモートのサーバに簡単にコピーしてくれます。
だけど、windowsにはそんな便利なコマンドが何故か無いので、作ってみました。

ダウンロード
http://rtilabs.net/files/2010_01_01/ssh-copy-id-windows.bat

使い方。
まずは、OpenSSH for windowsをインストール。

何も考えずにこのプログラム(バッチ)を実行

途中で聞かれる質問に適当に答えるw

おしまいw

超簡単。

後は、貴方が好きなsshクライアントで鍵を使ってログインしましょう。

ディフォルトだと鍵は、C:\Documents and Settings\rti\.ssh みたいな所に作られます。
一応、OpenSSH for Windowsの標準の場所です。

後はこの鍵を使って、TeratermTortoiseSVN などで楽しい鍵認証ライフを過ごしましょう。

ソース

@echo off
echo sshキー設定プログラム by rti

:step0
rem "OpenSSH for windowsがインストールされているかチェック"
ssh -v 2> NUL
if not %ERRORLEVEL% == 1 goto ssh_not_found

:step1
rem ".sshディレクトリがあるかどうかチェック。ないなら作成する"
if NOT EXIST "%USERPROFILE%\.ssh" goto make_ssh_directory

:step2
rem "rsaキーが有るかどうかチェック。ないなら作成する"
if NOT EXIST "%USERPROFILE%\.ssh\id_rsa.pub" goto make_ssh_keygen

:step3
rem "鍵を転送するサーバ名とユーザ名を聞く"
echo.
echo 1.sshキーを登録するサーバ名/IPアドレスを入力してください。
set /p SSH_SERVERNAME="サーバ名>"
echo 2.ユーザ名を入力してください。 何も入れないと現在のユーザ名 %USERNAME% になります。
set /p SSH_USERNAME="ユーザ名>"
if "%SSH_USERNAME%" == "" set SSH_USERNAME="%USERNAME%"

:step4
rem "既に鍵を転送していないか確認する"
echo.
echo なにかキーを押すと、%SSH_USERNAME%@%SSH_SERVERNAME% サーバにsshでログインしキーを登録します。
pause
ssh  -o PreferredAuthentications=publickey %SSH_USERNAME%@%SSH_SERVERNAME% "exit 72"
if %ERRORLEVEL% == 72 goto ssh_already_keyauth

:step5
rem "鍵を転送する"
echo.
type "%USERPROFILE%\.ssh\id_rsa.pub" | ssh %SSH_USERNAME%@%SSH_SERVERNAME% "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys ; exit 72"
if not %ERRORLEVEL% == 72 goto ssh_keycopy_error

:step6
rem "転送でできたか確認する"
echo.
echo 試しにキー認証でログインしてみます。
ssh  -vvv -o PreferredAuthentications=publickey %SSH_USERNAME%@%SSH_SERVERNAME% "exit 72" 2> "%TEMP%\\ssh-copy-id-rti-temp.txt"
if not %ERRORLEVEL% == 72 goto ssh_loginerror
del "%TEMP%\\ssh-copy-id-rti-temp.txt"

:step7
rem "おしまい"
echo.
echo OK.キー認証が完了しました。
echo 何かキーを押すと終了します。
pause
exit 1

:ssh_already_keyauth
echo.
echo あれ?もうすでにキー認証できますよ。
echo 何かキーを押すと終了します。
pause
exit 1

:ssh_loginerror
echo.
echo キー認証でログインできませんでした。
echo サーバの設定がおかしいのかな?
echo 以下詳細なエラーフロー
type "%TEMP%\\ssh-copy-id-rti-temp.txt"
del "%TEMP%\\ssh-copy-id-rti-temp.txt"
echo なにかキーを押すと、キーコピーからやり直します
pause
goto step3


:ssh_keycopy_error
echo.
echo sshキーをコピーできませんでした。。。
echo サーバ名やユーザー名は間違っていませんか?
echo なにかキーを押すともう一度やります
pause
goto step3

:make_ssh_directory
echo.
mkdir "%USERPROFILE%\.ssh"
goto step1

:make_ssh_keygen
echo.
echo sshキー(rsa)が見つかりません。
echo 何かキーを押すと、ssh-keygenを起動してsshキーを作成します
pause
cd %USERPROFILE%\.ssh
echo ノンパスでやりたい人はenterキーを3回連打してくださいwww
echo.
ssh-keygen -t rsa
goto step2

:ssh_not_found
echo.
echo ssh not found.
echo OpenSSHをインストールして下さい
pause
exit 1

ライセンス
NYSLでご自由に

72
unsigned char の範囲で他と重複しなさそうな数字を考えたらなぜか72になった。
http://dic.nicovideo.jp/a/72


バグとか要望とかはお気軽にどうぞ