Octopress Blog

自分のためのまとめブログ

20130419 第14回「ネットワーク パケットを読む会(仮)」

第14回「ネットワーク パケットを読む会(仮)」に参加しましたので覚書です。 ネットワークキャプチャ関連の覚書はここのページに順次追記していきます。


フレッシャーズのためのパケット解析入門 (hebikuzure さん)

なんとなくフワッと使っていた単語をイメージで捉える。

パケット通信方式

連続データを一定量ずつ蓄積して1個の伝送単位にして、伝送路の開いているタイミングで送出、 受信したデータを元の連続データに復元する方式。

パケット

パケット通信方式における情報の伝送単位

イメージ

単語 例え
連続データ 水道から流れ出てている水
伝送単位(パケット) 水を入れたペットボトル

パケット通信は水道水をペットボトルに入れて運ぶみたいなイメージ


パケット解析とは

  1. パケットキャプチャをする
  2. キャプチャしたパケットを上位のプロトコルごとにその内容を解析する

パケットキャプチャ

パケット一つ一つに含まれるデータを記録する

パケットに含まれているデータ

  • 送信元
  • 送信先
  • サイズ(パケット長)
  • データの種類(上位プロトコル)

キャプチャされる場所(〜モデル)

OSI参照モデル

  • ネットワーク層
  • データリンク層

TCPモデル(IETF)

  • リンク層

パケットをキャプチャする場所(実際の場所)

  • 対象デバイス内? or デバイス外?

    • 実際の現場ではデバイス外でキャプチャすることが多い
      →Android、iOS、テレビ、ゲーム機などはそもそもデバイス内でキャプチャを取ることができないことがほとんど

    • 学習、研究、トラブルシューティングはデバイス内で行える

  • 対象デバイス内

    1. オペレーティング・システムに付属するツールを利用する
      • tcpdump (Linux / Unix環境)
    2. オペレーティング・システムベンダー提供のツール
      • WinPcap / Network Monitor (Windows環境)
    3. サードパーティのツールを利用する
      • Wireshark / OmniPeek / NetworkMiner / tshark
  • 対象デバイス外

    1. ミラーポート
      • あるポートが送受信するデータを、同時に別のポートから送出する機能
      • スイッチングハブやルータはMACアドレスを覚えて特定のPCのみとデータ通信をするようになっているのでミラーポートを利用してパケットキャプチャする
      • リピーターハブは接続しているPC全部にデータが送られているのでミラーポートを利用しなくてもデータを拾うことができる。
    2. タップ
      • タップを挟んでデータの通信を分岐させる
    3. プロキシやゲートウェイ
      • プロキシやゲートウェイ配下のサーバの通信が取得できる
    4. 通信対向側(サーバ側)でのキャプチャ
      • サーバ側で取得できているデータは、本当に目的のクライアントからの通信なのか確認する必要がある
        SSLアクセラレータ、プロキシ、ロードバランサなどの通信である可能性がある

* どこでキャプチャするのが適切なのか検討し、複数の場所でキャプチャするなど工夫が必要

パケットをキャプチャする方法

  • ハードウェア
    最近はソフトウェアでキャプチャすることがほとんど。キャプチャ用のハード機器はものすごく高価らしい。

  • ソフトウェア

    1. GUI

      • Wireshark / NetworkMiner / OmniPeek / Network Monitor
        • 設定がわかりやすい
        • 結果がすぐに確認できる
        • その場で解析が可能
    2. CUI

      • tcpdump / WinPcap / tshark
        • 動作が軽快
        • バッチ処理向き

ソフトウェアによるパケットキャプチャまとめ

ソフト OS CUI/GUI 特徴
tcpdump Unix CUI Unix系のCUIでよく利用される。libpcapに含まれている。
netcat Unix CUI -
WinPcap Windows CUI -
tshark Unix/Windows CUI WiresharkのCUI版
Wireshark Unix/Windows GUI FreeのGUIツールでは一番有名
Network Monitor Windows GUI プロセス単位で通信状態を確認できる
OmniPeek Unix/Windows GUI 商用ツール
NetworkMiner Unix/Windows GUI 画像やcookieなど、アプリケーションレベルの確認がしやすい

データ形式

形式 拡張子 特徴
libpcap形式 pcap 一番汎用的な形式
Wireshark新形式 pcapng pcapより詳細な情報が取れる。ngはNextGenerationの略
Network Monitor形式 cap Windowsで使う場合

