ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2013/05/03

シェルで乱数を扱う

私はシェル上で乱数をあまり使うことはないのですが、そもそもUNIX機を中心に使っていた時代には簡単に扱えませんでした。シェル上で乱数を扱うには実は2つの方法があります。1つはLinuxでbashを前提とした環境依存の方法です。もう1つの方法はシェルに依存しない方法です。

シェル変数RANDOM

まずはbash上でのみ利用できる方法です。前段にてLinuxという条件を記載しましたが、シェルスクリプトを実装する際は、/bin/shで動くことを前提に通常は実装すると思いますのでLinuxを前提という条件を加えています。ご存知の方も多いと思いますが、Linxuでは/bin/shはbashのシンボリックリンクになっている点に基づいています。
bashでは、シェル変数としてRANDOMが容易されています。このRANDOM変数には0~32767までの整数がランダムに格納されます。実行例は以下の通りです。

 $ echo $RANDOM
 31129
 foo=$RANDOM
 ech $foo
 25999
シェル変数を利用するだけなので、非常に簡単に乱数を扱えるのがお分かり頂けたかと思います。

乱数疑似デバイスファイル

続いてはシェルに依存しない方法を紹介します。
疑似デバイスファイル(/dev/nullなどのことです。)の中に/dev/randomがあります。これを利用して乱数を生成します。この疑似デバイスファイルを使って乱数を生成するには、odコマンドを利用します。od(Octal Dump)コマンドはファイルや標準入力のデータを 8進数・10進数・16進数で表示するコマンドです。デフォルトは 8進数ダンプでダンプを行います。実行例は以下の通りです。

 $ od -An -N4 -tu$ 
odコマンドのオプションをいくつか指定しています。まず桁数についてですが、「-N」オプションが入力のバイト数、「-t」が出力のバイト数をそれぞれ指定しています。これらオプションに続く数値は合わせておく必要があります。なお、-N4以上を指定しても残念ながら桁数をふやすことはできないので注意して下さい。また「-t」オプションに続く「u」はunsigned decimalです。
「-A」オプションは表示するオフセットの基数を指定するオプションです。dが10進数、oが8進数、xが16進数、nがオフセット非表示を表します。乱数を取得したいのでオフセットを表示する必要はないため「n」を指定しています。

2013/05/02

コマンドラインでの移動制御

CUI環境でシェルが提供する移動制御機能を扱います。前提とするシェルは、Linux標準のbashです。
移動制御ですが、これはカーソルの移動制御のことです。bashでは初期状態でキー・バインディングが設定されていて、キー操作によるカーソルの移動制御を行うことができます。今では十字キーでカーソル動かしている方を多々見かけますが、キー操作で制御した方が早くて楽です。
主なキー操作は下表の通りです。

キー操作 移動制御動作
Ctrl+f カーソルを右に移動します。
Ctrl+b カーソルを左に移動します。
Ctrl+d カーソル位置の文字を削除します。
Ctrl+a カーソルを行の先頭に移動します。
Ctrl+b カーソルを行の末尾に移動します。
Ctrl+k カーソル位置から行の末尾までの文字を削除します。
Ctrl+u カーソル位置から行の先頭までの文字を削除します。
Ctrl+w カーソル行の直前のワードを削除します。
Ctrl+l カーソル行より上をクリアします。
Esc+f カーソルを直後のワードに移動します。
Esc+b カーソルを直前のワードに移動します。
Esc+d カーソル位置からワードの末尾までを削除します。

2013/05/01

Linuxの/bin/sh

概要

Linuxの/bin/shはBourneシェルかと思いきや、実はBashへのシンボリックリンクになっています。Bashはshの上位互換のシェルなので基本的には問題ないらしいです。ちなみにshとして起動した場合は、sh互換モードというモードで起動するようです。

 $ ls -l `which sh`

 lrwxrwxrwx. 1 root root 4 10月  8 12:04 2012 /bin/sh -> bash

sh互換モード

bashのsh互換モードについての説明です。

シェルオプションの違い

bashで起動した場合とshで起動した場合のシェルオプションを比較してみます。

$ sh
$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           on
privileged      off
verbose         off
vi              off
xtrace          off

$ bash
$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

上記の結果を見ると分かると思いますが、shで起動した場合シェルオプションの25行目の「posix」が有効になっているのが分かります。このオプションの有効/無効の違いによってbashがBourneシェルに近い動作をするように切り替えています。

2013/03/22

iptablesによるicmpパケットのフィルタリング

監視ツールによるping(いわゆる死活監視です)は通したので単純にicmpパケット全てをDROPという分けにはいきません。そこでicmpパケットに対するフィルタリング設定についてちょっと纏めてみたいと思います。

ICMP-TYPE

icmpにはICMP-TYPEといったものがあります。icmpはTCP/IPネットワークにおいて機器がお互いの状態(間のネットワークの状態といった方がいいかもしれませんが)を確認するためにpingのような診断プログラムによって利用されるプロトコルです。従ってネットワーク的に診断をするためのいろいろな通信ができる必要があるわけで、このいろいろな通信を実現しているのがICMP-TYPEというわけです。
ICMP-TYPEには以下のようなものがあり、iptablesの--icmp-typeオプションを利用することによりicmpパケットに対する細かなフィルタリング設定を実現できます。

