Category Archives: PERSONAL COMPUTER - Page 3

コンソール に iptables が色々 ログ を出力するのを黙らせる

デーモンがコンソールを汚したら行けないだろうという話な訳で、こいつを黙らせます。

klogdのオプションに”-c 4″を加えます。
# vi /etc/sysconfig/syslog
KLOGD_OPTIONS=”-c 4 -x”

syslogを再起動します。
# service syslog restart

参考サイト
iptablesのログをコンソールに表示させない
コンソール画面に[IPTABLES INPUT]等のログが出てきてウザイ件 « こま切れblogの詰め合せ

CentOS 5 ディスククオータ 設定一括変更

数百人分のディスククオータの設定を一括して書き換えたかったため簡単なスクリプトを書きました。
これぐらいだったらbashで書くべきだったかな^^;

#!/usr/bin/perl
##########################################
# ディスククオータ一括設定変更スクリプト
##########################################
use utf8;
use strict;
use warnings;

# /homeからユーザ一覧を取得するコマンド(egrepで除外するユーザを書いておく)
my $home_list_cmd = 'ls -1 /home | grep -E -v "(exclude_user|source_user|lost\+found|aquota.user)"';
# クオータ設定をコピーするコマンド(設定元になるユーザを書いておく)
my $edquota_cmd = 'edquota -p source_user -u ';

# 実行
foreach my $user (split(/\n/, `$home_list_cmd`)){
  my $cmd = $edquota_cmd . $user;
  my $rs = `$cmd`;
}

VI(VIM)の簡単な使い方

5年以上もLinux系サーバと戯れときながら今更過ぎますが、これからのLinuxユーザの事を考えVIコマンドの簡単な使い方をメモしておきます。はっきり言ってVIの機能を語り尽くせば本が一冊書けるレベルの量です。O’ReillyでもVIの書籍が出ています。VIを熟知したい人は是非書籍を買ってください。

VI(VIM)コマンドとは

マウスやカーソルキーがキーボードに存在しない時代、UNIX全盛期に作られ非常に長い時間UNIXとともに進化してきたシンプルかつ強力なテキストエディタです。そしてVIを参考に機能を拡張したものがVIMです。基本的にVIMはVIコマンドとして使えるのでVIとして解説します。

VIコマンドを使う主な利点

・他のエディタと異なり基本的にUNIX系OSに標準で入っている
・UNIXの書籍や解説サイトでは非常に高い割合でVIを用いて設定など解説している
・リモート操作時に接続が不意に切れてもEmacsの様にプロセスが暴走しない

本当に基本的な使い方一覧

“$や%や#”はシェル上であるという表示です。各自環境に合わせて読んでください。

起動方法
$ vi ファイル名
上記を実行すると”ノーマルモード”で起動します。
※ 全角文字をファイル名に用いるのは文字化けの元です。半角英数を使いましょう。
※ 白文字をファイル名に用いるのは混乱の元です。アンダースコアを使いましょう。

記述方法
ノーマルモードから”i”キーを押す事により”挿入モード”となり文字入力が可能になります。
ノーマルモードに戻りたい場合は”ESC”キーを押します。

保存方法
ノーマルモードより”:w”を入力し”Enter”キーを押します。

終了方法
保存後に終了する場合は”:wq”を入力し”Enter”キーを押します。
保存せず終了する場合は”:q!”を入力し”Enter”キーを押します。

※ ファイルを編集する前には必ず元のファイルをバックアップする癖を付けましょう。
※ ファイルを編集する時は必ず編集したらこまめに保存する癖を付けましょう。

覚えておくと便利な操作一覧(ノーマルモード上での操作)

直前のコマンド操作を取り消す

”u”キーを押すと直前の操作を取り消す事ができます。
※ 現代の一般的なエディタとは異なり挿入モードもコマンド単位として戻ります。

ファイルの表示場所を変える

