したかったこと。
$ 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