ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

ezjail 仮想マシンで実行する

したかったこと。

$ cd /usr/jails/pub/usr/local/
$ jsudo pwd
/usr/local
$ jsudo etc/rc.d/apache22 status
apache22 is running as pid 2575.

もしくはホームから直接。

$ cd
$ jsudo /usr/jails/pub/usr/local/etc/rc.d/apache22 status
apache22 is running as pid 2575.

これと sudo.vim を使えば、.cshrc とかを個別に同期することなく管理ができるようになって便利。


怖いのは仮想マシン内のコードを間違ってホスト環境で実行するトラップ。
何かしらの対策を用意しないと実用は無理そう。


用意したスクリプト
配列を使いたかったけど bash を入れるのが面倒だったので tcsh スクリプト。:q 記法がミソ。

#!/bin/tcsh

set jname=`pwd | sed -n -e 's#^/usr/jails/\([^/]*\)/.*$#\1#p'`
set jpath=`pwd | sed -n -e 's#^/usr/jails/[^/]*##p'`

if ( "x$jname" == "x" ) then
        set jname=`echo $1 | sed -n -e 's#^/usr/jails/\([^/]*\)/.*$#\1#p'`
        set jpath=/tmp
endif

if ( "x$jname" == "x" ) then
        set jname=$1
        set jpath=/tmp
        shift argv
endif

set arg2=()
while ( $#argv )
        set argv[1]=`echo $1 | sed -e "s#^/usr/jails/$jname##"`
        set arg2=($arg2:q $argv[1]:q)
        shift argv
end
set argv=($arg2:q)

#echo "jname: $jname"
#echo "pwd: $jpath"
#echo -n "command: "; printf "[%s]" $argv:q; echo

set ezjail_safename=`echo -n "${jname}" | tr -c '[:alnum:]' _`
if( -f "/var/run/jail_${ezjail_safename}.id" ) then
        set jid=`cat /var/run/jail_${ezjail_safename}.id`
        jls | grep -q -E "^ +${jid} " || unset jid
        if (! ${?jid} ) exit
else
        echo "ERROR: there is no such a jail name."
        exit
endif

echo "jid: $jid"

sudo jexec $jid /bin/tcsh -s $argv:q <<_EOF
cd $jpath
#echo -n "host: "; hostname
#echo -n "pwd: "; pwd
#echo -n "command: "; printf "[%s] " \$argv:q; echo
\$argv:q
_EOF