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

2016年1月11日月曜日

同一ネットワーク内で応答可能なマシンを調べる方法

コマンド

  • fping -g 192.168.1.0/24

結果

192.168.1.1 is alive
192.168.1.2 is alive
192.168.1.55 is alive
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.6 is unreachable
...

DHCP の環境に RaspberrPi を接続したときとかルータ配下に何台マシンがぶら下がっているとか調べたいときに使えます
IP からマシン名もわかると更にいんですが

2015年9月11日金曜日

今更ながら ssh-agent の使い方について

概要

タイトルの通り
ssh-agentの使い方を紹介します
ssh-agentは簡単に言うとパスワードをキャッシュする感じの機能
ssh-agentにパスワードを登録しておくと ssh の度にパスワードを入力しなくてよくなります

環境

  • CentOS 6.6 64bit
  • ssh-agent OpenSSH 5.3p1

使い方

まずは起動します

ssh-agent bash

引数には起動するシェルを指定します
存在しないシェルを指定すると「hoge: No shuch file or directory」みたいなエラーが出ます

起動したらパスワード情報を登録します

ssh-agent /path/to/secretkey

secretkeyという秘密鍵を使って ssh することを想定しています
この秘密鍵のパスワードを入力します
パスワードの入力に成功すると「Identity added: …」と表示されます

この状態になったらこれまで secretkey を使って ssh していたサーバに接続してみましょう

ssh host001

これでパスワードを入力しないでログインできることが確認できると思います
これまでは「ssh -i /path/to/secretkey host001」としてパスワードを入力してログインしていたのが、それをしないでよくなりました

最後に

ssh-agentは起動後に exit とかで抜けてしまうと停止してしまいます
なので再ログインしたときにはss-agentの起動から実施する必要があります
よくあるケースだと .bashprofile に書いておくとかでしょうか

あと Mac だとキーチェーンを使えばこれを勝手にやってくれます
ターミナルとかで ssh すると「キーチェーンアクセスを使いますか」的なダイアログが出て、OKにすると今後パスワードの入力なしでログインできるようになるあれです

2015年2月26日木曜日

sedコマンドを使って指定した行の次の行に任意の文字列を追加する

概要

タイトルの通り
ある行の後ろにピンポイントで追記したいときってあると思います
いちいちvimやemacsを開くのも面倒なのでsedコマンドで追記してみました

環境

  • CentOS 6.6 64bit (Final)
  • sed 4.2.1

使い方

実際のコマンドと挙動は以下の通りです

テスト用ファイル

cat text.txt

hoge
hoge1
hoge2
hoge3
hoge4

3行目の後ろに追記する

sed '3a hoge-add' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

or

sed '3N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

指定した正規表現に該当する次の行に追記する

sed '/hoge2/a hoge-add' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

or

sed '/hoge2/N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

ちょっと解説

どちらも2パターン紹介してしますが「a」コマンドを使うほうがどちらも断然簡単です

「a」コマンドは

text を追加する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。

「N」コマンドは

入力の次の行をパターンスペースに読み込む/追加する。

がそれぞれのコマンドの説明です
aコマンドは直感的でかつ単純です
Nコマンドが少々挙動が複雑でかつ指定方法も難読です

aコマンドは特に説明することはないと思います

Nコマンドを使って行を指定して追記する場合は「3N;」のように指定します
「3」の部分はそのまま行数に該当するので4とすれば4行目の次の行に追記することができます
置換する文字列は「\n」で改行を指定しています
今回はLinux上で挙動を確認したので「\n」LFの改行コードを指定いますがWindows環境のファイルなどで改行コードが「\r」の場合はそちらを指定してください
置換後の文字列の前後にも改行コードを入れることで行の追加を実現しています

また正規表現の方は「/hoge2/N;」といった感じで指定します
こっちの挙動が若干思った通りの挙動にはなりません
思った通りの挙動にならないのはNコマンドの説明を理解するとよくわかるのですが、Nコマンドは次の行を対象に置換を実行します
サンプルでは「hoge2」に該当する行が1行しかないので問題ないのですが例えば以下のように実行すると結果が飛び飛びになっていることがわかると思います

sed '/hoge/N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge-add
hoge1
hoge2
hoge-add
hoge3
hoge4
hoge-add

Nコマンドは1行目のhogeが見つかったら2行目のhoge1の行に対して置換を実行します
そして次に評価する行はhoge2の行になります
hoge2が評価されるとhoge3の行に対して置換が実行されるので評価が飛ばされます
そしてその次はhoge4が評価される、といった挙動になります
なので結果として飛び飛びの結果になった感じです