※ とりあえずpcap形式にしておけば大概のソフトで読める

どんなデータが記録されるか

  • パケット全体のバイナリデータ
  • 記録した時刻
  • キャプチャしたインターフェイス
  • トラフィックを発生させたプロセス

パケット解析

基本的にはツールを利用する

Wireshark / NetworkMiner / OmniPeek / Network Monitor

力技で独自解析

pcap形式などのフォーマットは公開されているので独自にバイナリ解析をする


tcpdumpから始まるネットワークエンジニアの朝 (twovs さん)

tcpdumpとWireshark

  • tcpdump
    軽い、低機能、とりあえず見る、サーバ側でキャプチャ、感じ取る、気づく

  • Wireshark
    重い、高機能、じっくり見る、ローカルのPCで結果を見る、探しだす、確認する

パケット解析で大切なこと

正常系を知っておくこと

異常な状態を察知するには正常な状態を知っておくことが大切

何もしてないのに壊れましたー

IPv4だと問題なかったのにIPv6だとつながらない

IPv6アドレスにpingを打ってみたが反応がなかった
→IPv4はARPでMACアドレスを取得しているがIPv6はICMPでMACアドレスを取得している
→IPv6ではICMPをフィルタしちゃダメ!!

IPv6の通信で送り元と送り先でサイズが違う

送り先でパケットを見たら「padding」というのがひっついていた
→小さいデータを送るときは「0」を付加して64byteにしてから投げるようになっている設定があるらしい

MTU=1500にもかかわらずものすごい大きなデータを送ろうとしていた

送信元でものすごいでかいデータを送信先に投げている。でも送信先のキャプチャは正常
→ VMwareのGuestOSでキャプチャするとき、Virtual Switchに行く前のデータをキャプチャしていた
→ Virtual Switchを通過すると通常のサイズになるらしい。

まとめ

LANケーブルは刺さってる?

意外と多いらしい。お客様には「ケーブル刺さってるか確認してください」と言うと「馬鹿にしてるのか!」とお叱りを受けるので 「LANケーブルの抜き差しで直ることがありますので試してください」と言うと、双方ハッピー。

FireWallの設定とか大丈夫?

IPv6つかってるのにICMPをフィルタしてない?

どこのキャプチャを撮ってる?

内部?外部?内部でもどこ?VMwareだとVirtual Switchの前?後?

とある環境(3G回線)であるアプリのパケットを見てみた(totoromasaki さん)

私は何も聞いてないです。。

リンク

シェフハンズオンセミナー

AWSのUbuntuでChefを動かす

デフォルトのAWSで用意されているUbuntuにChefをインストールする。
ハンズオンのインスタンスは必要なパッケージがすでにいくらかインストールされていたみたいなので トライアンドエラーで設定。

事前準備

Opscodeでアカウントを作成して鍵ファイルとknife.rbを事前にDLしておく。
AWSのインスタンスを利用できる状態にしておく。
AWSのaccess keyとsecret access keyを用意しておく。

AWSにChefクライアントをインストール

Ubuntu 12.04.2 LTSの64bitを選択

必要パッケージとChef クライアントのインストール

1
2
3
4
5
sudo apt-get update
sudo apt-get upgrade
curl -L http://www.opscode.com/chef/install.sh | sudo bash
#sudo apt-get install ruby git tree g++
sudo apt-get install (パッケージたくさん)

※ パッケージはハンズオンで入っていたパッケージを根こそぎ入れた。必要なパッケージは現在精査中。

Chefのgemは以下に入っていることを意識すること
-> デフォルトのgemを使うと残念なことになるらしい。

1
ls -ld /opt/chef/embedded/bin/gem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cd ~
git clone https://github.com/opscode/chef-repo.git
cd chef-repo
tree
.
├── chef-repo
│   ├── certificates
│   │   └── README.md
│   ├── chefignore
│   ├── config
│   │   └── rake.rb
│   ├── cookbooks
│   │   └── README.md
│   ├── data_bags
│   │   └── README.md
│   ├── environments
│   │   └── README.md
│   ├── LICENSE
│   ├── Rakefile
│   ├── README.md
│   └── roles
│       └── README.md
└── credentials.tgz

WorkstationとしてChef serverと通信するための環境ファイル用のディレクトリ作成

1
mkdir .chef

この後、.chefにOpscodeからダウンロードした鍵とknife.rbをscpする。その後chef-repoディレクトリに移動して

1
2
knife client list
XXXX-validator

