2013/01/28

【Cygwin】 Windows8からSSH接続する時のつまづきメモ!w


WindowsからUNIXなどにSSHするなら「Cygwin(mintty)」が良さそうということで、
先日購入した開発用のWindows8にCygwinを導入しました。

分かってしまえば簡単な事が多かったのですが、
今回もいろいろとつまづきがあったのでメモしたいと思います(;´∀`)

0.Windowsのユーザーフォルダ確認
Windows8はMSNアカウントでログインして使うことで、
SkyDriveやHotmailなどをローカルアプリの感覚で使えて便利なのですが、一点注意が!

Windows内部で扱う「ユーザー名」がMSNアカウントの「ユーザー名称」情報から作られるので、
ユーザーフォルダが記号になったり漢字になったりしてCygwinがうまく動作しないことがあります。

私の場合、内部でのユーザー名がハイフン「-」になってしまっていたので
Cygwin内でユーザーフォルダが作られなかったりと散々な目に‥(´・ω・`)

そういう面倒な事にならないよう、「C:\Users\(ユーザー名)」フォルダが半角英数になっていない方は、
以下の記事を参考にWindows内部でのユーザー名を修正される事をオススメします(`・ω・´)ゞ

 >> [Windows8]Windows 8インストール時の初期ユーザ作成における注意点

1.Cygwinをインストール
公式ページから「Setup.exe」を入手して実行します。(私が導入したのはVer.1.7.17)
基本デフォルトで良いですが、Gitとwgetは入れときましょうw


2.ターミナルを起動します
デスクトップにショートカットが出来るので起動します。
初回起動時の画面はこんな感じ。設定ファイルを自動で作ってくれたようです。
minttyベースのターミナルなので、以下の記事を参考に好きな見た目、フォントに調整しましょう。

 >> Windowsで最高のターミナルを構築する方法

Windows8ではminttyのTransparencyをGlassに設定しても綺麗にならなかったので、Highに設定しております(´・ω・`)

3.apt-cygをインストール
Linuxのaptみたいにアプリを探してインストール出来る仕組みをCygwin上に入れます。
wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg 
mv apt-cyg  /usr/bin
chmod +x /usr/bin/apt-cyg

SSHコマンドを使うためにopenssh、対話型のコマンド処理を自動化するexpectも入れましょうw
apt-cyg install openssh
apt-cyg install expect

ついでにncursesも入れちゃいましょうw Cygwinのbashからclearコマンドが使えるようになりますww
apt-cyg install ncurses

4.「.ssh」フォルダに秘密鍵を配置
homeのユーザーフォルダ内に「.ssh」フォルダを作ります。
Windowsのエクスプローラ上ではピリオドで始まるフォルダは作れないのでコマンドでいきましょう!
mkdir ~/.ssh/

そこにSSH接続用の秘密鍵を置きます。(id_rsa_t2wonderlandなど)

5.configファイルを作成
ホスト情報を事前にconfigファイルに記述しておくことで、SSH接続時に入力する情報を減らせます。
Host t2wonderland
HostName t2wonderland.co.jp
UserName Homura
IdentityFile ~/.ssh/id_rsa_t2wonderland

これを「C:\Users\(ユーザー名)\.ssh」フォルダに置きます。

6.「.ssh」フォルダ以下にアクセス権を設定
なぜかWindows8上のCygwin(Ver.1.7.17)では、アクセス権限を変更するchmodコマンドが効きません。
海外フォーラムの情報によると「所有者が設定されてないからアクセス権が設定されない」とのこと。

 >> Using Cygwin in Windows 8, chmod 600 does not work as expected?

という訳でまず、所有者を設定します。
chgrp -R Users ~/.ssh/

次にアクセス権限を設定します。
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/*

するとこんな感じでアクセス権限が設定出来ました!

7.接続してみましょう
それでは、SSH接続してみましょう!
ssh t2wonderland
パスフレーズをきかれたら入力!これでSSH接続出来るはずです(`・ω・´)

毎回パスフレーズ入力するの面倒だなぁ・・という私のような方は、以下のスクリプトを作っておくと便利ですw
#!/usr/bin/expect

set host (host)
set pass (password)
set timeout -5

spawn ssh $host
expect "Enter passphrase for key"
send "$pass\r"
interact
(host)と(password)はご自身の設定に合わせて書き換えて下さい。
expectを使った以上のような接続自動化処理を「t2wonderland.sh」ファイルに保存して、
./t2wonderland.sh
として実行することで接続できます。便利!(∩´∀`)∩

困ったときは
Q.なんか、expectを使ったスクリプトを実行すると「child_info_fork::abort」みたいなエラーが出て頻繁に失敗するよ?(´・ω・`)
A.以下の記事を参考に、ash.exeツールから「/bin/rebaseall」を実行すると解消するかも!(`・ω・´)
  うちのWindows8のCygwin環境では、この方法で問題起きなくなりましたw

 >> Windows Vista/7でのX Window System起動不安定の解消

Q.「Bad owner or permissions on /.ssh/config」みたいなエラーが出て、SSH接続できないよ?(´・ω・`)
A.ファイルやフォルダの所有者が「Administrators」のように、ユーザーグループになっているとこの症状が出るようです。
  別のPC環境にCygwinフォルダを丸ごとコピーして使おうとしたらこの問題に遭遇しました・・・。
  以下の記事を参考に「chown  ユーザー名 .ssh/*」を実行することで解決出来ました!(`・ω・´)

 >> Cygwinのsshでbad owner or permissions on /.ssh/configとか言われる

参考文献
今回も多くの方の素敵な記事に助けていただきました!
この場をお借りして、お礼申し上げます。


※2013/01/29: expectの導入とそれを使った自動接続方法を追記しました。
※2013/02/02: expectを使ったスクリプトの内容を変更し、「困ったときは」に追記しました。
※2014/03/05: 「Bad owner or permissions」エラーに関する対処法を、「困ったときは」に追記しました。