expectでssh自動接続

実はMacのネタですがLinux枠でw

普段使うノートがMacになったので急に障害連絡が来た時にメンテ可能な端末はMacしかない。でもBSDベースなので親和性が高く楽にできると何もせず構えてたら結構面倒だったw
これまではTeratermのマクロを準備していて例えば10台のサーバに一気にログインする必要があったりするときマクロファイルをダブルクリックでガンガンログインしていたのだが、MacにはTeratermないし同様の機能をどうするかなっと検索。
#!/usr/bin/expect
set timeout 1
spawn ssh root@192.168.56.101
expect “password: “
send “111111n”
expect “[.*]$ “
send “ls -ln”
expect “[.*]$ “
interact
結論としてexpectを利用してsshと対話してしまえば良い事が分かった。これならLinux上でもそのまま使える。但し二段階ログインした上でその先での操作が出来るかどうかについては確認していないが無理そうな気がする。
これはシェルスクリプトな感覚で作成します。違いは一行目にshではなくexpectを定義している点とその後のコマンド送信がteratermマクロっぽい感じになっていること(多分expectの方が先だと思いますがw)
spawnの行でsshコマンドを書き秘密鍵を利用するならここにオプションも一緒に書けば良いと思う(秘密鍵を使う場合はパスワード暗記しているケースが多いのでexpectの世話にはなり難いと思うが)
expectは待ち受ける文字列、ここではpassword: とプロンプトを待っている記述がある。
そしてsendがターミナルに送信するコマンドです。
最後のinteractはログインしたままの状態で終了するおまじない。これが無いとSSH接続を終了するので用途によって付けたり付けなかったりします。

サーバのIPアドレス入れ換えた時のSSH再接続

 サーバーのIPアドレスを入れ換えるなんて普段は無いのですが、ハードウェア障害によるサーバ交換を行った時に気をつけなければならないのはSSHが弾かれてしまうこと。
Windowsクライアントならサーバが代わろうが警告が出ようが新しいキーを上書きして続行できるのですがLinux同士だと、一旦known_hostsの情報を削除する必要がありました。
で、これだけknown_hosts自体を削除しそうですが、SSHの接続先が複数あるときは後でknown_hostsを再生成する手間が掛かるので、該当行だけを削除します。
viでdd打てばそれで終わりですが、もっと安全な方法が無いかと探したらありました。
参考:
OpenSSH : WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

http://futuremix.org/2007/08/openssh-warning

ssh-keygen -F [IPアドレス]
で検索して
ssh-keygen -R [IPアドレス]
で削除
これは簡単。