※ pemファイルをリネームしているとここでエラーが出てしまう。DLしたファイル名をそのまま使う。

knife-ec2インストール

先ほどのgemのPATHを意識すること!!

1
sudo /opt/chef/embedded/bin/gem install knife-ec2 --no-ri --no-rdoc

knife.rbにAWSアクセスするためのキーを記載する

1
2
3
4
# knife for AWS
knife[:aws_access_key_id]     = "XXXXXXXXXXXXXXX"
knife[:aws_secret_access_key] = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
knife[:region] = "ap-northeast-1"

cookbookをWorkstationへclone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cd ~/chef-repo/cookbooks
git clone https://github.com/cl-lab-k/apache2-take.git
cd apache2-take
tree
.
├── attributes
│   └── default.rb     *重要
├── CHANGELOG.md
├── example
│   └── apache2-take-ubuntu.sh
├── files
│   └── default
│       └── tests
│           └── minitest
│               ├── default_test.rb
│               └── support
│                   └── helpers.rb
├── Gemfile
├── metadata.rb
├── README.md
├── recipes
│   └── default.rb     *重要
├── templates
│   └── default        *重要
│       ├── default.erb
│       ├── ports.conf.erb
│       └── twitter-search.html.erb
└── test
    └── kitchen
        └── Kitchenfile

手軽なcookbook

Apache2 install

※ 以下はスクリプトで実行した場合の例。Chefは使っていない。

script

1
2
cd ~/chef-repo/cookbooks/apache2-take/example/
sudo sh ./apache2-take-ubuntu.sh

スクリプトの内容は以下

  • Apache2のインストール&起動
  • Apache2のリクエスト待ち受けポートの変更
  • Apache2で”default”サイトを有効化
  • githubからサイト用コンテンツをclone
  • githubからサイト用コンテンツをダウンロード

同様のものをChefで処理

テスト

1
2
cd ~/chef-repo
knife cookbook test apache2-take

FoodCriticを使ったテスト

1
2
sudo /opt/chef/embedded/bin/gem install foodcritic --no-ri --no-rdoc
/opt/chef/embedded/bin/foodcritic cookbooks/apache2-take

このままだと以下の様なエラーが出る

1
2
FC008: Generated cookbook metadata needs updating: cookbooks/apache2-take/metadata.rb:2
FC008: Generated cookbook metadata needs updating: cookbooks/apache2-take/metadata.rb:3

ここでコードの内容を確認し、スタイルを修正する。

1
[DEPRECATION] "eval" is deprecated. Please use "evaluate" instead

これはバージョンのWarningっぽい。動くので今はスルー。

cookbookのアップロード

1
2
cd ~/chef-repo/cookbooks/apache2-take
knife cookbook upload apache2-take

EC2インスタンス起動

1
knife ec2 server create -S [key pair] -i [key file (XXX.pem)] -r "recipe[apache2-take]" -I ami-77cf4976 --flavor t1.micro -Z ap-northeast-1a -G [Security Group] -x ubuntu -N aws-handson -VV

これで新しいインスタンスが作成され、apacheが立ち上がる。

メモ書

  • コンバージョン(収束)させる
    -> あるべき状態になる、将来ありたい状態と現状を埋める仕組み

  • 98%の情報は下記のURLに存在する!
    http://docs.opscode.com/chef/resources.html

Ec2-api-tools

初期設定

1
2
3
4
5
6
7
8
9
10
11
12
# cp pk-xxxxxxxxxxxx.pem /opt/aws/apitools/ec2/
# cp cert-xxxxxxxxxxxx.pem /opt/aws/apitools/ec2/

vi ~/.bashrc

export EC2_HOME=/opt/aws/apitools/ec2
export PATH=$PATH:$EC2_HOME/bin
# export EC2_PRIVATE_KEY=$EC2_HOME/pk-xxxxxxxxxxxx.pem
# export EC2_CERT=$EC2_HOME/cert-xxxxxxxxxxxx.pem
export AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxxec2-api-tools
export AWS_SECRET_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyy
export EC2_URL=http://ec2.ap-northeast-1.amazonaws.com

諸情報

実行ファイルのPATH

/opt/aws/bin

環境変数

EC2_HOME

ec2-api-toolsのHOME * 例
export EC2_HOME=/opt/aws/apitools/ec2

EC2_PRIVATE_KEY

秘密鍵のPATH。今は使ってない


  • export EC2_PRIVATE_KEY=$EC2_HOME/pk-XXXXXXXXXXXXXXXXXXXXX.pem