type表示内容
0Echo Replyエコー応答Echo Reply(エコー応答)(pingなど)
3Destination Unreachable宛先到達不可(宛先の相手が存在しなかった、もしくは障害中)
4Source Quench発信制御(受信元のパソコンが送信元に、処理が追いつかないので転送を止めてほしいとリクエスト、など)
5Redirectルート変更(ルーター増設時などに最適経路を発見したときに利用)。表示されると一瞬びっくりします
8Echo Requestエコー要求(pingなど)
11Time Exceeded for a Datagram時間超過
12Parameter Problem on a Datagramパラメーター問題(IPヘッダに問題があったとき、受信側が送信側に送る)
13Timestamp Requestタイムスタンプ要求
14Timestamp Replyタイムスタンプ応答
15Information Request情報要求
16Information Reply情報応答
17Address Mask Requestアドレスマスク要求(自分が所属しているサブネットのサブネットマスクを知ろうとしたパソコンが送信する)
18Address Mask Replyアドレスマスク応答

pingを通す

pingによる死活監視を有効にするために、Echo RequestとEcho Replyを通します。
設定は以下の通りです。

iptables -A INPUT -m icmp -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -m icmp -p icmp --icmp-type 0 -j ACCEPT

icmp-host-prohibited

よく以下の設定を見かけますがどういう意味だかご存知ですか?
--reject-withオプションに続いてicmp-host-prohibitedが指定されています。これはパケットを拒否した際に返すエラーメッセージを指定するオプションみたいです。この例の場合は、icmp-host-prohibitedというエラーが応答として返されます。意味的には接続を拒否したよってことが伝えられるみたいです。

iptables -A INPUT -m icmp -p icmp -j REJECT --reject-with icmp-host-prohibited

なお、icmp-host-unreachableを指定するとホストまで届かなかったよって意味の応答が返されます。

参考

  • http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/index.html

2013/03/11

ProFTPD

概要

設定の簡単さが特徴のFTPサーバです。

インストール

 yum install profptd

設定

ProFTPDの設定は、/etc/proftpd.confで行います。

ServerName                      "ProFTPD server"
ServerIdent                     on "FTP Server ready."
ServerAdmin                     root@localhost
DefaultServer                   on
# [inetd|standalone]inetd経由で起動する場合はinetdを指定する。
ServerType                      inetd
# Passive mode に関する設定
MasqueradeAddress               192.168.215.15
PassivePorts                    50000 51000
# 認証設定
AuthPAMConfig                   proftpd
User                            nobody
Group                           nobody
AuthOrder                       mod_auth_pam.c* mod_auth_unix.c
# アクセスディレクトリに関する設定
# ~ ユーザのホームディレクトリより上位の階層を非表示にする
# !adm以外のグループのユーザに対して適応される
DefaultRoot                     ~ !adm
# 認証成功前にServerNameで設定したサーバ名を表示するかどうかを指定
# 認証前に見せる場合はoff
DeferWelcome                    off
# ファイルのタイムスタンプをGMTにするかどうかを指定
# しない場合はoff
TimesGMT                        off
# 認証成功後に表示するメッセージを指定
AccessGrantMsg                  "User %u logged in\n"
# >USER xxx
# 331 Password required for xxx
# >PASS [xxxxxx]
# 230 User xxx logged in
# rootユーザによるログインを許可する
# 許可する場合on
# ただし、/etc/ftpusers からrootユーザのエントリを削除しないとログインできない。
RootLogin                       off
# Globalディレクティブは仮想サーバで共通な設定を行う際に利用する。
<Global>
  Umask                         022
  AllowOverwrite                yes
  <Limit ALL SITE_CHMOD>
    AllowAll
  </Limit>
</Global>
<Limit LOGIN>
  Order allow,deny
  Allow from 127.0.0.1,192.168.215.0/24
  Deny from all
</Limit>
# Anonymous FTP の設定
# Anonymous ディレクティブには公開するディレクトリを指定する
# この場合ftpユーザのホームディレクトリ配下のftpというディレクトリが公開される
<Anonymous ~ftp>
User ftp
Group ftp
UserAlias                       anonymous ftp
</Anonymous>

TCPWrapperを有効にしている場合は、/etc/hosts.allowに接続許可指定を行う。
in.proftpd: 192.168.215.

2013/03/10

FTP接続許可

iptablesでFTPサーバへの接続を許可したい場合の設定について記載します。
通常であれば以下の通りルールを追加すればよいのですが、実はFTPの場合これだけではうまく接続できません。

 # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
とりあえずルールを保存します。
 # iptables-save > /etc/sysconfig/iptables
ここが重要なのですが、FTPを通すにはip_conntrack_ftpip_nat_ftpの2つのモジュールをロードする必要があります。これらのモジュールのロードに関する設定は、/etc/iptables/iptables-configファイルに記述します。
IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"

設定が完了したらiptablesを再起動し、正常にモジュールがロードされているか確認します。
 # lsmod
 Module                  Size  Used by
 nf_nat_ftp              2602  0
 nf_conntrack_ftp       10475  1 nf_nat_ftp