コンソール上で、コマンドの結果を複数のファイルに出力したいことがある。 そういった場合、残念ながらbashの場合、リダイレクトだと複数のファイルへ同時に書き込むといったことは難しい。 じゃあどうすればいいのかというと、teeコマンドであれば複数ファイルを指定できるので、それで対応する。

コマンド | tee ファイル1 ファイル2 ファイル3 ...  >& /dev/null # 追記しない場合
コマンド | tee -a ファイル1 ファイル2 ファイル3 ...  >& /dev/null # 追記する場合
blacknon@BS-PUB-UBUNTU-01:~/test_dir...

特定のディレクトリ配下にあるファイルの行数とかを再帰的に取得する場合、wcコマンドが利用される場合が多いだろう。

wc -l $(find /PATH -type f)
blacknon@BS-PUB-UBUNTU-01:~/test_dir$ ls -la
合計 152
drwxrwxr-x 12 blacknon blacknon   4096  2月 25 16:42 .
drwxr-xr-x 15 blacknon blacknon   4096  2月 25 16:39 ..
drwxrwxr-x  2 blacknon blacknon   4096  2月 25 16:4...

先日、2017年02月24日よりプレミアムフライデーなるモノが始まった。 これは、毎月の最終金曜日は15時退社にして余暇を作ることで個人消費を増やし、景気促進を促すという経産省主導の消費喚起のプログラムなのだが、あいにくと導入している企業は0.1%前後とかで、今の時点だとプレミアムな企業にしか適用されてないようだ(プレミアムな企業だったら給料も高いので、消費喚起という意味ではまぁ間違ってない…のか?景気対策としての効果は疑問だけど、まぁ結果を見てからかなぁ…)。

で、じゃあ今年のプレミアムフライデーは何日なのかをコンソール上で出力させてってみよう。 日付関係の処理を行うといえばdateコ...


bashやzshでシェル芸(ワンライナー)を書いてたりすると、標準エラー出力だけを/dev/nullに出力させたりといった処理を行うことがある。 で、毎回いちいち/dev/nullとか指定するのもあれなんで、省略記述方法ないかなと思って調べてみたところ、Bash4以降だと結構記述方法が増えたようだ。 個人的によく利用する記述の省略形だけピックアップして記述しておく。

2> /dev/null

標準エラー出力や標準出力、どっちかだけを非表示にさせたい場合だと「2>/dev/null」と記述して/dev/nullにリダイレクトさせるのだが、以下のようにも書けるようだ。

2>/dev/n...

Windowsで、Linuxのようにinotify-toolsを使ってファイルの作成や編集、削除について検知とかをするにはどうすればいいのかなと思って調べてみた。 どうやら、PowerShellでもやろうと思えばできるようだ。 Windowsでinotifyのようにファイルのイベントを検知する場合は「System.IO.FileSystemWatcher」を用いることで同様のことが行える。

参考元に記述されているようなPowerShellスクリプトを記述することで、指定されたログに監視PATHで発生したイベントをログに記録させることができるようだ。 ちょっとだけ記述を変えて試してみたので、...


sshの鍵認証で、特定のカギのみをrootで許可してやり、一般ユーザに勝手に追加させないようにしたいなぁ…という話があり、やり方を考えてみた。 で、当初は『.ssh/authorized_keys』ファイルの所有者をrootに変えてやり、一般ユーザには読み込み権限だけを与えてしまえばいいかなと思ったのだが、どうもそれではうまくいかない。 というのも、『.ssh/』ディレクトリの所有者はその一般ユーザになるので、『.ssh/authorized_keys』を削除して作り変えてしまえるためだ。

[test@BS-PUB-CENT7-01 ~]$ ls -al .ssh/
合計 4
drwx--...

某所で話題になってた『内閣府の「国民の祝日」CSV』をシェル芸で加工して見やすくする

なんか、某所で見にくい・加工しにくいと話題になってた『内閣府の「国民の祝日」CSV』について、シェル芸を使って加工して少し見やすくしたので備忘として残しておく(使うことはないだろうけど)。 このデータ、確かにそのままだと扱いにくいけど加工自体はそこまで難易度の高いものではないみたい。 コンソール上で見やすくするため、CSVではなくTSVにして出力してみる(CSVにしたきゃ、awkのとこにある「\t」を「,」に変えればいいだけだし)。

以下、Linuxで実行できるコマンド。 文字コード・改行コードの変換にnkfコマンドが必要になるので、環境にインストールしておくこと。

curl -s h...

コンソール上で、ランダムな数字を出力させたいというのがあったので、少し調べてみた。 結構いろいろな方法があるようだ。

1.環境変数「$RANDOM」を用いる

bashでは、環境変数「$RANDOM」を用いることで0~32767までの数字をランダムに出力させることができる。 0から数えるので、+100とかで指定すると0~99までしか出力しないので注意。

echo $RANDOM # 0~32767までの範囲で出力する
echo $((RANDOM%+101)) # 0~100までの範囲で出力する
echo $((RANDOM%100+101)) # 100~200までの範囲で出力する...