EC2_CERT

証明書のPATH。今は使ってない。


  • export EC2_CERT=$EC2_HOME/cert-XXXXXXXXXXXXXXXXXXXXXXX.pem

AWS_ACCESS_KEY

AWSアクセスキー


  • export AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx

AWS_SECRET_KEY

AWSシークレットキー


  • export AWS_SECRET_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyy

EC2_URL

リージョンの指定


  • export EC2_URL=http://ec2.ap-northeast-1.amazonaws.com

コマンド

確認

ec2ver

バージョンの表示

1
2
[ec2-user@ip-10-146-39-194 ~]$ ec2ver
1.6.6.0 2012-12-01

ec2-describe-images

AMIの表示

1
2
3
4
5
6
7
8
9
10
[ec2-user@ip-10-146-39-194 ~]$  ec2-describe-images -x all
IMAGE   ami-1fd85d1e    001108612011/CentOS-63-40T-EBS-PhilChen 001108612011    available       public          x86_64  machine aki-44992845                    ebs     paravirtual     xen
BLOCKDEVICEMAPPING      EBS     /dev/sda1               snap-af93b78f   40      true    standard
IMAGE   ami-e802b5e9    014836023992/ProxySnifferGUI-46-Z-win64-04      014836023992    available       public          x86_64  machine                 windows ebs     hvm     xen
BLOCKDEVICEMAPPING      EBS     /dev/sda1               snap-339edc59   35      true    standard
IMAGE   ami-a4ea50a5    014836023992/ProxySnifferGUI-50-K-win64-03      014836023992    available       public          x86_64  machine                 windows ebs     hvm     xen
BLOCKDEVICEMAPPING      EBS     /dev/sda1               snap-9b2e46bb   35      true    standard
...

※AMIの一覧が表示される

インスタンス操作関連

ec2-describe-instances

インスタンスの一覧の情報が表示される

1
2
3
4
5
6
7
8
9
RESERVATION  r-a16fc3a2  492323174246    magento_sg
INSTANCE  i-1f433f1c  ami-87932986            stopped magento_key 0       t1.micro    2013-01-06T00:53:08+0000    ap-northeast-1a aki-44992845            monitoring-disabled                 ebs     paravirtual xen hXdxF1357433587195  sg-17a3c816 default false  
BLOCKDEVICE   /dev/sdf    vol-5bb81c79    2013-02-11T07:14:32.000Z    false      
TAG   instance    i-1f433f1c  Name    magento_amazon

RESERVATION   r-9dfb469e  492323174246    nfs_test_sg,stg_sg
INSTANCE  i-7b470978  ami-4e6cd34f    ec2-54-249-240-55.ap-northeast-1.compute.amazonaws.com  ip-10-146-39-194.ap-northeast-1.compute.internal    running wordpress_key   0       t1.micro    2013-01-19T23:50:01+0000    ap-northeast-1b aki-44992845            monitoring-disabled 54.249.240.55   10.146.39.194           ebs                 paravirtual xen xuoXb1358639400459  sg-86076187, sg-3f58323e    default false  
BLOCKDEVICE   /dev/sda1   vol-42cf7b60    2013-01-19T23:50:05.000Z    true       
TAG   instance    i-7b470978  Name    Redmine

※ 引数にインスタンスIDを指定数と、そのインスタンスの情報のみ表示される

ec2-start-instances

インスタンスを起動

1
2
3
4
5
6
7
8
9
10
[ec2-user@ip-10-146-39-194 ~]$ ec2-start-instances --region ap-northeast-1 i-1f433f1c
INSTANCE  i-1f433f1c  stopped pending

[ec2-user@ip-10-146-39-194 ~]$ ec2-describe-instance-status
INSTANCE  i-1f433f1c  ap-northeast-1a running 16  ok  ok  active  
SYSTEMSTATUS  reachability    passed  
INSTANCESTATUS    reachability    passed  
INSTANCE  i-7b470978  ap-northeast-1b running 16  ok  ok  active  
SYSTEMSTATUS  reachability    passed  
INSTANCESTATUS    reachability    passed

ec2-stop-instances

インスタンスを停止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ec2-user@ip-10-146-39-194 ~]$ ec2-stop-instances i-1f433f1c
INSTANCE  i-1f433f1c  running stopping

