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

2016年1月1日金曜日

curlでHTTPのステータス、ヘッダ、ボディを分割してファイルに保存

curlで任意のHTTPのステータス(レスポンス時間など)、ヘッダ、ボディを分割してファイルに保存する場合のメモ。

$ now=`date +"%Y%m%d%H%M%S"`
$ url="http://example.com"
$ file="test"

$ curl -s -v -w "{ \"time\":\"${now}\", \"response\" : %{time_total}, \"status_code\" : %{http_code}  }" \
-X POST \
"${url}" \
-o ${file}_body \
2> ${file}_header \
> ${file}_status

2013年6月19日水曜日

sshを使い、踏み台越しのweb閲覧、scpを実現


 sshを使い以下2つを実現することを目的とする
 ◆ 踏み台サーバ経由のweb閲覧
 ◆ 踏み台サーバ経由のscp

 ※linuxでiptablesを使い同様のことを実現することもできるだろう
 (参考) iptablesでhttp, ssh通信をNAPTしてフォワーディング



踏み台サーバ経由のweb閲覧
● 目的
localは自分がいる環境であり、仮にwindowsを使っているとする。
step1はssh(22/tcp)ポートをオープンしているlocalからのアクセスを許可する
踏み台サーバである。

step2はssh(22/tcp)ポートをオープンしているstep1からのアクセスを許可する
踏み台サーバである。
つまりstep1とstep2の2つの踏み台がある。

server1はhttp(80/tcp)を提供しているサーバであり、
step2からしか閲覧を許可していない。

この状況でlocalからブラウザでserve1のWEBコンテンツを閲覧する。

これはsshのポート転送(ポートフォワーディング)を利用して実現できる。
多段sshログインとも呼ばれているやつである。


● 簡易構成
+-------+
| local | 
+-------+
   ↓
+-------+
| step1 | 踏み台サーバ
+-------+ ssh(22/tcp)
   ↓
+-------+
| step2 | 踏み台サーバ
+-------+ ssh(22/tcp)
   ↓
+-------+ 
|server | web公開サーバ
+-------+ http(80/tcp)


● 実現手段
sshを利用して接続する。

+-------+
| local | 10080/tcp  ssh -L 10080:localhost:20080 username@step1・・・①
+-------+
   ↓
+-------+
| step1 | 20080/tcp  ssh -L 20080:server:80 username@step2・・・②
+-------+ 
   ↓
+-------+
| step2 | 
+-------+
   ↓
+-------+
|server | 
+-------+


①はlocalで実施する。
puttyなり、teratermを使っていれば、
ソースポートを10080/tcp、
送り先をstep1:20080/tcp
にして、step1へssh接続すればばよい。
localで10080/tcpポートが開く。
step1上で20080/tcpポートがこの段階で開くわけではない。

②はstep1にて実行する。
step1の20080/tcpポートにアクセスし、step2経由で、
server1の80/tcpへ接続する。

以上の対応でlocal上でserverのhttp(80/tcp)コンテンツを閲覧できる。
http://localhost:10080/



踏み台サーバ経由のscp
● 目的
collectサーバにserver1~2サーバ上のログをscpを利用して収集する。


● 簡易構成
      +-------+
      |collect| ログを収集するサーバ
      +-------+
          ↓
      +-------+
      | step  | 踏み台サーバ
      +-------+ ssh(22/tcp)
          ↓
+-------+   +-------+
|server1|   |server2| ログのある各種サーバ群
+-------+   +-------+ ssh(22/tcp)


●  手動試験1
collect上で以下コマンドを実施し、
まずは、server1サーバ上のログを取得する。
collectの10022/tcpポートにアクセスし、step経由で、
server1の22/tcpへ接続する。
# ssh -p 22 -t -t -L 10022:server1:22 root@step

あとは、collect上でローカル上の10022番ポートへ接続すれば
server101サーバの/var/log/test_srcファイルを
collectサーバの/var/log/test_dstとしてscpできるはずである。
# scp -P 10022 root@localhost:/var/log/test_src /var/log/test_dst


●  手動試験2
server102のログも取得する。
既に利用している10022ポートは使えないため、別のポートを利用するか、
または先ほどのコネクションを切っておく。今回は後者を選択するとする。
# ssh -p 22 -t -t -L 10022:server2:22 root@step

あとはscpするだけだが、今回は警告が出て接続ができないはずである。
# scp -P 10022 root@localhost:/var/tmp/test_src /var/tmp/test_dst
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