ファイルの先頭に移動
削除したい文字にカーソルを合わせ”g”キーを2回押すと先頭に移動する事ができます。

ファイルの最後に移動
削除したい文字にカーソルを合わせ”shift”キーと”g”キーを同時に2回押すと最後に移動する事ができます。

行番号の表示

”:set number”を入力し”Enter”キーを押します。
表示を消す場合はノーマルモードより”:set nonumber”を入力し”Enter”キーを押します。

指定する行番にカーソル移動

”:カーソルを移動させたい行数”を入力し”Enter”キーを押します。

文字列検索

”:/検索ワード(正規表現使用可能)/”を入力し”Enter”キーを押します。
検索結果は”n”キーを押すことにより次を検索できます。

文字列置換

個々に置換
”:/検索ワード(正規表現使用可能)/置換後の文字/”を入力し”Enter”キーを押します。

カーソルのある行全てを置換
”:/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ファイル内全て再帰的に置換
”:%s/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ノーマルモードからの削除

ノーマルモードからの文字削除
削除したい文字にカーソルを合わせ”x”キーを押すと文字を削除する事ができます。

ノーマルモードからの行削除
削除したい文字にカーソルを合わせ”d”キーを2回押すと文字を削除する事ができます。

文字コードを指定して開き直す

”:e ++enc=文字エンコーディング”を入力し”Enter”キーを押します。

Kali Linux 日本語版カスタムISOの自作方法

先ほど公開した日本語化版Kali LinuxのISOについてKali LinuxのISOのカスタム方法について日本語のサイトでまとめられているところがなかったので公式のISO作成方法(英語)を元にKali Linuxの日本語版のISO作成方法について簡単にメモしておきます

作成に関してはKali LinuxのVMWare版を使用すると効率的に作業できるかと思います

必要なパッケージをインストールします
# apt-get install git live-build cdebootstrap kali-archive-keyring
GITからISO作成の各種パラメータなどが書かれたものをクローンします
# git clone git://git.kali.org/live-build-config.git
クローンしたディレクトリに移ります
# cd live-build-config
シンボリックを作っていないとエラーが出るので作っておきます
# ln -sf wheezy /usr/share/live/build/data/debian-cd/kali

以上が初期設定です。下記より自分の好みに合わせた設定を行うために各種ファイルを作成します

カスタムする際にインストールする必要のあるパッケージリストを作成します
# vi config/package-lists/package-add.list.chroot

# japanese IME
ibus
ibus-anthy
uim
uim-anthy

# Japanese Font
fonts-ipafont
ttf-vlgothic

# Japanese Man
manpages-ja
manpages-ja-dev

# Japanese Doc
doc-linux-ja-text
doc-linux-ja-html

# Japanese Browser
iceweasel-l10n-ja

# Browser Flash Plugin
flashplugin-nonfree

# VPN
network-manager-openvpn-gnome
network-manager-pptp-gnome

# Editor
gedit

Skypeなど追加したいパッケージがapt-getで提供されておらずdebパッケージで存在する場合は下記のディレクトリに投げ込んでおくとビルド時に自動でインストールされます
# ls config/package-lists/packages/

日本語表示、日本語入力に関する設定を行うシェルスクリプトを作成します
# vi config/hooks/japanese-config.chroot

#!/bin/sh
echo "*****************************************************"
echo "* changing locale.gen japanese config file......... *"
echo "*****************************************************"
sed -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/g' /etc/locale.gen > /tmp/locale.gen_jp
mv -f /tmp/locale.gen_jp /etc/locale.gen
echo "new /etc/locale.gen"
cat /etc/locale.gen

echo "*****************************************************"
echo "* changing default locale japanese config file..... *"
echo "*****************************************************"
{
echo "#  File generated by update-locale"
echo "LANG=ja_JP.UTF-8"
} > /tmp/locale_jp
mv -f /tmp/locale_jp /etc/default/locale
echo "new /etc/default/locale"
cat /etc/default/locale