[ec2-user@ip-10-146-39-194 ~]$ ec2-describe-instances
RESERVATION   r-a16fc3a2  492323174246    magento_sg
INSTANCE  i-1f433f1c  ami-87932986            stopped magento_key 0       t1.micro    2013-02-20T15:34:21+0000    ap-northeast-1a aki-44992845            monitoring-disabled                 ebs     paravirtual xen hXdxF1357433587195  sg-17a3c816 default false  
BLOCKDEVICE   /dev/sda1   vol-5bb81c79    2013-02-20T15:34:02.000Z    false      
TAG   instance    i-1f433f1c  Name    magento_amazon

➡ stoppedになっている

RESERVATION   r-9dfb469e  492323174246    nfs_test_sg,stg_sg
INSTANCE  i-7b470978  ami-4e6cd34f    ec2-54-249-240-55.ap-northeast-1.compute.amazonaws.com  ip-10-146-39-194.ap-northeast-1.compute.internal    running wordpress_key   0       t1.micro    2013-01-19T23:50:01+0000    ap-northeast-1b aki-44992845            monitoring-disabled 54.249.240.55   10.146.39.194           ebs                 paravirtual xen xuoXb1358639400459  sg-86076187, sg-3f58323e    default false  
BLOCKDEVICE   /dev/sda1   vol-42cf7b60    2013-01-19T23:50:05.000Z    true       
TAG   instance    i-7b470978  Name    Redmine

起動しているインスタンスのみ確認する場合は以下

1
2
3
4
5
6
7
8
9
[ec2-user@ip-10-146-39-194 ~]$ ec2-stop-instances i-1f433f1c
INSTANCE  i-1f433f1c  running stopping

[ec2-user@ip-10-146-39-194 ~]$ ec2-describe-instance-status
INSTANCE  i-7b470978  ap-northeast-1b running 16  ok  ok  active  
SYSTEMSTATUS  reachability    passed  
INSTANCESTATUS    reachability    passed

※ i-1f433f1cが表示されなくなっている

snapshot関連

ec2-describe-snapshots

snapshot一覧の表示

1
2
3
4
5
[ec2-user@ip-10-157-54-96 bin]$ ec2-describe-snapshots --region ap-northeast-1
SNAPSHOT  snap-a22a9d81   vol-42cf7b60    completed   2013-03-03T07:55:57+0000    100%    492323174246    8   Redmine
TAG   snapshot    snap-a22a9d81   Name    Redmine
SNAPSHOT  snap-f363ddd0   vol-42cf7b60    completed   2013-03-05T22:55:59+0000    100%    492323174246    8   Redmine 20130306
TAG   snapshot    snap-f363ddd0   Name    Redmine

ec2-copy-snapshot

snapshotのコピー

1
ec2-copy-snapshot --region ap-southeast-1 -r ap-northeast-1 -s snap-a22a9d81

※東京からシンガポールのリージョンへコピー

ec2-describe-snapshot

snapshotのアクセス権限確認

1
2
[ec2-user@ip-10-157-54-96 bin]$ ec2-describe-snapshot-attribute snap-a22a9d81 --create-volume-permission
[ec2-user@ip-10-157-54-96 bin]$

権限が設定されていない場合(非公開設定)は何も出力されない

ec2-modify-snapshot-attribute

snapshotのアクセス権限を変更する

1
ec2-modify-snapshot-attribute (snap_id) -c --add all

※すべてのユーザに公開される設定

ec2-reset-snapshot-attribute

権限をリセットする

1
ec2-reset-snapshot-attribute (snapshot_id) -c

volume関連

ec2-detach-volume

ボリュームをデタッチする

1
2
[ec2-user@ip-10-156-119-74 ~]$ ec2-detach-volume vol-5bb81c79
ATTACHMENT    vol-5bb81c79    i-1f433f1c  /dev/sda1   detaching   2013-03-26T14:50:06+0000

ec2-attach-volume

ボリュームをアタッチする

1
2
[ec2-user@ip-10-156-119-74 ~]$ ec2-attach-volume vol-5bb81c79 -i i-1f433f1c -d /dev/sda1
ATTACHMENT    vol-5bb81c79    i-1f433f1c  /dev/sda1   attaching   2013-03-31T14:55:34+0000

ec2-create-volume

ボリュームを作成する

1
2
[ec2-user@ip-10-156-119-74 ~]$ ec2-create-volume --snapshot snap-7971395a -z ap-northeast-1a
VOLUME    vol-45531e67    8   snap-7971395a   ap-northeast-1a creating    2013-03-31T15:02:11+0000    standard

