shell commands, one-liner etc.

shell commands, one-liner etc.

よく使うコマンドやシェル芸などを書き遺すページ。
随時更新。



Linux 共通


tcpdump の使い方

pcap ファイルに出力。

sudo tcpdump -G 60 -W 1 -n -p -s 10000 -vvv -w "$(uname -n)_%Y%m%dT%H%M%S.pcap" port 3306
  • tcpdump
    • -G {{数字}}: {{数字}}秒間実行する
    • -W {{数字}}: {{数字}}回ローテートする
    • -n: IPアドレスやポートをそのまま表示する
    • -p: プロミスキャスモード を有効にしない
    • -s: キャプチャするサイズを指定する ( MTUより大きくすれば OK )


tshark の使い方

ファイルから読み込み。

sudo tshark -Y 'tcp.port==443' -r example.pcap

ターミナルに流しながら。 tail -f 的に。

sudo tshark -i all -n -p -s 10000 -Y 'tcp.port==443'


普通のdiffコマンドに無理やり色を付ける

difff() {(R=$(printf '\e[31m');G=$(printf '\e[32m');B=$(printf '\e[36m');W=$(printf '\e[1m');N=$(printf '\e[0m');diff -u "$@"|sed $(uname -s|grep -q '^Darwin'&&printf -- -E||printf -- -r) "s/^(@@.+@@|@@.+@@)$/$B\1$N/g;s/^(\+.*)$/$G\1$N/g;s/^(\-.*)$/$R\1$N/g;s/^[^\+\-]*((\+{3}|-{3}) [^ ].*)/$W\1/g;")}


telnet コマンド が入っていない環境下で telnet を使いたい時

代替に curl を使う。 -v オプション必須。

$ curl -v telnet://127.0.0.1:3306/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 3306 (#0)
J
* RCVD IAC EC

curl が入っていないときは我慢する。



証明書の期限を確認する

openssl s_client -connect djeeeno.blogspot.com:443 < /dev/null 2> /dev/null | openssl x509 -noout -dates


空ディレクトリを探す

カレントディレクトリ配下の空ディレクトリを探す。

find . -type d -empty


バイナリファイルを探す

もう少し正確に言うと、カレントディレクトリ配下の非テキストファイルを探す。

find . -type d -name '.git' -prune -o -type f -print | xargs file | grep -Ev 'text(,|$)'


.DS_Store を消す

いつもの。

find ./ -name '.DS_Store' -type f -delete


Git


リポジトリのルートディレクトリをフルパスで取得する

git rev-parse --show-toplevel


git コマンドで使用する ssh 秘密鍵を変更する

export GIT_SSH_COMMAND="ssh -i ~/.ssh/djeeno.pem -F /dev/null"


Make


make help を自己文書化する (ref.)

.PHONY: help
help:  ## display this documents
 @grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'


Golang のプロジェクトでよく書く

SHELL := $(shell command -v bash)
COMMAND_NAME := myapp
MAIN_PATH := ./cmd/$(COMMAND_NAME)
BUILD_PATH := ./_build

.PHONY: help
help:  ## display this documents
 @grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

.PHONY: fmt
fmt:  ## Execute `go fmt`
 # fmt
 go fmt ./...

.PHONY: setup-tools
setup-tools:  ## setup tools
 # stringer コマンドが無ければインストールする
 command -v stringer >/dev/null || (cd ~ && go install golang.org/x/tools/cmd/stringer) # go.mod に追加されるのを防ぐため $HOME へ cd している

.PHONY: generate
generate:  ## command `go generate`
 # generate
 go generate -v ./...

.PHONY: run
run:  ## Execute `go run` with $(ARGS)
 ##
 # You may have to run \`go generate\` manually.
 ##
 # run
 go run $(MAIN_PATH) $(ARGS)

.PHONY: test
test: generate ## Execute `go test`
 go test -cover ./...


Ubuntu (Debian系)


apt-get / deb でインストールしたパッケージ一覧を取得する

dpkg -l *mysql*

もしくは、 dpkg -l で全部出して grep で絞る。

dpkg -l | grep -i mysql


apt-get / deb でインストールしたファイルの一覧を取得する

dpkg -L mysql-client-core-5.7


手元の deb パッケージが含むファイルの一覧を確認する

dpkg --contents mysql-client-core-5.7_5.7.25-0ubuntu0.18.04.2_amd64.deb


ベンチマーク


HTTP ベンチマークツール wrk2

ref. https://github.com/giltene/wrk2

インストール

sudo sh -c 'apt update && apt -y install git make gcc libssl-dev zlib1g-dev && git clone --depth=1 https://github.com/giltene/wrk2.git /usr/local/src/wrk2 && cd /usr/local/src/wrk2 && make && ln -sf /usr/local/src/wrk2/wrk /usr/bin/wrk'

使い方

$ wrk -t1 -c1 -d30s -R2 http://127.0.0.1:80/
  • wrk
    • -t, --threads {{数字}}: 何スレッド使うか
    • -c, --connections {{数字}}: 何コネクション張るか
    • -d, --duration {{時間}}: 例えば「 -d 30s 」だと 30 秒間負荷をかける
    • -R, --rate {{数字}}: 1秒間に何リクエスト送るか


AWS


EC2のいい感じのリストを取得する

ec2-list() { aws ec2 describe-instances --query 'Reservations[].Instances[?contains(State.Name, `running`)].{A:LaunchTime,B:InstanceId,C:PrivateIpAddress,D:PublicIpAddress,E:Tags[?Key==`Name`]|[0].Value}' --output text "$@" | sort; }
$ ec2-list
2019-03-29T12:33:23.000Z i-0123456789abcdef3 172.31.0.13 13.13.13.13 web
2019-03-29T12:33:24.000Z i-0123456789abcdef4 172.31.0.14 13.13.13.14 web
2019-03-29T12:33:25.000Z i-0123456789abcdef5 172.31.0.15 13.13.13.15 web

左から「起動時刻」「インスタンスID」「プライベートIPアドレス」「グローバルIPアドレス」「Nameタグ」。

なお、↑だと Name タグが無いインスタンスが表示できないので、そういうときは↓を使う。

ec2-list-without-name() { aws ec2 describe-instances --query 'Reservations[].Instances[?contains(State.Name, `running`)].{A:LaunchTime,B:InstanceId,C:PrivateIpAddress,D:PublicIpAddress}' --output text "$@" | sort; }シェル芸のページです。  

---
<br>

## よく使うワンライナー

<br>

### バイナリファイルを探す

もう少し正確に言うと、カレントディレクトリ配下の非テキストファイルを探す。  

```bash
find . -type d -name '.git' -prune -o -type f -print | xargs file | grep -Ev 'text(,|$)'

空ディレクトリを探す

カレントディレクトリ配下の空ディレクトリを探す。
find 優秀。

find . -type d -empty



自作物


laws

awscli っぽいやつ。 現状 S3 しか対応できていない…。
ほぼほぼ POSIX Shell で動作する。



conoha-cli

ConoHa の CLI っぽいやつ。
ほぼほぼ POSIX Shell で動作する。
openstackclient で良くない?という意見は受け付けていない。