コンソール上で色々なシステム情報を出力できる『Inxi』コマンド

ネットで調べものをしていたところ、Linuxのシステムやハードウェアの情報についてわかりやすく出力してくれる『Inxi』コマンドなるものを見かけたので、ちょっとインストールしてみることにした。 インストールコマンドは以下。 yumやaptからインストール可能だ。

sudo yum install inxi
sudo apt install inxi

インストール後は、普通にコマンドを実行してやればよい。 オプションなしでコマンドを実行することで、CPUやメモリ容量など、基本的なハードウェア情報を得ることができる。


John the Ripperとかでパスワードクラックをする際に使われる辞書ファイルなのだが、ある程度パスワードに使われている文字が推測できている状況の場合、通常の辞書ファイルだと余分なパスワードもいっぱいあって処理に時間がかかる。 「ある程度推測できているパスワードだけど、文字の順番入れ替えたりしてるだけのリストがほしい」という時は、パスワードなどのワードリスト生成用のツールである『crunch』コマンドというものを使うといいようだ。

1. インストール

ペネトレーションテスト時に使われるものなので、KaliLinuxには最初から入っている様子。 CentOS などにインストールをす...


オンアクセスでのファイルの改ざん検知(ファイルが改ざんされたと同時に検知)を行えるツールというと、OSSECとかTripwire(有償版)あたりかと思うのだが、この『Samhain』もオンアクセスでのファイル改ざん検知が行えるようだ。 厳密にはホスト型のIDSなので、改ざん検知の他に以下のような機能を提供している。

  • 完全性チェック(チェックサムで変更を検知)
  • ログの集中監視
  • データベース、設定ファイルへの署名
  • ログファイルやメールへの署名

今回は、この『Samhain』をCentOS 7にインストールしてみる。 ただ、結論から言うとオンアクセスでの改ざん検知設定までは持...


Golangでは、関数の可変引数に対し、スライス展開して渡すことができるようだ。 例えば、以下のような感じ。