Elastic IP関連

ec2-describe-addresses

1
2
[ec2-user@ip-10-158-203-131 tmp]$ ec2-describe-addresses
ADDRESS   54.249.240.55   i-7b470978  standard

トラブルシューティング

Instance does not have a volume attached at root (/dev/sda1)

/dev/sdfになっていたのを/dev/sda1でアタッチし直したらOK

リンク

逆引きコマンド

■改行を

入れたい

「=」で改行

1
2
3
4
5
6
7
8
9
fukui-no-MacBook-Air:tmp ftakao2007$ cat vimrc
set fileencoding=utf-8
set fileencodings=iso-2022-jp,utf-8,euc-jp

fukui-no-MacBook-Air:tmp ftakao2007$ cat vimrc | gsed -e 's/=/=\n/g'
set fileencoding=
utf-8
set fileencodings=
iso-2022-jp,utf-8,euc-jp

消したい

1
2
3
4
5
6
fukui-no-MacBook-Air:tmp ftakao2007$ cat vimrc
set fileencoding=utf-8
set fileencodings=iso-2022-jp,utf-8,euc-jp

fukui-no-MacBook-Air:tmp ftakao2007$ cat vimrc | tr -d '\n'
set fileencoding=utf-8set fileencodings=iso-2022-jp,utf-8,euc-jpfukui-no-MacBook-Air:tmp ftakao2007$

■空行を

消したい

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fukui-no-MacBook-Air:tmp ftakao2007$ cat aaa.log
a

gsfe

wefa
awefa

w
fukui-no-MacBook-Air:tmp ftakao2007$ sed -e '/^$/d' aaa.log
a
gsfe
wefa
awefa
w
fukui-no-MacBook-Air:tmp ftakao2007$ sed -ne '/./p' aaa.log
a
gsfe
wefa
awefa
w
fukui-no-MacBook-Air:tmp ftakao2007$

■Webページを

保存したい

htmlのみ

1
curl http://www.example.com > example.com.html

ページを丸ごとローカルに保存

1
wget -r -np -k -l 0 example.com

データを送る

1
2
3
4
5
6
7
8
9
10
11
12
13
fukui-no-MacBook-Air:DATA ftakao2007$ curl --data-urlencode a=太郎 http://www.example.com/TOMONOKAI_CMS/CGI/hoge.cgi
あなたのポストしたデータは、
a=%E5%A4%AA%E9%83%8E
です。

fukui-no-MacBook-Air:DATA ftakao2007$ curl --data a=太郎 http://www.example.com/TOMONOKAI_CMS/CGI/hoge.cgi
あなたのポストしたデータは、
a=太郎
です。

fukui-no-MacBook-Air:DATA ftakao2007$ wget --data a=太郎 http://www.example.com/TOMONOKAI_CMS/CGI/hoge.cgi

* URLはexample.comに変更してあります

■文字コードを

変換する

1
2
3
4
5
6
7
fukui-no-MacBook-Air:DATA ftakao2007$ cat numref
我々はシェル芸人だ。
fukui-no-MacBook-Air:DATA ftakao2007$ cat numref | w3m -T text/html -dump
我々はシェル芸人だ。

fukui-no-MacBook-Air:DATA ftakao2007$ cat numref | nkf --numchar-input
我々はシェル芸人だ。

■文字列を

抽出

1
2
3
4
5
6
7
8
9
10
11
12
13
bash-3.2$ cat a.log
1
2
3
4
5
6
7
8
9

bash-3.2$ cat a.log | grep 5
5

マッチした前後を抽出

1
2
3
4
5
6
7
8
bash-3.2$ cat a.log | grep 5 -A 2
5
6
7
bash-3.2$ cat a.log | grep 5 -B 2
3
4
5

Sed

sed (ストリーミングエディタ)

Option

n

標準出力を制御

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/p' test_sed.txt
aaa
bbb123
bbb123
ccc

* bbbが含まれている行があればその行を出力するという処理。
   nオプション無しだと、「テキストの内容+処理結果」となっている

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/p' test_sed.txt
bbb123

* nオプションをつけると処理結果のみ出力

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/d' test_sed.txt

* bbbが含まれる行を削除する処理。
   nオプションをつけている場合は処理結果は何も表示されず、よくわからない。

fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc

* nオプション無しで実行すると、bbbの行が削除されている事が分かる。
  • pで表示する場合はnをつけると目的の部分だけ出力できる
  • dで削除する場合はnを付けなければ削除された行以外を出力できる

