2010-03-01から1ヶ月間の記事一覧

MACアドレスを調査する

#!/bin/sh #getmacadd.sh if [ $# -ne 1 ]; then echo "使用方法 : getmacadd.sh IPアドレス(第三オクテットまで)" exit 1 fi for i in $(seq 1 254); do ping -c 1 $1.$i > /dev/null 2>&1 [ $? -eq 0 ] && arp -n $1.$i | sed '1d' done 192.168.1.1 00-??…

pingを自動で実行する

#!/bin/sh #getconnect.sh ipaddress=$(expr $1 : '\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.\).*') startip=$(expr $1 : '.*\.\([0-9]\{1,3\}\)$') stopip=$2 if [ $# -ne 2 ]; then echo "Usage: getconnect.sh startIPaddress EndIPaddress" exit 1 …

一定量に達したディレクトリをtarとgzでまとめる

#!/bin/sh #autotar.sh ディレクトリ名 [ディレクトリ名...] #limit(単位はキロバイト)に指定した容量に達しているディレクトリを #tarとgzipで圧縮する limit=1000 dir=$* for str in `ls -d $dir`; do line=`du -sk $str` set -- $line match=`echo "$2" |…

MTUを調べる

#!/bin/sh #chkmtu.sh #1500からICMPヘッダ28バイトを引いた1472を初期値とし #1バイトずつ減らしていくことでパケットが分割されずに #相手先に送信できるMTUを探す ipaddr="www.google.co.jp" nic=eth0 echo "Please wait..." for i in `seq 1472 -1 0`; d…

コマンドを実行しその結果をメールで送信する

#!/bin/sh #commandmail.sh -a 送信先メールアドレス -c 実行するコマンド -s メールの題名 address="root@localhost" subject="Command results" while [ -n "$1" ]; do case $1 in -a) address="$2" shift 2 ;; -c) command="$2" shift 2 ;; -s) subject="…

自分のホストの完全修飾名を調べる

#!/bin/sh #fgdn.sh _IFS="$IFS" DOMAIN_ONLY=NO #hostnameの結果を.で区切り引数リストにセット host=`hostname` IFS="." set -- $host IFS="$_IFS" [ "$1" = "-d" ] && DOMAIN_ONLY=YES if [ $# -eq 1 ]; then host=$1 set -- `grep 'domain[ \t]' /etc/re…

ホスト名からIPアドレスを調べる

#!/bin/sh #host2ip.sh host_name r_host(){ set -- `host $1` shift `expr $# -1` case $1 in *\(NXDOMAIN\)) return 1 ;; *) echo $1 esac } r_nslookup(){ set -- `/usr/sbin/nslookup $1 2> /dev/null | sed -n '/^Name:/ { n p }'` if [ -n "$2" ]; the…

IPアドレスからホスト名を調べる

#!/bin/sh #ip2host.sh IP_address r_host(){ set -- `host $1` shift `expr $# -1` case $1 in *\(NXDOMAIN\)) return 1 ;; *) expr "$1" : "\(.*\)\." esac } r_nslookup(){ set -- `/usr/sbin/nslookup $1 2>/dev/null | grep '^Name:'` if [ -n "$2" ]; …

TCP/UDPソケットにアクセスする

#!/bin/sh #www_get.sh #urlからホスト名だけを抜き出す url="$1" host=`expr "$1" : "http://\([^/]*\)"` cat << EOF | nc $host 80 | sed "1,/^\$/d" GET $url HTTP/1.0 EOF $ ./www_get.sh http://www.yahoo.co.jp/ | head …

電子メールを送信する

#!/bin/sh #mail_send.sh #メッセージを標準入力から受け取り、漢字コードの変換 #ヘッダのMIMEエンコードを行った後標準出力に書き出す if [ -x /usr/sbin/sendmail ]; then SENDMAIL_PATH="/usr/sbin/sendmail" elif [ -x /usr/lib/sendmail ]; then SENDM…

リモートホストが動作しているかを監視する

#!/bin/sh #is_host_alive.sh host_name PING="ping" PING_OPT="-c 1" PING_ALIVE='0%' $PING $PING_OPT $1 | grep -q "$PING_ALIVE" if [ $? -eq 0 ]; then echo $1 is alive exit 0 else echo $1 is not avive exit 1 fi $ ./is_host_alive.sh localhost l…

ロックファイルを用いて排他制御を行う

#!/bin/sh #lock.sh LOCKDIR=/tmp/lock.sh.lockdir COUNTFILE=/tmp/lock.sh.count #共有ファイルを読み込み内容に1を加えて書き込む count(){ #引数がlockの場合ロックディレクトリを使い排他制御する if [ "$1" = "lock" ]; then until mkdir $LOCKDIR 2> /…

シグナルを使って他のプロセスと通信する

#!/bin/sh #ps_log.sh - psコマンドの実行結果を定期的に記録 PS_LOG=/tmp/ps.log #記録を開始する関数 do_start(){ echo "=== `date` : start logging" >> $PS_LOG do_log=YES } #記録を停止する関数 do_stop(){ echo "=== `date` : stop logging" >> $PS_L…

名前つきパイプを使って他のプロセスと通信する

#!/bin/sh #np_server.sh - サーバプロセス PIPE="/tmp/np_server.pipe" SVER=1 cleanup(){ echo "Cleanup" >&2 [ -p $PIPE ] && rm $PIPE exit } if [ -e $PIPE ]; then echo "Named pipe $PIPE already exist." echo "If it is sure that server in not ru…

スクリプトが使用する計算機資源を制限する

#!/bin/sh #ulimit.sh #CPU時間を制限する ulimit -t 1 i=1 while true; do i=`expr $i \* -5 + 20` done