test.go
package main import "fmt" func main() { // 普通に指定して渡す fmt.Println("普通に指定して渡す") args_test("1 String :", "Arg1") args_test("2 Strings:", "Arg1", "Arg2") args_test("3 Strings:", "Arg1", "Arg2", "Arg3") fmt....

fish shellでbashなどの「command && ok || ng」と同じ処理をさせる

bashやzshだと、以下のようにコマンドを実行することで、そのコマンドの実行結果に応じた処理を指定することができる。

コマンド && コマンドが正常終了の場合の処理 || コマンドが正常終了出ない場合の処理
blacknon@BS-PUB-DEVELOP:~$ ls test*
test.txt  test1.txt
blacknon@BS-PUB-DEVELOP:~$ ls test.txt && echo OK || echo NG
test.txt
OK
blacknon@BS-PUB-DEVELOP:~$ ls test.txt_ && echo OK || echo NG...

bashやzshでは、コマンドの結果を差し込みする場合、以下のように任意の箇所に「$(コマンド)」を記述してコマンドを実行することで、(サブシェル展開にはなるのだが)コマンドの実行結果を差し込む。 結構よく利用される方法だ。

コマンド ...$(コマンド)...
blacknon@BS-PUB-UBUNTU-01:~$ echo $0
-bash
blacknon@BS-PUB-UBUNTU-01:~$ echo $(date +%Y%m%d)_test
20170216_test


sshdで、ログイン前に特定のコマンドを実行させたい場合がある(例:svnなどでsshトンネルでのログインをする際に$SSH_CLIENTをどっかのファイルに書き出す場合など)。 こういった場合には、「/etc/ssh/sshrc」もしくは「\~/.ssh/rc」に処理内容を記述することで、ログイン前にその内容を実行させることができる。 実行する処理はシェルスクリプトと同じ書き方なので、まぁ特に問題はないだろう。


ターミナル上で一括でファイルのリネームをする場合によく利用されるrenameコマンドだが、もしそれがない場合はどうやって一括置換すれば楽かなと思って調べみた。 で、以下のようにコマンドを実行すれば一括で置換ができる。 (とりあえず、カレントディレクトリでa~のファイルを対象にしている)

ls a* | xargs -n1 | sed 'p;s/\.txt/\.faq.txt/g' | xargs -n 2 mv

シェル芸界隈でVimシェル芸なるVimをワンライナーで使う代物が流行ってたので、そろそろEmacsで解いてくる猛者が出てくるかなーとか考えていた。 で、なんか標準入力受け付けられないという話だったので調べてみたところ、「--insert」で/dev/stdinを指定すれば標準入力を受け付けられるらしい。

echo abcd | emacs -Q --batch --insert /dev/stdin --eval='(princ (replace-regexp-in-string "a" "1" (buffer-string)))'

ふと、コンソール上で特定の単語の文字組み合わせを取得するにはどうすればよいのかなと思ったので、ちょっと調べてみた。 ブレース展開を増殖させる方法でどうにか…と思ったけど、無駄に長くなったうえに、文字すべての組み合わせになってしまう。 これをどうにかする方法は見つけることができなかった…。

TEST=$(echo test) && eval echo  $(eval echo $(echo $TEST | xargs -I@ sh -c 'echo \"{$(echo @ | sed "s/./&,/g;s/.$//g")}\"{$(echo @ | sed "s/./,/g;s/.$//g...

コンソール上で、awkを使ってテストの点数などを10点台が何件、30点台が何件といった集計を行ってみる。 ある程度汎用性のあるように記述すると、以下のようにすることで〇桁(以下の例では2桁)での件数集計を行う。

yes 'n=100;echo $(( (RANDOM % ( $n + 1 )) + 0 ))' | bash | head -1000 > test.txt # 1-100までのランダムな数字を1000件出力
awk '{sub(/.$/,0,$NF);print $NF}' test.txt | sort -n | uniq -c
blacknon@BS-PUB-UBUN...

第27回シェル芸勉強会に参加してきました(復習)

第27回シェル芸勉強会に行ってきたので、その復習。

今回はsedコマンドの機能について学ぼうということで、sed縛りとなっていた。 sedコマンドというと基本は置換にしか使わないが、今回はラベルだったりパターンスペース・ホールドスペースを使ったりする。 正直、今回は全然ついていけてなかった…(´・ω・`)。 ラベルやパターンスペース・ホールドスペースの存在は知っていたのだが、それらをうまく利用できなかったと思う。 sedは奥が深い…。

問題・模範解答はこちら。 使用するファイルは1個だけなのだが、以下のコマンドでダウンロードしておこう。

git clone https://gith...

RabbitMQをSSL対応させてみる(with Graylogでログを受け取らせてみる)

前回、RabbitMQにキューイングされたログをGraylogで取得させるようにしたが、今回はさらにRabbitMQ側でSSL対応させて通信を暗号化させる。 証明書ファイルは(お金もないので)オレオレ証明書で作成する。 (Let's Encryptでもいいのだが、どうせローカルネットワーク内での検証なので)

1. SSL証明書の準備

まずはSSL証明書の準備から。 クライアント側(Graylog側)にクライアント証明書が必要になるので、CA証明書含めこちらを参考に作成を行う。

証明書作成後はRabbitMQへ送るのを忘れずに。 今回の場合は、「/etc/rabbitmq/s...


fluentdでRabbitMQにログを送信する

今回は、前回作成したRabbitMQクラスタにfluentdでログを送信する。

1. RabbitMQ側の設定

まず、事前にRabbitMQ側でvHostsなどの作成をしておこう。 ユーザは新規に「logger」ユーザを作成する。

■ vHostsの作成(「logs」)

rabbitmqadmin declare vhost name=/logs
rabbitmqctl set_permissions -p /logs guest ".*" ".*" ".*"
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin declare vhost...

Golangの勉強でsshのラッパーコマンド『lssh』というのを作ってみた

最近ちょこちょこGoを勉強するようにしてたのだが、せっかくなので何か作ってみようと考えた。 で、なんかないかなと考えたところ、結構前にPythonでsshのラッパー書いてたのを思い出したので、今回はそれをGolangで書き直してみた。 sshのラッパーなので、基本Linux/Mac OS Xでしか動かない(Windowsは対象外)になってる。

作り直しなので前作ったPythonのラッパーと基本は変更せず、「\~/.lssh.conf」というtomlファイルにログイン情報を記述してコマンドを実行するだけにした。 (オプ...


CentOS 7にRabbitMQをクラスタ構成で構築する

Graylogでログ取得に使うキューイングシステムとしてKafkaをちょこちょこいじってたのだが、ちょっと用途に合ってないことが分かった(暗号化まわり)。 で、ほかに何か使えるのないかなと思って調べてたところ、GraylogはRabbitMQににも対応しているようだ。 なので、今回はRabbit MQを2台構成のクラスタで構築をする(ここでは、MasterをBS-PUB-RABBITMQ01、SlaveをBS-PUB-RABBITMQ02で表現する)。 OSにはCentOS 7を用いる。

なお、RabbitMQのクラスタ構成には互いを名前解決できる必要があるので注意。

1. Rab

...

LinuxやUNIXで、コンソール上でフルパスからファイル名のみを抽出する場合、以下のような方法がある。

1. basenameコマンドを用いる

基本はこれ。 basenameという、ファイル名のみ(ディレクトリを指定したら最後)を求めるコマンドがあるので、これを利用する。

パイプで渡す場合はxargsを使う必要があるので注意。

basename PATH
[root@BS-PUB-CENT7-02 ~]# ls -1ad /opt/td-agent/*
/opt/td-agent/LICENSE
/opt/td-agent/LICENSES
/opt/td-agent/b...

Golangで、最低限WindowsなのかLinuxなのか、Mac OS Xなのか程度に確認したい場合、「runtime.GOOS」を用いるといいようだ。

test.go
package main import ( "fmt" "runtime" ) func main() { fmt.Println(runtime.GOOS) }

上のコードを実行すると、Ubuntuの場合だと...