echo "*****************************************************"
echo "* changing keyboard msp japanese config file....... *"
echo "*****************************************************"
{
echo "# KEYBOARD CONFIGURATION FILE"
echo ""
echo "# Consult the keyboard(5) manual page."
echo "XKBMODEL=\"pc105\""
echo "XKBLAYOUT=\"jp\""
echo "XKBVARIANT=\"\""
echo "XKBOPTIONS=\"\""
echo ""
echo "BACKSPACE=\"guess\""
} > /tmp/keyboard_ja
mv -f /tmp/keyboard_ja /etc/default/keyboard
echo "new /etc/default/keyboard"
cat /etc/default/keyboard

echo "*****************************************************"
echo "* changing im-config config file................... *"
echo "*****************************************************"
im-config -n uim
echo "new /etc/X11/xinit/xinputrc"
cat /etc/X11/xinit/xinputrc

※ このスクリプトは作成中のシステムが入っているディレクトリに”chroot”されている状態で実行されます

カレントディレクトリを移動します
# cd ../

ISO作成やBOOTに関するパラメータの設定をコマンドにて叩きますが今回はConfigオプションが長かったりで毎回打つのは面倒なのでシェルスクリプトに書いておきます
# vi make_iso.sh

#!/bin/sh
# ディレクトリを移動します
cd live-build-config
# 前回のビルド内容が残っていると面倒なので一度クリアします
lb clean
# ブートに関する設定をconfigのオプションに追記して設定します
lb config \
  --bootappend-live "\
    boot=live \
    noconfig=sudo \
    username=root \
    hostname=kali \
    locales=ja_JP.UTF-8 \
    keyboard-model=jp106 \
    keyboard-layouts=jp \
    persistence \
    noeject \
  "
# ISOファイルの作成を開始します
lb build

シェルスクリプトに実行権を与えます
# chmod 755 make_iso.sh
ISOファイル生成を実行します
# ./make_iso.sh
※ 最初に行うビルドはかなり時間がかかります。当方の環境では3~4時間ほどかかりました。

その他設定の仕方を調べたい場合はDebian Live Manualを参照してください。なお、多くの日本語サイトではバージョンの古いlive buildを使ったカスタム法が紹介されていますがパラメータや設定ファイルの名前や書式に互換性がなかったりするのでご注意ください

参考サイト
Debian Live Manual
live-build 作成の半自動化 3

Raspberry Pi 自分の用途に合わせたディスクイメージを作成する Debian 最小構成

RaspbianはRaspberry Piに適した素晴らしいLinuxですがGUIが不要な用途だったりすると
不要なパッケージがあまりにも多く含まれていると感じたり
ほかのデスクトップ環境のディスクイメージを作りたいと考える人もいるかと思います
そこで、自分の用途に合わせたディスクイメージの作り方をメモしておきます

必要な物
・Raspberry Pi
・Raspbianの入ったSDカード
・空のSDカード
・カードリーダライタ

Raspbianの入ったSDカードで起動し
空のSDカードにディスクイメージとなる環境を作ります

SDのパーティション削除とジオメトリの設定
$ sudo fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
241 heads, 63 sectors/track, 256 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63     3886847     1943392+   b  W95 FAT32

Command (m for help): d
Selected partition 1

Command (m for help): x

Expert command (m for help): h
Number of heads (1-256, default 241): 255

Expert command (m for help): s
Number of sectors (1-63, default 63): 63

Expert command (m for help): c
Number of cylinders (1-1048576, default 256): 各自計算したシリンダ数

Expert command (m for help): r

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
255 heads, 63 sectors/track, 241 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

シリンダ数の計算
SDカードの容量 / 255 / 63 / 512 = シリンダ数
例) 1990197248 / 255 / 63 / 512 = 241
割り切れない数値は切り捨てます