今回の目的は該当する各行に対して追記ことなのでNコマンドはそもそもユースケースに合わないと思います
じゃあなんで紹介したんだと言われると、たまたま見つけちゃったのでどうせなら紹介しちゃおうかなと思ったからです

あと今回は上書きしてないですが、上書きしたい場合は「-i」オプションを付ければOKです

2014年12月12日金曜日

シェルスクリプトでlog4jみたいにロギングできるスクリプトがあったので試した

概要

これを試してみました

環境

  • CentOS 6.3 64bit
  • bash 4.1.2

使い方

  • 適当な場所に配置
cd /var/tmp
wget http://www.mitchy-world.jp/itmemo/shell/download/06.zip
unzip 06.zip
cd 06
  • ログの出力先を変更
    emacs common1.sh
    以下を好きなフルパスに変更してください
LOG_DIR=`pwd`"/"
  • サンプルを試す
cd /var/tmp/06
sh log4jtest1.sh
cat SHELL-001.log

SHELL-001.logというファイルができているので中身を確認するとログがでています

  • ログレベルを変更する
    emacs common1.sh
SYSTEM_LOG_LEVEL=DEBUG

で再度log4jtest1.sh実行するとDEBUGレベルのログも出力されるようになります

  • 独自のスクリプトから使ってみる
    emacs test.sh
#!/bin/bash                                     

. ./common1.sh

logDebug "app" "this is a debug log"

test.shを実行するとapp.logというファイルができていると思います
LogLevelはDEBUGに変更してから実施してください、LogLevelがINFOだとファイルが出力されません
ポイントは. ./common1.shでこれが書いていないとそもそもダメです

以上、簡単でした
common2.shというファイルもありますが結果は同じになります
関数の戻りがechoorreturnの違いでした

2014年7月31日木曜日

指定したプロセスの実行経過時間を取得して秒変換するシェルスクリプト

何それって感じですがメモしておきます
OneLinerで記載しているのはzabbixのUserParameterで使いたかったから
絶対もっと簡単に取得する方法があるんだろうなと

TIME=`ps aux | grep PushToUsers | grep -v 'grep' | awk {'print $10'} | tail -n 1`; if [ -n "$TIME" ]; then echo $TIME | awk -F ':' '{if ($1 != 0) print ($1 * 60) + $2; else print $2;}'; else echo 0; fi;

OneLinerではなくフォーマットすると

TIME=`ps aux | grep hogehoge | grep -v 'grep' | awk {'print $10'} | tail -n 1`
if [ -n "$TIME" ]
then
  echo $TIME | awk -F ':' '{if ($1 != 0) print ($1 * 60) + $2; else print $2;}'
else
 echo 0
fi;

hogehogeの部分に監視したいプロセス名を指定します

2014年6月1日日曜日

shUnit2にパッチをあててJUnit形式のXMLファイルを吐けるようにしてみた

  1. https://code.google.com/p/shunit2/issues/detail?id=16 にアクセス
  2. 上記に添付してある shunit-2.1.6-xml.patch をダウンロード
  3. patchファイルをshunit2と同じディレクトリに配置
  4. [root@localhsot work]$ ls -ltr
    合計 100
    -rw-r--r-- 1 root   root   20944  5月 29 16:55 2014 shunit-2.1.6-xml.patch
    drwxr-xr-x 5 nifbat nifbat  4096  5月 29 16:59 2014 shunit2-2.1.6
    
  5. 以下のコマンドでパッチを当てる
  6. patch -u -p1 -d shunit2-2.1.6 < shunit-2.1.6-xml.patch
  7. パッチがあたることを確認する
  8. patching file bin/gen_test_results.sh
    patching file bin/which
    patching file lib/versions
    patching file src/shunit2
    patching file src/shunit2_test.sh
    patching file src/shunit2_test_asserts.sh
    patching file src/shunit2_test_failures.sh
    patching file src/shunit2_test_macros.sh
    patching file src/shunit2_test_misc.sh
    patching file src/shunit2_test_standalone.sh
    
  9. tempファイルをカレントディレクトリに作成しようとして権限がないと怒られるので「shunit2-2.1.6/src/shunit2」の以下も修正
  10. 1143 __shunit_system_out=$(mktemp 'shunit-out.XXXX')
    1144 __shunit_system_err=$(mktemp 'shunit-err.XXXX')
    ↓
    1143 __shunit_system_out=$(mktemp '/tmp/shunit-out.XXXX')
    1144 __shunit_system_err=$(mktemp '/tmp/shunit-err.XXXX')
    