e

次にくる値はコマンドとみなす

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed -e '/bbb/d' -e '/ccc/d' test_sed.txt
aaa

* bbbが含まれる行を削除し、cccが含まれる行も削除する

fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' -e '/ccc/d' test_sed.txt
sed: -e: No such file or directory
sed: /ccc/d: No such file or directory
aaa
ccc

* eオプションを使う場合はコマンドごとに明示的にeオプションを指定する必要がある

f

次にくる値はスクリプトとみなす

1
2
3
4
5
6
7
8
9
10
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ cat sed_test.sed
/bbb/p

fukui-no-MacBook-Air:sed ftakao2007$ sed -n -f sed_test.sed test_sed.txt
bbb123

i

標準出力に出力せず、直接ファイルを書き換える

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed -i.bak '/bbb/d' test_sed.txt

fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
ccc

fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt.bak
aaa
bbb123
ccc

* .bakにバックアップをとって元ファイルはbbbを含む行が削除されている

fukui-no-MacBook-Air:sed ftakao2007$ sed -i '/bbb/d' test_sed.txt
sed: 1: "test_sed2.txt": undefined label 'est_sed.txt'

* 拡張子を指定しない場合はエラーになる

Command

p

出力する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '1,2p' test_sed.txt
aaa
bbb123

* 1-2行目を出力

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '3p' test_sed.txt
ccc

* 3行目を出力

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/p' test_sed.txt
bbb123

* bbbが含まれる行を出力

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '$p' test_sed.txt
ccc

* 最後の行を出力

d

削除する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed '1,2d' test_sed.txt
ccc

* 1-2行目を削除

fukui-no-MacBook-Air:sed ftakao2007$ sed '3d' test_sed.txt
aaa
bbb123

* 3行目を削除

fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc

* bbbが含まれる行を削除

fukui-no-MacBook-Air:sed ftakao2007$ sed '$d' test_sed.txt
aaa
bbb123

* 最後の行を削除

q

特定の文字列が含まれる行まで表示

1
2
3
4
5
6
7
8
9
10
11
12
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed '/ccc/q' test_sed3.txt
aaa
bbbb123bbb456bbb
ccc

* cccが含まれる行まで表示

s

置換する

1
2
3
4
5
6
7
8
9
10
11
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/' test_sed.txt
aaa
xxx123
ccc

* bbbをxxxに置換
  • g すべてのパターンに対して処理を実行する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/' test_sed3.txt
aaa
xxx123bbb456bbb
ccc
xxx789bbb

* gオプションが無い場合は最初のみ置換される

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/g' test_sed3.txt
aaa
xxx123xxx456xxx
ccc
xxx789xxx

* gオプションをつけると全てが置換される
  • n(整数) n番目の発生を置換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/1' test_sed3.txt
aaa
dddb123bbb456bbb
ccc
ddd789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/2' test_sed3.txt
aaa
bbbb123ddd456bbb
ccc
bbb789ddd

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/3' test_sed3.txt
aaa
bbbb123bbb456ddd
ccc
bbb789bbb
  • p パターンスペースの先頭セグメントから最初の復帰改行までを標準出力に出力する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p1' test_sed3.txt
dddb123bbb456bbb
ddd789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p2' test_sed3.txt
bbbb123ddd456bbb
bbb789ddd

fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p3' test_sed3.txt
bbbb123bbb456ddd
  • w ファイルへ書き出す
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/w bbb.txt     <-ここで一度改行されている
/bbb/!w aaa.txt' test_sed3.txt

fukui-no-MacBook-Air:sed ftakao2007$ cat bbb.txt
bbbb123bbb456bbb
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ cat aaa.txt
aaa
ccc

* bbbにマッチした行をbbb.txtへ、マッチしなかった行をaaa.txtへ書き出す

========================

fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/gw ddd.txt' test_sed3.txt > change.txt

fukui-no-MacBook-Air:sed ftakao2007$ cat ddd.txt
dddb123ddd456ddd
ddd789ddd

fukui-no-MacBook-Air:sed ftakao2007$ cat change.txt
aaa
dddb123ddd456ddd
ccc
ddd789ddd
fukui-no-MacBook-Air:sed ftakao2007$

* 変換された行のみddd.txtに保存、変換後の全行をchange.txtに出力

Match

空行以外を出力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa

bbbb123bbb456bbb
ccc

 bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/./p' test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
 bbb789bbb