Windowsパーティション’/boot’の作成 (64MB)
$ sudo fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-3887103, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-3887103, default 3887103): +64M

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
62 heads, 62 sectors/track, 1011 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536    c  W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

Linuxパーティション”/”の作成 (残りの容量全部)
$ sudo fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 2):
Using default value 2
First sector (133120-3887103, default 133120):
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-3887103, default 3887103):
Using default value 3887103

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
40 heads, 6 sectors/track, 16196 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536    c  W95 FAT32 (LBA)
/dev/sda2          133120     3887103     1876992   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

必要なパッケージのインストール
$ sudo apt-get install dosfstools debootstrap git-core ca-certificates

フォーマット
$ sudo mkfs -t vfat -v -c -F 32 /dev/sda1
$ sudo mke2fs -t ext4 /dev/sda2 -m 1

SDカードに作成したパーティション/を/mntにマウントしてdebootstrapを使いDebianをインストール
$ sudo mount -o defaults,noatime /dev/sda2 /mnt/
$ sudo debootstrap –exclude=ed,nano –foreign –arch armel wheezy /mnt http://ftp.jp.debian.org/debian

必要なファイルをコピー
$ sudo cp /etc/inittab /mnt/etc/inittab
$ sudo cp /etc/hosts /mnt/etc/hosts
$ sudo cp /etc/fstab /mnt/etc/fstab
$ sudo cp /etc/network/interfaces /mnt/etc/network/interfaces

rootユーザで/mntをchrootし疑似的にLinuxを触る
chrootするとsudoコマンドは使えないためrootユーザになっておく必要があります
作業中は一応、ヒストリーに履歴が残ってしまうようなので残らないようにしておきます
debootstrapを実行させるとマウントしていた/procがアンマウントされるようなので再度マウントします
$ sudo su –
# export HISTSIZE=0 HISTFILESIZE=0
# chroot /mnt
# mount -n /proc
# export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# /debootstrap/debootstrap –second-stage –no-resolve-deps
# mount -n /proc

リポジトリの追加
これは標準のDevianのリポジトリを追加していますが面倒ならRaspbian側のファイルをコピーしても問題ありません
# vi /etc/apt/sources.list

# See sources.list(5) for more information, especialy
# Remember that you can only use http, ftp or file URIs
# CDROMs are managed through the apt-cdrom tool.
deb http://http.us.debian.org/debian stable main contrib non-free
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free

# Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian stable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

アップデートとアップグレードの実行とその他、各自必要なパッケージのインストール
ここで好きなパッケージをインストールしておくことで用途に合わせたディスクイメージを作成することができます
# apt-get update
# apt-get upgrade
# apt-get install console-common console-setup console-data console-tools \
keyboard-configuration locales ntpdate ntp lua5.1 vim ssh sudo syslog-ng usbutils

ユーザの作成とsudoグループへの追加
この時にpasswdコマンドを使用しrootユーザのパスワードを設定することもできます
# adduser pi
# gpasswd -a pi sudo

chrootでの作業とrootでの作業の終了
# exit
# exit

起動時にeth0を有効化させる設定
$ sudo vi /mnt/etc/network/interfaces

auto lo eth0

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