パッチあてが完了したら実行する際に
export SHUNIT_OUTPUTDIR="/tmp" && sh testHoge.sh
みたいな感じで SHUNIT_OUTPUTDIR を export するようにしてください
そうしないとXMLファイルは標準出力に出力されてしまいます

2014年5月31日土曜日

シェルスクリプトでUnitテストをやってみた

シェルのUnitテストフレームワークに「shUnit2」というものがあります
今回はこれを使ってシェルスクリプトをテストする方法を紹介します

■環境
CentOS release 5.10 (Final)
bash 3.2.25
shUnit2 2.1.16

■shUnit2のインストール
wget https://shunit2.googlecode.com/files/shunit2-2.1.6.tgz
tar zvxf shunit2-2.1.6.tgz

※ダウンロードして解凍すれば完了です
※テストコードから参照できる場所に配置してください

■サンプルテスト
解凍した「shunit2-2.1.6」と同じ階層にサンプルテスト用のシェルスクリプト(testSample.sh)を作成します
[root@localhost work]# ls -ltr
合計 76
drwxr-xr-x 7 1001 users  4096  5月  2  2011 shunit2-2.1.6
-rw-r--r-- 1 root root  61558  5月  2  2011 shunit2-2.1.6.tgz
-rw-r--r-- 1 root root     95  5月 29 08:48 testSample.sh

testSample.shの内容は以下の通りです
#! /bin/sh

oneTimeSetUp() {
  echo "Start testSample.sh"
}

setUp() {
  echo "Start each test method"
}

testSample1() {
  assertEquals 1 1
}

testSample2() {
  cd /root && ls -ltr 2>&1 > /dev/null
  #assertEquals 0 $?
  assertEquals "This value is not 0" 0 $?
}

testSample3() {
  assertNull "This value is not null" ""
}

testSample4() {
  assertTrue "This value is not true" "[ 0 -eq 0 ]"
}

testSample5() {
  fail "This test is certainly error !"
}

tearDown() {
  echo "End of testSample.sh"
}

# load shunit2
. ./shunit2-2.1.6/src/shunit2

sh testSample.sh
と実行するとテストが実行されます

■Tips
使用できるアサート系一覧
  • assertEquals・・・等しい
  • assertNotEquals・・・等しくない
  • assertSame・・・assertEqualsと一緒
  • assertNotSame・・・assertNotEqualsと一緒
  • assertNull・・・null(空白文字列)かどうか
  • assertNotNull・・・null(空白文字列)かではない
  • assertTrue・・・trueかどうか
  • assertFalse・・・falseかどうか

assertHogehogeの第一引数に文字列を追加すると失敗した際にそのメッセージを表示してくれる

わざと失敗に倒す場合は「fail」を使用します

Setup/Teardown メソッドが使えます
「setUp」は各テストが実施される前に実行されます、oneTimeSetUpは事前に1度だけ実施されます

■参考サイト

2013年10月24日木曜日

shellでjsonをパースする方法(メモ)

■概要
https://github.com/dominictarr/JSON.sh
を使用した方法を紹介します

■環境
CentOS 5.9
bash 3.2.25
Linux kernel 2.6.18-238.el5 x86_64

■設定(インストール)
wget https://github.com/dominictarr/JSON.sh/archive/master.zip
unzip master.zip
mv JSON.sh-master/ /usr/local/
ln -s JSON.sh-master/ json_parse
cd /usr/sbin/
ln -s /usr/local/json_parse/JSON.sh json_parse

■動作確認
echo '{"key":"value","key2":"value2","key3":{"food":"potate"}}' | json_parse -b
["key"] "value"
["key2"]        "value2"
["key3","food"] "potate"

「-b」を指定すると入力したjson情報は出力しません

2013年5月24日金曜日

lsyncdインストールスクリプト

https://gist.github.com/kakakikikeke/5643498

以下を実施してくれます
  • sshの公開鍵認証設定
  • rpmforgeからのlsyncdのインストール
  • lsyncd設定ファイルの配備

2013年4月3日水曜日

【メモ】オレ流CLASSPATHの管理方法

.bashrcに以下を追記
CLASSPATH="."
for i in `find /usr/local/java/lib/ -name "*.jar"`; do CLASSPATH=$CLASSPATH":"$i; done;
export CLASSPATH
/usr/local/java/lib/で必要なjarファイルを一括管理(何か追加があった場合はここにどんどん追加していく)