最初、collectはlocalhost(自分)に接続してstepのポート転送によってserver1へ接続した。
今回、collectは同様にlocalhost(自分)に接続しているにもかかわらず、
ポート転送によってserver2へ接続し、ホストとIPが一致していないと判断される。
~/.ssh/known_hostsで管理される情報に相違が出ているためである。
今回はこのファイルを編集するのではなく、UserKnownHostsFileキーのオプションで回避する。
ついでにStrictHostKeyCheckingキーも付与して初回ログイン時の接続案内yes/noも出なくする。

# scp -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-P 10022 root@localhost:/var/tmp/test_src /var/tmp/test_dst


● 自動化
collect上のcronなどに登録させて定期バッチ処理としてさせる必要も出てくるだろう。
例として以下のようなツールを動かせばいいだろう。
パスフレーズの自動入力はexpectを利用してscpを自動化を参考にしてほしい。
#!/bin/sh

YESTERDAY=`date --date '1 days ago' '+%Y%m%d'`

for num in `seq 1 2`
do
  /usr/local/bin/ssh_auto.sh server${num} & 

  # sshでコネクションを張り終えるまでに少し時間がかかることを考慮する
  sleep 5

  /usr/local/bin/scp_auto.sh localhost /var/log/log*${YESTERDAY}* /var/log/

  pid=`ps aux | grep "spawn ssh -p 22 -t -t -L 10022" | grep -v grep  | awk '{print $2}'`
  kill $pid
done
内部で使っているssh_auto.sh, scp_auto.shツールは 先のリンクを元に容易に作れるだろう。 




(関連)

2011年7月13日水曜日

あるファイルのあるディレクティブの下段にawkを利用して一行追加


あるファイルのあるディレクティブの下段に追加で一行を追加させる。
awkを使ったのだが、久しぶりに書いたらてこずったのでメモしておく。

例えば下記のようなことをしたい。

【変更前】
# cat /etc/snmp/snmpd.conf
(略)
rwcommunity public 10.0.0.1
rwcommunity public 10.0.0.2
rwcommunity public 10.0.0.3

trapsink 10.0.0.1 public
trapsink 10.0.0.2 public
trapsink 10.0.0.3 public

trap2sink 10.0.0.1 public
trap2sink 10.0.0.2 public
trap2sink 10.0.0.3 public
(略)


【変更後】
# cat /etc/snmp/snmpd.conf
(略)
rwcommunity public 10.0.0.1
rwcommunity public 10.0.0.2
rwcommunity public 10.0.0.3
rwcommunity public 10.0.0.4 ← 追加

trapsink 10.0.0.1 public
trapsink 10.0.0.2 public
trapsink 10.0.0.3 public
trapsink 10.0.0.4 public ← 追加

trap2sink 10.0.0.1 public
trap2sink 10.0.0.2 public
trap2sink 10.0.0.3 public
trap2sink 10.0.0.4 public ← 追加
(略)


サーバが何台もあった場合、手動ではやってられないだろう。

上の例のようにファイルが共通であれば同じものをコピーするだけでいいだろう。
しかし追加する行は共通であるが、それ以外の設定はサーバごとに異なっている場合もあるだろう。

$ cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.YYYYMMDD

$ awk '{if (/rwcommunity/) {print; flag+=1} \
else if (!/rwcommunity/ && flag > 0) {flag=0; print "rwcommunity public 10.0.0.4"; print} \
else print}' /etc/snmp/snmpd.conf > /var/tmp/snmpd.conf1

$ awk '{if (/trapsink/) {print; flag+=1} \
else if (!/trapsink/ && flag > 0) {flag=0; print "trapsink 10.0.0.4 public"; print} \
else print}' /var/tmp/snmpd.conf1 > /var/tmp/snmpd.conf2

$ awk '{if (/trap2sink/) {print; flag+=1}  \
else if (!/trap2sink/ && flag > 0) {flag=0; print "trap2sink 10.0.0.4 public"; print} \
else print}' /var/tmp/snmpd.conf2 > /var/tmp/snmpd.conf3

$ diff /var/tmp/snmpd.conf3 /etc/snmp/snmpd.conf

$ mv /var/tmp/snmpd.conf3 /etc/snmp/snmpd.conf

$ /etc/init.d/snmpd restart

$ rm /var/tmp/snmpd.conf*

2011年3月31日木曜日

コマンド操作によるインターフェースの切り替え


ボンディングのモードをフォールトトレランス(アクティブ-バックアップ)として設定している場合、
プライマリのインターフェースがサーバごとにまちまちになっていると
トラフィック経路に違いがでるため、そろえておきたい。

