Browse Month: October 2014

su で expect を使って簡単に root になる方法

exepct 便利ですよね。expect を使うと、コマンドラインの対話を自動的に行うことが出来ます。

例えば、/home/foo/password に su のパスワードが書かれている場合、次のようなスクリプトを作成して実行すると一発で su することができます。


#!/usr/bin/expect -f

set password [exec cat /home/foo/password | head -1 | tr -s " " | cut -d " " -f 2]

spawn su -
expect "*assword:" { send "$password\r" }

interact

ポイントは、set で exec を使ってコマンドラインの実行結果をパスワードに入れているところ、上記の例であと /home/foo/password には複数行で各ユーザごとのパスワードがかかれていて、1行目に root のパスワードが書かれていることになります。
そして、interact で処理を継続しているところがポイントです。

また、expect 用のスクリプトを一から手動で作成するのは、すこし不便ですが、autoexpect を使うと expect を使うスクリプトを自動生成することができて便利です。
例えば、上記の expect のもとを作成する場合には、次のようにします。


$ autoexpect -c su
autoexpect started, file is script.exp
Password:
foo# exit
exit
autoexpect done, file is script.exp
$

そうすると、カレントディレクトリ以下に script.exp というファイルが生成されています。このファイルには、制御コードなどを含まれていたり、たくさんの分かりやすいコメントがかかれているので、ちゃんと整理して expect なスクリプトを作成すると便利です。

久しぶりの veewee ではまった

こんにちは。
CentOS 7 がリリースされたので、手前味噌の Vagrant box を更新しようと思い立ちました。
ただ、せっかくなので、Packer の方がいいかと思って、veewee-to-packer gem をインストールして変換してみたのですが、ISO の CD ファイル名が何らかのハッシュ値.iso として packer_cache ディレクトリに入ってしまい、ダウンロードの時間がかかりそうだった点(ちなみに veewee だと iso ディレクトリの普通のファイル名.iso をチェックして、とても素直です)、今のところ Vagrant 用として使うだけ点、という点からわざわざ packer を使う必要はないという結論に勝手に追加しました。あと、veewee-to-packer gem はあまりメンテナンスされていないので、すこし template.json を修正する点もあったので、それも少し面倒でした。具体的に vmware を vmware-iso とするなど。

というわけで、みんな大好き veewee です。久しぶりにのぞいてみると、ちゃんとメンテされ続けているようで、ちょうど 10/1 に veewee 0.4.0 がリリースされていました。久しぶりに RubyGems にリリースされているので、ちゃんとメンテされているようで安心しました。

さっそく、VMware fusion 用の Vagrant box を作成した用途したところ、なぜか次のようなエラーが発生しました。なお、VMware fusion 7.0 です。


$ bundle exec veewee fusion build my-centos7
...
.../lib/veewee/provider/vmfusion/provider.rb:34:in `split': invalid byte sequence in US-ASCII (ArgumentError)
...

どうも、system_profiler SPApplicationsDataType コマンドの出力から VMware Fusion のバージョンを抽出する部分でアスキー文字以外が含まれているというエラーのようです。

veewee の issue をみてみると、ちょうど同じ内容の報告が 2013 年にあったようです。この issue に書いてあるようなコードを fork した veewee に変更してちゃんと動作して CentOS 7 の Vagrant box を作成することが出来ました!ちなみに Homebrew cask でインストールしているときは、/Application/VMwae\ Fusion.app の symlink を貼った方はいいです。Packer も /Application 以下をチェックしていますので。いちお、pull-request を送っておきました。(※こちらマージされました!)

同じ問題で悩んでいる方は、次のような Gemfile を書いておくと便利です。

source 'https://rubygems.org'

gem('vagrant',
git: 'https://github.com/mitchellh/vagrant.git',
tag: 'v1.6.5')

gem('veewee',
git: 'https://github.com/jedi4ever/veewee.git')

来週は、CentOS 7 の kickstart ファイルを作成するときにはまったことについてアウトプットしていけたらと思います。