/bootとモジュールのコピー
$ sudo mount /dev/sda1 /mnt/boot
$ sudo cp -rp /boot/* /mnt/boot
$ sudo cp -rp /lib/modules/* /mnt/lib/modules

カーネルとモジュールのアップデート
$ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
$ sudo chmod +x /usr/bin/rpi-update
$ sudo ROOT_PATH=/mnt BOOT_PATH=/mnt/boot rpi-update

SDカードをアンマウント
$ sudo umount -l /mnt

シャットダウン
$ sudo shutdown -h now

SDカードを引き抜き、SDカードのイメージを作成すればオリジナルディスクイメージの完成です。
イメージ作成はWin32 Disk Imagerなどを使用すると簡単かもしれません

最後に作成したSDカードをRaspberry Piに接続し電源を入れ、正常に起動するするかを確認してみてください。

参考URL
覚書的な何か » Blog Archive » Raspberry PiでまっさらなDebianのインストール
Debian Linux for Raspberry Pi – GreenLeaf
Raspberry piにDebian squeezeをインストールする – もぐてっく
fdiskでフォーマットする – Android on Beagle

Bashで文字と数字を足してみると・・・?

Bashの文字の処理について気になり調べていたところ
Bashの面白い仕様を見つけたので投稿します。
# C=’A’
# echo $((${C}+1));
1
# echo ${C};
A
# echo $((1+1));
2
# C=1
# echo $((${C}+1));
2
#

変数Cに文字Aを代入する
変数Cに1を足し結果を標準出力を行うと1が返る
変数Cを標準出力するとAが返る
数字1に1を足し結果を標準出力を行うと2が返る
変数Cに数字1を代入する
変数Cに1を足し結果を標準出力を行うと2が返る

変数内の文字に対する足し算はエラーを出さず完全に無視するようです。

Perl LWP::UserAgentを使ったHTTPS接続

PerlでLWP::UserAgentを使い、HTTPSサイトへ接続を行いコンテンツを取得してくるプログラムを書く必要が出てきて、色々調べて書いたのですが情報が錯綜していたりで結構ハマったのでソースコードを載せておきます。
今回わけあったりでコンストラクタ側でProxyの情報を保持していなかったりしますが、そこはお好きに改変してお使いください。

#########################################################
#
# LWP::UserAgentを使ったHTTPS接続
#
#########################################################
use utf8;
use strict;
use warnings;

{
    package ProxyWebGet;

    use LWP::UserAgent;

    # コンストラクタ
    sub new {
        my ($class, @args) = @_;
        my %args = ref $args[0] eq 'HASH' ? %{$args[0]} : @args;
        my $self = {%args};

        # オプション項目
        $self->{ac_timeout} ||= 10;    # プロキシ接続時のタイムアウト(秒)

        return bless $self , $class;
    }

    # ホストとポート番号に対してProxy接続を行う
    # 引数にホストとポート番号と接続先URLを指定する
    sub proxy_connect {
        my $self = shift;
        my $proxy_host = shift; # ホストを受け取る
        my $proxy_port = shift; # ポート番号を受け取る
        my $target_url = shift; # 接続先URL

        # ホストとポート番号をLWP::UserAgentで利用できる形式に整形する
        my $http_proxy = 'http://' . $proxy_host . ':' . $proxy_port;

        $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
        $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}    = 0;
        $ENV{HTTPS_PROXY}   = $http_proxy;
        $ENV{HTTPS_VERSION} = 3;

        # LWP::UserAgentのインスタンスの生成
        my $ua = LWP::UserAgent->new(
            timeout => $self->{ac_timeout} # オプションにタイムアウト時間を指定
        );

        # ヘッダーにUTF-8を含む場合エラーが出るため解析しない
        $ua->parse_head(0);

        # 整形したProxyを指定
        $ua->proxy(['http'], $http_proxy);

        # 指定されたURLへ接続する
        # FTP等のプロトコルに接続を行った場合
        # コネクションが維持されるため強制的に破棄する
        my $res = "";
        eval{
            local $SIG{ALRM} = sub{die "timeout"};
            alarm($self->{ac_timeout});   # タイマー設定
            $res = $ua->get($target_url); # URLへ接続しコンテンツを取得
            alarm(0);                     # タイマー解除
        };

        # ステータスコードが正常である場合、コンテンツを返す
        my $result = $res->is_success() ? $res->content() : "";

        return $result;
    }
}

{
    # sub main
    my $pwg = ProxyWebGet->new();

    print $pwg->proxy_connect(
              '000.000.000.000',
              '0000',
              'https://ja.wikipedia.org/wiki/'
          );
}

Linux ファイル・ディレクトリ作成時のデフォルトパーミッションを一般ユーザ権限で設定する

学校やレンタルサーバなどではセキュリティーを意識してかデフォルトパーミッションが600や700に設定されていたりする場合がある。非常に良い設定であると思うが、普段からサーバを触る機会の多い自分からすれば普通にファイルを作成すれば他のユーザから閲覧される可能性があるのは百も承知な訳で煩わしいだけである。そのためこちら側でデフォルトパーミッションを変更したいと思う。

変更自体は簡単で”~/.bash_profile”の中に”umask 022″を追記すればファイルは644・ディレクトリは755で作成される。

面倒な場合やコマンドが叩ける環境であるならば下記のコマンドを実行すればよい。
$ echo “umask 022” >> ~/.bash_profile

Bashでインタプリタ(Brainf*ck)を書いてみる

ワケありましてBrainf*ckを書くことになりBashでこんなものを書く人は少ないかもなと思いながら実装してみました。
とりあえずWikipediaで公開されている”Hello, world!”は実行出来ます。
色んなところで公開されている”FizzBuzz”も試した限りでは動作しているようです。

#!/bin/bash
############################################################################
#
# メモ
#
# このソースコードは私のサーバにて一般公開しております
# 公開先: https://www.orsx.net/archives/4469
#
# Bashは明確にローカル変数であることを宣言しなければ
# 全てグローバル変数となるが・・・・
# とりあえず初期化する関数を定義すれば追いやすくなるかもしれないとかと
# べ、別にこんなもの無くても問題ない。。。
#
# 言語によっては最後に標準出力した値を返り値として返す物があったりするため
# 癖で関数の最後には必ず明的にreturnしてあるが・・・
# べ、別にこんなもの無くても問題ない。。。
#
# ちなみに、変数は下記のようになっている
# ・グローバル変数は大文字
# ・ローカル変数は小文字
#
############################################################################

# 使用するグローバル変数を明的に初期化する
function initialize() {
  # 変数
  TEXT_SRC=""
  CODE_LEN=0
  CODE_PTR=0
  BUFF_PTR=0
  BUFF_LEN=0

  # 配列
  CODE=()
  BUFF=()

  return
}

# EOF(CTRL+D)が来るまで読み続け改行は無視する
# グローバル変数SRCにソースコードを格納する
function readstring() {
  local line
  while read line
  do
    # 文字列連結 連結演算子は存在しない
    TEXT_SRC=$TEXT_SRC$line
  done

  # returnは数字しか返せない
  return
}

# 標準入力で1文字だけ受け取る
function readchar() {
  local line
  read line
  # 文字を数字に変換
  BUFF[${BUFF_PTR}]=$(printf "%d" "'${line:0:1}")

  return
}

# ASCIIコードからアルファベットを表示する
function echochar() {
  echo ${BUFF[${BUFF_PTR}]} | awk '{ printf("%c", $0); }'

  return
}

# 初期化されていない配列の要素を使おうとする前に初期化して拡張する
# これによりバッファーの長さを制限しなくて良くなる
function expansion() {
  if [ ${BUFF_PTR} -gt ${BUFF_LEN} ]
  then
    BUFF_LEN=$((BUFF_LEN+1))
    BUFF[${BUFF_LEN}]=0
  fi

  return
}

# ソースコードをグローバル配列CODEに一文字ずつ格納する
function tokenizer() {
  # トークンを格納する配列の添字を数える
  CODE_LEN=$((${#TEXT_SRC}-1))

  # 文字列から一文字ずつトークンを取り出し配列に追加していく
  local i
  for i in $(seq 0 ${CODE_LEN})
  do
    CODE[${i}]=${TEXT_SRC:${i}:1}
  done

  return
}

# BUFF_PTRがな0ら対応する']'まで直後までジャンプする
function left_jumper() {
  if [ ${BUFF[${BUFF_PTR}]} -eq 0 ]
  then
    local loop_ptr=1
    while [ ${loop_ptr} -ne 0 ]
    do
      CODE_PTR=$((CODE_PTR+1))
      case ${CODE[${CODE_PTR}]} in
      '[')
        loop_ptr=$((loop_ptr+1));;
      ']')
        loop_ptr=$((loop_ptr-1));;
      esac
    done
  fi

  return
}

# BUFF_PTRがな0ら対応する'['の直後までジャンプする
function rite_jumper() {
  if [ ${BUFF[${BUFF_PTR}]} -ne 0 ]
  then
    local loop_ptr=1
    while [ ${loop_ptr} -ne 0 ]
    do
      CODE_PTR=$((CODE_PTR-1))
      case ${CODE[${CODE_PTR}]} in
      ']')
        loop_ptr=$((loop_ptr+1));;
      '[')
        loop_ptr=$((loop_ptr-1));;
      esac
    done
  fi

  return
}

# 意味解析を行い実行する
function execute() {
  while [ ${CODE_PTR} -le ${CODE_LEN} ]
  do
    case ${CODE[${CODE_PTR}]} in
    '>')
      BUFF_PTR=$((BUFF_PTR+1));;
    '<')
      BUFF_PTR=$((BUFF_PTR-1));;
    '+')
      BUFF[${BUFF_PTR}]=$((BUFF[${BUFF_PTR}]+1));;
    '-')
      BUFF[${BUFF_PTR}]=$((BUFF[${BUFF_PTR}]-1));;
    '.')
      echochar;;
    ',')
      readchar;;
    '[')
      left_jumper;;
    ']')
      rite_jumper;;
     * )
      local message="Unknown Token! : ";
      echo $message${CODE[${CODE_PTR}]};
      break;;
    esac

    expansion
    CODE_PTR=$((CODE_PTR+1))
  done

  echo "";

  return
}

initialize   # 初期化
readstring   # 入力受付・プリプロセッサ
tokenizer    # 構文解析
execute      # 意味解析・実行

実行方法
直接標準入力で渡すかもしくは
適当なファイル例えば”script.bf”のようなファイルにソースコードを書き込み下記のように実行することができます。
# cat script.bf | brainfuck.sh

2013/05/07 追記
Bashでは”文字”に対して足し算を行えないようなので
文字入力時に整数型に変換するように”,”の処理を修正しました。

Perl IPアドレスを10進数の整数型に変換し戻す

データベースにIPアドレスを格納する時は整数型にしたほうがブロックで検索出来たりと後々取り扱いが楽だったりするので変換する変換方法を書いてみる

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

my $addr_i = &addr_s_to_i("192.168.1.1");
my $addr_s = &addr_i_to_s($addr_i);
print "INTEGER:" . $addr_i . "\n";
print "STRING :" . $addr_s . "\n";

# IPアドレスを文字列型から整数型に変換
sub addr_s_to_i {
    my $addr = shift;

    # "."ごとに8bitずつ区切りそれを2進数に変換し配列に入れる
    my @addrs;
    foreach my $addr_split (split('\.', $addr)){
        push(@addrs, sprintf("%08b", $addr_split));
    }

    # 区切った2進数を連結する
    my $bin = join('', @addrs);
    # 2進数を10進数に変換
    my $result = oct('0b' . $bin);

    return $result;
}

# IPアドレスを整数型から文字列型に変換
sub addr_i_to_s {
    my $addr = shift;

    # 10進数を32bitの2進数に変換
    my $bin = sprintf("%032b", $addr);

    # 2進数を8bitごとに区切り10進数に変換し配列に入れる
    my @addrs;
    foreach my $addr_split ($bin =~ m/.{8}/g){
        push(@addrs, oct('0b' . $addr_split));
    }

    # "."ごとに区切り連結する
    my $result = join('.', @addrs);

    return $result;
}

実行結果
INTEGER:3232235777
STRING :192.168.1.1