方法としては2つある。
(1) サーバのインターフェースをダウン・アップさせる。
(2) サーバが接続されているスイッチのインターフェースを
シャットダウン・ノーシャットダウンさせる。

しかしこれ以外にも、サーバ側のコマンド操作で切り替えができることが分かった。


◆ 前提
eth0とeth1の2つのインターフェースでbond0を組んでいる。
eth0はアクティブであり、eth1がバックアップである。
サーバ側で"ifenslave"コマンドを用い、eth0をバックアップにeth1をアクティブに切り替える。



◆ 現状のインターフェースの確認
・ ボンディング状態の確認
# cat /proc/net/bonding/bond0
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0 ← アクティブはeth0である
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 5000
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: yy:yy:yy:yy:yy:yy




◆ ボンディングの切り替え
rootユーザで、"ifenslave"コマンドを実行する。
# ifenslave -c bond0 eth1

オプション 
-c : --change-active



◆ 切り替え後のインターフェースの確認
・ ボンディング状態の確認
# cat /proc/net/bonding/bond0
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 5000
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: yy:yy:yy:yy:yy:yy



・ ログからの確認
# tail -f /var/log/messages
(略) bonding: bond0: making interface eth1 the new active one.



2010年7月23日金曜日

topコマンドの少し詳しい使い方

topコマンドの少し詳しい使い方をまとめておく。

topコマンドを叩いて確認できるのは次の項目。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

しかし、それ以外にも確認したいリソースがあるわけだ。
例えばSWAPのサイズはどれぐらいなのか、など。


【確認項目の追加と削除】
◆ topコマンドを叩く
% top


◆ 確認項目の追加・削除画面へ遷移
"f"を押す

すると画面が切り替わり、次のように表示される。

Toggle fields via field letter, type any other key to return

* A: PID = Process Id
* E: USER = User Name
* H: PR = Priority
* I: NI = Nice value
* O: VIRT = Virtual Image (kb)
* Q: RES = Resident size (kb)
* T: SHR = Shared Mem size (kb)
* W: S = Process Status
* K: %CPU = CPU usage
* N: %MEM = Memory usage (RES)
* M: TIME+ = CPU Time, hundredths
b: PPID = Parent Process Pid
c: RUSER = Real user name
d: UID = User Id
f: GROUP = Group Name
g: TTY = Controlling Tty
j: P = Last used cpu (SMP)
p: SWAP = Swapped size (kb)
l: TIME = CPU Time
r: CODE = Code size (kb)
s: DATA = Data+Stack size (kb)
u: nFLT = Page Fault count
v: nDRT = Dirty Pages count
y: WCHAN = Sleeping in Function
z: Flags = Task Flags
* X: COMMAND = Command name/line

ディフォルトでは左に"*"がついている項目のみが表示される。


◆ 確認項目の選択
ここでSWAPも確認対象としたければ"p: SWAP"とあるように、"p"を押す。

左に"*"がついた。
* P: SWAP = Swapped size (kb)

チェックを外したければもう一度"p"を押せばよい。

選択が終われば"enter"を押す。


SWAPが増えている。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND



しかしながら、この設定は一時的なものであり、次にtopコマンドを打った際は反映されない。
◆ 現在の設定の保存
リアルタイムなリソースモニタ中に
"shift"+"w"を押す。

Wrote configuration to '$HOME/.toprc'

チェックした項目がファイルに保存される。


topコマンドでのモニタでは一画面分しか確認できない。
そこで結果をファイルに出力させる。
◆ ファイルへの書き出し
% top -n 1 -b > file.txt

・オプション
-d 秒数 指定した秒数ごとに表示を更新する
-n 回数 指定した回数分だけを表示する
-p プロセスID 指定したプロセスIDのみを表示する

2010年6月15日火曜日

logを追いかけるときに便利な小ワザ


linuxでログを追いかけ、特定の文字列が出た場合にアクションをとりたい。
ログ監視をしかけるほどでもなく、暫定的にしばらく見る必要がある場合などに
便利なコマンドをメモ。


◆ "ERROR"行でかつ"timeout"が含まれていたら、ビープ(beep)音を鳴らす。
% tail -f ./hoge | grep --line-buffered "ERROR" | sed -u "s/timeout/timeout\a/g"
ERROR timeout ← ビー!!


◆ "ERROR"行でかつ"timeout"が含まれていたら、その文字列を赤くして、
 ビープ音を鳴らす
% tail -f ./hoge | awk '/ERROR/{if($0~/timeout/){print "\033[0;31m"$0"\033[0m\a"}else{print}}'
ERROR timeout ← ビー!!