* 空行以外の行を出力

空行を出力

1
2
3
4
5
6
7
8
9
10
11
12
13
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa

bbbb123bbb456bbb
ccc

 bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/^$/p' test_sed4.txt


* 空行を出力
  (例は空行2行分が出力されている)

最初の空行から次の空行までを出力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa

bbbb123bbb456bbb
ccc

 bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt

bbbb123bbb456bbb
ccc

* 最初の空行から次の空行までが出力されている

fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt | sed -e '/^$/d'
bbbb123bbb456bbb
ccc

* マッチした最初と最後の空行自体は削除して表示

fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt | sed -ne '/./p'
bbbb123bbb456bbb
ccc

* 上と同じ結果

最初の空行から次の空行までの行を削除

1
2
3
4
5
6
7
8
9
10
11
12
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa

bbbb123bbb456bbb
ccc

 bbb789bbb

fukui-no-MacBook-Air:sed ftakao2007$ sed -e '/^$/,/^$/d' test_sed4.txt
aaa
 bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$

Advance

正規表現(?)

&

置換のときに省略して記載できる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/bbb_add_/' test_sed.txt
aaa
bbb_add_123
ccc

* bbbの直後に_add_を追加する

fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/&_add_/' test_sed.txt
aaa
bbb_add_123
ccc

* 先ほどと同じ結果。「bbb」のかわりに「&」で指定

区切り位置

区切り位置を/の代わりに;にすると、/をエスケープしなくても良くなる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fukui-no-MacBook-Air:DATA ftakao2007$ cat 3.html | gsed -e 's/<\/td>/&\n/g'
<table>
  <tr>
<td>a</td>
<td>b</td>

<td>c</td>

  </tr>
</table>
fukui-no-MacBook-Air:DATA ftakao2007$ cat 3.html | gsed -e 's;</td>;&\n;g'
<table>
  <tr>
<td>a</td>
<td>b</td>

<td>c</td>

  </tr>
</table>

参考

シェル芸 20130413

第4回春爛漫シェル芸人撩乱勉強会&第22回勝手に新歓定例会

事前準備

wget curl w3mの確認

全部入っていた

1
2
3
4
5
6
[mickey@ftakao2007 ~]$ which wget
/usr/bin/wget
[mickey@ftakao2007 ~]$ which curl
/usr/bin/curl
[mickey@ftakao2007 ~]$ which w3m
/usr/bin/w3m

open usp Tukubai のインストール(CentOS 6.4)

gitでインストールしてみる

1
2
3
4
git clone https://github.com/usp-engineers-community/Open-usp-Tukubai.git
cd Open-usp-Tukubai
su -
make install

※ なぜかgitでは入らなかったのでhttpsで

1
2
3
cd ~/work
wget http://www.usptomo.com/TOMONOKAI_CMS/HTML/DATA.zip
unzip DATA.zip

勉強会のまとめについて

正確な情報や丁寧な解説はきっと他の方にまとめていただけると思うので、自分は勉強会で学んだことを端的に 逆引きでまとめていくというコンセプトにしようと思います。

「正確な情報の汎用的な一般解よりも、とりあえずやりたいことができる」
「一箇所に情報を集約する」

を目的とします。勉強会でその時スゲーって思ってまとめても、あのコマンドどこだったっけとなることが多かったので 今後勉強会で学んだことは逆引き的に上記のページに集約しようと思います。

リンク

このブログについて

githubの勉強の一環で立ち上げました。日記や調べたことのまとめとして利用しています。 コンセプトは「とりあえず書き出して、適宜修正しながらみにつける」ですので、ブログの内容は 間違っている内容や不必要な内容も多いということを前提でご覧いただければと思います。適宜内容は 改変、修正されます。

何かありましたらgithubのissueにお願いしますm( )m

Diary

今日はgitについてまとめました。今までCVSというSubversionより さらに前のバージョン管理ソフトを使っていました。リビジョンの概念とか コミットの単位とか異なっていて違和感があります。みんなgitが 良いって言っているのでいずれその良さが分る日が来るはず。。 リスクの無いことはやってみてから考えた方がスムーズですよね。 仕事は石橋を叩くような作業が多いので、こういう趣味でやりたい放題するのって すごく気持ちいいです。

Wireshark

これを入れるとネットワークセミナーが楽しくなるということなので とりあえず入れてみました。

あわせて勉強してみたい

tcpdumpとtcpreplayとtcprewrite