スクリプトを中断できないようにする

#!/bin/sh #trap_int.sh #INTシグナルを無視する trap 'echo "SIGINT was ignored."' INT for i in one two three four five; do echo $i sleep 1 done $ ./trap_int.sh one two SIGINT was ignored. three SIGINT was ignored. four SIGINT was ignored. fi…

スクリプトが中断されたときに後始末をする

#!/bin/sh #trap_exit.sh #終了時に呼び出される関数 cleanup(){ echo "Doing cleanup jobs." [ -n "$tmpfile" ] && rm "$tmpfile" } #シグナルを受信したときにcleanupを実行 trap cleanup EXIT tmpfile=`mktemp /tmp/tmp.XXXXXXXX` || exit 1 echo "Press …

プロセスの優先度を指定してコマンドを実行する

#!/bin/sh #nice.sh #システムに負荷をかける関数 do_load(){ while true; do gzip -9 -c /usr/bin/sh 2> /dev/null done } do_load & bgpid=$! #異なるnice値で同じプログラムを実行 time nice -n 0 gzip -9 -c /usr/bin/sh 2> /dev/null time nice -n 10 g…

プロセスが終了するのを待つ

#!/bin/sh #wait.sh #この関数を子プロセス(サブシェル)として実行する sub_process(){ echo "Sub-process: start" sleep 5 echo "Sub-process: end" } sub_process & #子プロセスをバックグランドで実行 wait $! #子プロセスが終了するのを待つ $!はプロセ…

特定のコマンドが実行されているか調べる

#!/bin/sh #lsdaemon.sh DAEMONS="cron crond cupsd inetd lpd named nmbd ntpd smbd sshd syslogd xinted" PSCMD="ps axcww" for daemon in $DAEMONS; do out=`$PSCMD | grep "\\<${daemon}\\>"` if [ -n "$out" ]; then status="RUNNING" else status="not…

テキストファイルに新たなフィールドを追加する

#!/bin/sh #bulkycalc.sh #入力ファイルには1行に1つずつ計算式を書く if [ $# -ne 1 ]; then echo "Usage: bulkycalc.sh input-file" exit 1 fi temp=`mktemp /temp/bulkycalc.XXXXXXXX` || exit 1 cat "$1" | bc > "$temp" #計算を行う paste -d "$1" "$te…

更新日時からファイルを検索する

#!/bin/sh #find_by_date.sh gnudate=`which gnudate` [ -z "$gnudate" ] && gnudate="date" cleanup(){ [ -n "$start_tmp" ] && rm "$start_tmp" [ -n "$end_tmp" ] && rm "$end_tmp" } if [ $# -ne 2 ]; then echo "Usage: find_by_date.sh dir date" exit…

絶対パスを相対パスに変換する

#!/bin/sh #abspath2rel.sh if [ -z "$1" ]; then echo "Usage: abspath2rel.sh abs_path" exit 1 fi if [ `expr x"$1" : x'/'` -eq 0 ]; then echo "$1: not an absolute path" exit 1 fi org=`expr x"$PWD" : x'/\(.*\)'` abs=`expr x"$1" : x'/\(.*\)'` r…

ファイル名の拡張子を変更する

#!/bin/sh #chgext.sh if [ $# -lt 2 ]; then echo "Usage: chgext.sh .newext files..." exit 1 fi newext="$1" shift #新しい拡張子が.で始まっていない場合付け加える expr "$newext" : '\.' > /dev/null || newext=".${newext}" for fname do bname=`ech…

SSHによるポート転送

シェルスクリプトへのシンボリックリンクを下記のように作成する これで同じスクリプトを違う名前のシェルスクリプトとして呼び出せる $ ln -s mk_tunnel.sh tunnel_smtp.sh $ ln -s mk_tunnel.sh tunnel_pop.sh $ ln -s mk_tunnel.sh tunnel_imap.sh#!/bin/…

ファイルの中身に行番号を付ける

#!/bin/sh #add_lineno.sh lineno=1 IFS=" " while read -r line; do printf '%6d %s\n' ${lineno} "${line}" lineno=$(expr ${lineno} + 1) done < "$1" if [ "${line}" != "" ]; then printf '%6d %s' ${lineno} "${line}" fi

ドメイン名を逆順にする

#!/bin/sh #name_reverse.sh name_reverse () { local ret while [ $# -gt 0 ]; do ret="${1}.${ret}" shift done echo "${ret}" | sed 's/.$//' } while read address others; do oldifs="${IFS}" IFS="." reversed=$(name_reverse ${address}) IFS="${oldi…

メール差出人リスト作成

#!/bin/sh #fromlist.sh mailfile (MHやMaildirのように1つのメールに1つのファイルが前提) while [ $# -gt 0 ]; do cat "$1" | while read header value; do case "${deader}" in "") break ;; from:) echo "${value}" break ;; esac done shift done | sor…

ログのローテーション

#!/bin/sh #logrotate.sh FILES="$HOME/log/foo $HOME/log/bar" MAX_LEVEL=6 MV=mv COMPRESS_CMD=gzip COMPRESS_SFX=.gz for file in ${FILES}; do level=${MAX_LEVEL} while [ ${level} -gt 1 ]; do dst="${file}.${level}${COMPRESS_SFX}" level=$(expr ${…

改行コード/文字コードを変換する

#!/bin/sh #dos2unix.sh filename file="$1" cat "${file}" \ | tr -d '\015' \ | iconv -f Shift_JIS -t EUC-JP > "${file}.tmp" mv "${file}.tmp" "${file}" #!/bin/sh #unix2dos.sh filename file="$1" CR=$(echo -ne '\015') cat "${file}" \ | sed 's/$…