2011/02/17
ssh
ssh (1) コマンドは接続先のホスト情報をローカルに保存していて、 接続するたびに接続先が正しいホストかを確認する機能を持っている。 これはホスト名の詐称や DNS poisoning などにより 正しくない接続先に接続してしまうという事態を防止するためには 非常に便利で有用な機能ではあるが、 接続先のシステムが再インストールなどでホスト情報が変更になってしまった場合、 ssh で接続しようとすると
$ ssh ホスト名 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX. Please contact your system administrator. Add correct host key in /home/ユーザ/.ssh/known_hosts to get rid of this message. Offending key in /home/ユーザ/.ssh/known_hosts:NN RSA host key for ホスト名 has changed and you have requested strict checking. Host key verification failed. $などと表示されて接続できなくなってしまう。
画面に表示された通り known_hosts ファイルの該当行を削除すれば 再度接続できるのだが、 これを自動で行うためのスクリプトを作成してみた。
1#!/bin/sh 2cat << EOF | ex -s ${HOME}/.ssh/known_hosts 3`ssh $* 2>&1 | sed -n '/^Offending key/s/.*:\(.*\)/\1/p' | tr -d '\r'`d 4wq 5EOFPATH の通ったディレクトリに sshfix の様な名前で保存し 実行権限を付与しておくと、 ssh で接続を試みて上記エラーが発生した際に実行する事で known_host の該当行を削除するので再度接続できる様になる。
$ ssh ホスト名 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!</i> : $ sshfix !$ $ ssh !$くれぐれも本当に正しい接続先か確認してから利用しなければならない。
2011/02/12
シェルスクリプト自身のパス取得
シェルスクリプトを作成していて、
たまにスクリプト自身のパスを取得したい場合がある。
以下の処理でシェルの種類に依存せず(とは言っても bourne shell 系のみだが)
シェルスクリプト自身のパスを取得する事ができる筈(多分)。
PATH 環境変数に従って実行された場合は
${0} にスクリプトの絶対パスが格納されているので
${0} の dirname (1) を取得すれば良いが、
相対パス指定で実行された場合は 1度 cd (1) した上で
pwd (1) を実行してカレントディレクトリを取得する必要がある。
すべてのケースで
"( cd ${0%/*} `dirname ${0}` && pwd )"
しても同じ結果を得られるのだが、
サブシェルの実行や特に pwd (1) の実行はシステムに負荷をかけるので、
効率を考え ${0} の値を確認している。
expr (1) の実行も結構負荷がかかるからあまり意味ないかな…
1#!/bin/sh 2# ${0} の dirname を取得 3# cwd=${0%/*} 4cwd=`dirname ${0}` 5 6# ${0} が 相対パスの場合は cd して pwd を取得 7expr ${0} : "/.*" > /dev/null || cwd=`(cd ${cwd} && pwd)` 8 :
2011/03/17 追記
$ sh fooこの様に実行された場合 ${0} には foo が 格納されているので ${0%/*} では foo に展開されてしまい cd (1) がエラーとなる問題があったので、 dirname (1) を利用する様修正しました。
2011/02/10
2011/02/09
ファイル暗号化/復号化 wrapper スクリプト
openssl (1) を実行してファイルを暗号化/復号化する処理を
簡易実行するための簡単な
シェルスクリプトによる wrapper
を作成した。
暗号化/復号化は openssl (1) の enc コマンドに
暗号化アルゴリズムに aes-128-cbc を指定して実施している。
指定されたファイルの先頭 8 バイトを参照して
Salted__ の場合は暗号化されていると仮定し復号化、
それ以外は暗号化する処理をデフォルトで実行するが、
実行時オプション -d、-e を指定する事で
強制的に暗号化/復号化を指定する事も可能だ。
-p オプションでパスワードを指定してバッチ処理も実行できるが、
コマンド実行履歴等にパスワードが残るのでお勧めできない。
暗号化/復号化が成功した場合は元のファイルを置き換える。
例によって必要に迫られれて適当に作成したスクリプトなので このスクリプトを利用した事で生じるあらゆる損害に対して責は負えない。
2011/02/07
HyperMac
アメリカの eBay オークションで落札した HyperMac キットが届いた。
HyperMac は MacBook などに電源を供給し充電も可能な外部バッテリーだが、
MagSafe という Apple が特許を持っているコネクタの利用に関する問題で
昨年 11月2日 をもって発売を中止してしまっていた。
現在は Apple 純正の Airline アダプタを経由する事で利用するタイプを
発売している様だが、
Airline アダプタとのコネクタが巨大で不格好、
しかも充電ができない等 HyperMac の特徴を全く活かせていないので却下。
当然新品は入手できないので国内外のオークションなどに
出品されるのを待っていたのだが、
今回 eBay オークションに 150Wh の HyperMac が出品されたので、
本当は一番小型の 60Wh のモノが欲しかったのだが
この機会を逃すと又当面入手できない可能性もあると思い落札した。
eBay の出品者はアメリカ国内への発送しか受け付けていなかったので、 今回はアメリカ国内の転送業者を経由して日本に転送してもらった。 アメリカ国内への送料は出品者負担だったので、 転送業者による日本への転送送料+関税+手数料が余計にかかった費用だが、 転送業者の手数料は $7 だったのでそれほど悪くないだろう。
単語の羅列に近いほんのちょっとの英語力とPayPal アカウント、 それから多少の度胸があれば 日本では滅多に入手できないものを手に入れる事が出来てしまう とっても便利な世の中だ。
2011/02/01
Magic Mouse のスクロール
職場の iMac では Apple 純正の Magic Mouse を利用している。
BetterTouchTool と合わせて非常に便利に使っているのだが、
google map を利用している時などに不用意にスクロールしてしまい
敏感すぎるセンサーが却って邪魔になってしまう事がある。
Safari 用には google map を表示している時に
Magic Mouse のスクロールをオフにするという機能拡張を見つけたが、
普段愛用している firefox には同じ機能を持つアドオンを探せなかった。
かといって firefox のアドオンは自作した事がないので勝手もわからない。
丁度、某有名匿名掲示板で環境設定パネルのユニバーサルアクセスを
automater を利用して操作するという話題が出ていたので、
投稿されていたソースコードを参考にしながら簡単なスクリプトを作って見た。
automater を起動してアプリケーションのテンプレートを選択、 AppleScript を実行で表示されるエディタに以下のコードを貼り付けて、 アプリケーションとして保存すれば実行できる様になる。 実行するたびに Magic Mouse のスクロールオン・オフがトグルされるので、 ショートカットを Dock に登録したり Butler などのランチャから起動すると便利だと思う。
1tell application "System Preferences" 2 activate 3 set current pane to pane "com.apple.preference.mouse" 4end tell 5 6tell application "System Events" 7 tell process "System Preferences" 8 tell window 1 9 tell group 1 10 click checkbox "スクロール" 11 end tell 12 end tell 13 end tell 14end tell 15 16tell application "System Preferences" to quit
automater や AppleScript を書いたのは初めてで仕様も良く把握していないので、 無駄な処理やおかしな記述があるかも知れない。 おかしな部分があれば是非指摘して頂けるとありがたい。 なお、 個人的に適当に作ったスクリプトなので他の環境での動作は保証できないし、 勿論このスクリプトを利用した事で生じるあらゆる損害に対して責は負えない。
2011/01/31
2011/01/22
温泉ツーリング to 南伊豆
週末を利用して友人と南伊豆の温泉に一泊で
ツーリング
してきた。
勿論、バイクは反社会的な 2 ストローク 2 台(しつこい)。
まずは定番の東名高速海老名でお茶休憩。
日頃の行いの良さを象徴するかの様に気持ちよく晴れ渡った青空の向こうには
雪化粧した富士山もくっきり綺麗によく見える。
そのまま小田原厚木〜西湘バイパスを経由して海沿いの国道 135 号線へ。
1 月という事もあり、とりあえず往路は比較的温暖な海沿いを
南下するという軟弱コースを選択したので、
渋滞にもめげずにひたすら南下南下南下…。
東伊豆の海沿い、特に日頃の行いの良さを象徴するかの様な
(大事な事なので2回…ry)天気の良い午前中は海面にキラキラと反射する
太陽の光がとても綺麗で抜群の眺望ではあるのだが、
単調すぎて若干物足りなさを感じてしまう部分は否めない。
まぁ、軟弱コースを主張した張本人なので文句は言うまい(言えない)。
昼食は稲取の「徳造丸」という網元料理のお店で海鮮丼を堪能。
普段は行列したり待ったりしてまで食事をする方ではないのだが、
ここは多少待ってでも食べる価値はあった。
生しらす、生桜エビ、生ぼたんえびなどがふんだんに載っている
ここのお店の海鮮丼は量もおいしさも大満足。
食事の後は再度単調な道を延々と南下…
イチ押しでお勧めされた外浦海岸にある「万宝」という干物屋さんでは干物を物色。
たしかにとても美味しそうな干物が沢山並んでいる。
バイクだと大きな荷物が運べないのだが、
宅配便で送ることにしたので美味しそうな干物を際限なく買ってしまう。
そうこうしているうちに無事に宿に到着。
古民家の宿というだけあって見た目も古びてて良い感じ
予定よりは相当早く到着したので、 のんびりと露天風呂につかりながら疲れをほぐしていると食事の時間。
格安プランだったのであまり期待をしていなかったのだが、 とても美味しい夕食+オプションで金目鯛の煮付けに大満足 (というか食べ過ぎ)。 食事を撮影しようとカメラを持っていたのだが すっかり忘れて食事をむさぼり食ってしまったので写真なし。 まぁ、写真撮影を忘れる位に美味しかったという事で。
食事の後は温泉に行こうとか考えていたのだが、 満腹+良い感じの疲れ具合に動く気にもなれずに 9 時過ぎには就寝。
呆れる程早寝をしたので、 さすがに翌朝は6時頃には自然と目が覚め朝食前に温泉にのんびりつかる (のんびりし過ぎて若干湯あたり気味だったのは内緒)。
ビュッフェ形式の食事を堪能したらいざ出発。
昨日天気が良くて暖かかったのでついつい色気(?)を出して
復路は城ヶ崎から遠笠山経由で伊豆スカイラインを通る事にしたのだが、
路肩には雪が残っているわ、路面は濡れているわ、
日陰ではところどころ路面も凍結しているわで
ワインディングを楽しむどころではなく山伏峠で下界に退散。
単調だろうと何だろうと暖かいのがエライと再認識。
勿論往路で軟弱な海沿いルートを主張した自分はやはりエライと(以下略)
熱海で昼食後は往路同様高速道路をひたすら走り無事に帰宅。
走行距離 350 km 程度なので 1 泊ツーリングとしては短い距離だが、
やはりこの時期はバイクで走るものじゃないと改めて実感した次第(軟弱もの)。
次の遠出は 4 月過ぎて暖かくなってからで良いな。
2011/01/21
MacBook Air に vtun 導入
某所で vtun を利用した vpn サーバを構築しているので、 MacBook Air に vtun クライアントを導入して vpn 接続出来る様にする。 vtun ver.3 は MacPort からも導入できるのだが、 諸処の事情により接続先のサーバが vtun ver.2 で運用されているので 今回は MacPort ではなく手作業にてインストールする事にする。
vtun に必要な圧縮関係の lzo ライブラリは MacPort でも導入できるのだが、 依存関係が多く古い perl までインストール要求するので 今回はこちらも手作業にて導入する。 vtun が依存しているのは lzo の 1.0 系なので、 LZO のオフィシャルサイト から lzo 1.0 系の最新版である lzo-1.8.tar.gz をダウンロードして展開し、 MacPort の流儀に合わせて --prefix=/opt/local を指定、 共有ライブラリを有効にするために --enable-shared を指定して configure を実行し make する。
$ ./configure --prefix=/opt/local --enable-shared $ make $ sudo make install clean
次に vtun ver.2 のソースを
Sourceforge
からダウンローし展開する。
vtun ver.2 のソースはそのままでは Mac 上ではコンパイルできないので
以下のパッチを適用する。
diff -cr vtun.orig/auth.c vtun/auth.c *** vtun.orig/auth.c 2002-12-17 06:40:44.000000000 +0900 --- vtun/auth.c 2011-01-20 18:22:49.000000000 +0900 *************** *** 66,73 **** #include <openssl/blowfish.h> #include <openssl/rand.h> #else /* YAY - We're MAC OS */ ! #include <sys/md5.h> ! #include <crypto/blowfish.h> #endif /* __APPLE_CC__ */ void gen_chal(char *buf) --- 66,73 ---- #include <openssl/blowfish.h> #include <openssl/rand.h> #else /* YAY - We're MAC OS */ ! #include <openssl/md5.h> ! #include <openssl/blowfish.h> #endif /* __APPLE_CC__ */ void gen_chal(char *buf) diff -cr vtun.orig/lfd_encrypt.c vtun/lfd_encrypt.c *** vtun.orig/lfd_encrypt.c 2002-12-17 06:40:46.000000000 +0900 --- vtun/lfd_encrypt.c 2011-01-20 18:23:21.000000000 +0900 *************** *** 53,60 **** #include <openssl/md5.h> #include <openssl/blowfish.h> #else /* YAY - We're MAC OS */ ! #include <sys/md5.h> ! #include <crypto/blowfish.h> #endif /* __APPLE_CC__ */ #define ENC_BUF_SIZE VTUN_FRAME_SIZE + 16 --- 53,60 ---- #include <openssl/md5.h> #include <openssl/blowfish.h> #else /* YAY - We're MAC OS */ ! #include <openssl/md5.h> ! #include <openssl/blowfish.h> #endif /* __APPLE_CC__ */ #define ENC_BUF_SIZE VTUN_FRAME_SIZE + 16パッチ適用後、これも --prefix=/opt/local を指定、 導入した lzo 関係のパスを指定するために --with-lzo-headers、 --with-lzo-lib をそれぞれ指定して configure を実行し make する。
$ ./configure --prefix=/opt/local --with-lzo-include=/opt/local/include --with-lzo-lib=/opt/local/lib $ make $ sudo make install clean
これで vtun はインストールできたが、
Mac OS X は標準では vtun が利用するトンネルデバイス /dev/tunX
が存在しないので Sourceforge から
Mac OS X 用の TUN/TAP ドライバをダウンロードしてインストールする。
インストール後にシステムを再起動するか /Library/Extensions/tun.kext
をロードする事で /dev/tunX が生成されるので、
/opt/local/sbin/vtund を実行して vpn 接続できるか確認する。
$ sudo kextload /Library/Extensions/tun.kext $ sudo /opt/local/sbin/vtund -f /opt/local/etc/vtund.conf ホスト サーバアドレス $ ifconfig tunX tunX: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet XXX.XXX.XXX.XXX --> YYY.YYY.YYY.YYY netmask 0xff000000 open (pid PPP)
vpn 接続ができればこの様なスクリプトを作成して root 権限で実行すると vpn 接続の開始・終了が出来る様になる。
1#!/bin/sh 2base="/opt/local" 3 4vtund="${base}/sbin/vtund" 5conf="${base}/etc/vtund.conf" 6opt="ホスト サーバアドレス 7 8start() 9{ 10 11 test -x ${vtund} -a -f ${conf} && ${vtund} -f ${conf} ${opt} 12 13} 14 15stop() 16{ 17 18 ps ax | sed -n '/[v]tund/s/ *\([0-9]*\) .*/\1/p' | xargs kill 19 20} 21 22case $1 in 23 start ) 24 start;; 25 stop ) 26 stop;; 27 restart ) 28 stop && start;; 29 * ) 30 echo "Usage: ${0##*/} [start][stop][restart]" 1>&2 31 exit 255;; 32esac
2011/01/20
Esperance DV のメモリディスクで firefox の起動を高速化
Esperance DV を利用して
Mac 上にメモリディスクを作成している。
最初は firefox のキャッシュをメモリディスク上に格納していたのだが、
プロファイル情報を全てメモリディスクに格納したら起動が非常に速くなった。
firefox のキャッシュデータとプロファイルデータを
メモリディスク上に格納するために、
元のディレクトリをメモリディスク上に移動してから、
本来のディレクトリにシンボリックリンクしている。
$ mkdir /Volumes/RamDisk/Application\ Support $ mv $HOME/Library/Application\ Support/Firefox /Volumes/RamDisk/Application\ Support/. $ ln -s /Volumes/RamDisk/Application\ Support/Firefox $HOME/Application\ Support $ mkdir /Volumes/RamDisk/Cache $ mv $HOME/Library/Cache/Firefox /Volumes/RamDisk/Cache/. $ ln -s /Volumes/RamDisc/Cache/Firefox $HOME/Library/Cache
ただし firefox は多くのプラグインや GreaseMonkey スクリプト等で
カスタマイズしてあるので、
何か問題があった場合にメモリディスク上のプロファイルデータが
全て消えてしまうと環境の再構築が非常に面倒になる。
そこで rsync (1) を実行するスクリプトを cron に登録して、
自動的にメモリディスク上のプロファイルデータを
通常のディスクに同期コピーする事で
メモリディスク上のプロファイルデータが消えてしまっても
最悪でも1日前までの状態には戻れる様にして運用している。
TimeMachine でバックアップは取得しているのだが、
TimeMachine のシンボリックリンクの扱いが不明なので
安全策として独自に同期コピーを実施している。
1#!/bin/sh 2 3src="${HOME}/Library/Application Support/Firefox/" 4dst="同期データのバックアップディレクトリ" 5 6/usr/bin/rsync -a --delete "${src}" ${dst}"
ちなみに Esperance DV を勝手に日本語化してみたのだが、
作者に連絡が撮れないのでひっそりと
公開。
インストールされた EsperanceDV.prefPane の中の
Resources ディレクトリ
(標準だと $HOME/Library/PreferencePanes/EsperanceDV.prefPane/Contents/Resources)に
展開した Japanese.lproj をコピーすると、
「システム環境設定」の
「Esperance DV」の設定画面が日本語化される。
この日本語化は私が勝手に日本語化しただけであり、
オリジナルの作者に許諾を取っていませんので、
日本語化部分に関してはオリジナルの作者に絶対に問い合わせないで下さい。