という風にすると起動時または source .bashrc でCLASSPATHを更新することができる
アスタリスクでフォルダ指定すればいいじゃんってのもあるんだけどCLASSPATHがアスタリスクだとアプリ側で対応してない場合があったのでこの方法にしました
これが俗にいうmavenリポジトリってやつなのか・・・w

2013年2月19日火曜日

2013年1月20日日曜日

2013年1月18日金曜日

【シェルスクリプト】ホスト名とユーザを判断して実行するif文

if [ `hostname` == 'yoshi3' -a `whoami` == 'root' ]
then
  hostname
else
  echo "NG"
fi

備忘録として書いておいきます

2013年1月15日火曜日

公開鍵認証sshをパスワード認証sshに切り替えるシェルスクリプト

#!/bin/sh
sed -i -e "s/^PermitRootLogin/\#PermitRootLogin/g" /etc/ssh/sshd_config
sed -i -e "s/^PasswordAuthentication/\#PasswordAuthentication/g" /etc/ssh/sshd_config
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
echo "password" | passwd --stdin root

CentOSベースのスクリプトになります

AWSやニフティクラウドのように起動時にシェルスクリプトが実行できる環境があれば
サーバを起動した直後にパスワード認証に変更することも可能になります

ただ、当たり前ですがセキュリティ的にはあまくなりますので、
その辺は自己責任で使用してください。

基本的には救済のときに使用する感じですかね

お試しあれー

2012年11月1日木曜日

【CentOS 5.8】sendmailを使ってGmailにメールを送信する方法

service sendmail start
echo "test" | mail -v -s "test" yourname@gmail.com -- -f yourname@gmail.com

■条件(だと思われる部分)
  • インターネットに対して名前解決ができる
  • fromは指定しないと迷惑メールとして扱われてしまうため必須
  • ※必須だと思っていたがどうやらfrom設定しても迷惑メールになってしまう様子wあきらめましょう

2012年7月14日土曜日

egrepで空行とコメントを削除して表示する方法

egrep -v "^#" /etc/ssh/sshd_config | egrep -v "^$"

いつも忘れるのでメモw

あとはオリジナルのコマンド化もしてみました

mkdir /usr/local/exgrep
cd /usr/local/exgrep
emacs exgrep.sh

以下を記載する
#!/bin/sh
if [ $# -ne 1 ]; then
    exit 1;
fi
egrep -v "^#" $1 | egrep -v "^$"

chmod 744 exgrep.sh
cd /usr/bin/
ln -s /usr/local/exgrep/exgrep.sh exgrep
exgrep /etc/httpd/conf.d/ssl.conf

でコメントと空行が削除された状態で表示されるはずです
参考までに

2012年6月2日土曜日

lsofを監視するツール

#!/bin/sh
if [ $# -ne 1 ]; then
  echo "Please input hostname"
  exit 1;
fi

echo "lsof agent start !"
JPS=`jps | grep Bootstrap | awk '{print $1}'`
PID_FILE="lsof_agent_$1.pid"
if [ $JPS ]; then
  touch $PID_FILE
  while :
  do
    if [ -f $PID_FILE ]; then
      LOG_FILE=`date "+%Y%m%d"`_lsof_agent_$1.log
      LSOF=`lsof | grep $JPS | wc -l`;
      LSOF_ALL=`lsof | wc -l`;
      echo `date "+%Y%m%d %H%M%S"` $LSOF $LSOF_ALL >> $LOG_FILE;
      sleep 2;
    else
      exit 1;
    fi
  done
else
  echo "not found JPS...";
fi

※シェルスクリプトの名前は「lsof_agent.sh」としてます

■概要
開いているすべてのファイル数とJVM上で動作しているtomcatが開いているファイル数を監視し続けます
「日付_lsof_agent_hostname.log」というファイルにlsofの結果を出力し続けます
ログファイルは日付をまたぐと自動でローテートしてくれます
実行すると「lsof_agent_hostname.pid」というファイルができるのて停止する場合にはこのファイルを削除します

■使い方
./lsof_agent.sh hostname &

lsofの結果をgrepしているだけではあるので必要に応じてgrepする項目を変更していただければと思います
ちなみにlsofは基本的にroot権限がないと実行できないので、rootで実行してください

2012年5月28日月曜日

【シェルスクリプト】ファイルが空かどうか確認する方法

#!/bin/sh

if [ -s ./test ]; then
    cat ./test
else
    echo "no date..."
fi

でチェック可能です。
「-s」オプションがファイルのサイズを調べるオプションになっています
上記のサンプルはファイルに何かしら記載のある場合はその情報をcatし何もない場合は「no data」と出力するプログラムになっています
お試しあれ