日曜の夜、ふと『コンソール上でカウントダウン後にコマンドの実行とかさせてみよう』と何故か思いついたので、ちょっとやってみた。 簡単なカウントダウンであれば、以下のようにコマンドを実行すればいい(bannerやlolcatは文字を大きく表示させるためのものなので、必要なければechoとかに書き換えればいい)。

echo {3..0} | xargs -d' ' -I@ -n1 bash -c 'clear;banner "@" && sleep 1' && banner 'Boom!!!!!!!!!' | lolcat

…まぁ、コレだけなんだけど。 で、似たような何かについて探してた...


諸事情で文字列の小文字・大文字全ての組合せが欲しくなり、手軽に済ませられないかなと調べてみた。 で、そもそもbashではブレース展開を用いることで、つなげた文字列の組み合わせを生成させることができる。

blacknon@BS-PUB-UBUNTU-01:~$ echo {a,b,c}{1,2,3}
a1 a2 a3 b1 b2 b3 c1 c2 c3

つまり、sedで対象の文字列を1文字づつ大文字・小文字ブレース展開で利用できる書き方に変換させてやり、evalなどで出力させてやればいいということになる。 実際にやってみた結果が以下。(Macの場合はgsedで実行)

# evalでや...

ログの監視やなんやらで、tail -Fなどと組み合わせて使用する機会の多いsedやawk、grepだが、デフォルトの動作ではバッファリングされてしまう。 これをバッファしないように実行する場合、以下のようにコマンドを実行する。

sedの場合

GNU拡張されているsedの場合、-uオプションというオプションがあるので、それを用いる。

sed -u '~'
sed --unbuffered '~'

注意したいのが、Mac OS XのsedコマンドなどGNU拡張でないsedの場合、-uオプションが無い。 この場合は、後述するstdbufを用いるか、(どっちにしろcoreuti...


最近知ったのだが、bash 4.0以降ではコプロセス(coprocess)なる機能が追加されているらしい。 名前付きのバックグラウンドジョブみたいなもので、コマンドを指定して起動後、値を渡したら処理した値を後から抜き出す事ができるらしい。 コマンドの機能をデーモン化するようなイメージだろうか?

以下、実際に使ってみた例。 視覚的にわかりやすいよう、awkで頭に文字列を追加するような処理にしている。

# コプロセスの生成
coproc AWK_COPROC { awk '{print "AWK_" $0;fflush()}' ;}

# 値をコプロセスに渡す
echo test >&"$...

ふと、シェル芸でワードリストから簡単なレインボーテーブルを生成することができないかと思ったので、ちょっとやってみることにした(レインボーテーブルと言うか、作ってるのは簡単な逆引き表なのだが)。 記号系にエスケープが必要だったりするので、その辺に注意が必要かも。 とりあえず、以下のようにコマンドを実行することで、「パスワード ハッシュ値」の形式でワードリストが生成できた(sha256sumのトコは、ターゲットとなる形式に応じて切り替えて於けばいいだろう。md5sumとか。)。

なお、速度向上のためxargsでパラレルでの実行をさせている。 (2017/06/29 ちょっと間違ってたので修正...


ちょっとした調べ物中、指定したコマンドの出力結果を出力に応じてコマンド出力先を指定できる『pipexec』なるものを見かけたので、面白そうなのでちょっと試してみる。

1. インストール

まずはインストールから。 DebianやUbuntu系であれば、aptからインストールが可能だ。

sudo apt install pipexec

CentOSやMac OS Xなどでは別途コンパイルが必要になるので、以下のようにコマンドを実行しコンパイル、インストールを行う。

wget https://github.com/flonatel/pipexec/releases/downl...

Linuxでハードウェアの情報(CPUやメモリの型番やマザーボードの型番、シリアルナンバーなど)を取得する場合、dmidecodeを使って取得する場合が多い…のだが、このdmidecodeが利用できない場合、どうやってマザーボードやCPU、メモリの情報を得ればいいだろう。 というわけで、ちょっと調べてみた。

1. CPUについて

dmidecodeでは、以下のようにコマンドを実行することで、CPUのハードウェア情報を得ることができる。

dmidecode --type processor
# dmidecode --type processor
# dmidecode 2.12...

ハッシュのストレッチングみたいなことをbashでできたら面白いかなと思って調べてたのだけど、特定のコマンドにパイプでn回値を渡す、というような処理はちょっと書くのが難しいようで、以下のようにforとか使ってやる必要があるみたいだ。

# 'Hello World!Yeah!'を3回sha256でストレッチングするという処理をしてる
echo 'Hello World!Yeah!' | (read v; for i in {1..3};do v=$(echo $v | (sha256sum|awk '{print $1}'));done;echo $v;)
echo 'Hello World!...

bashのブレース展開を利用する際、どうしても出力の区切り文字が空白になってしまう。 これをawkのOFSのように、任意の文字にしたいといった場合どうしたらいいのかと調べたところ、サブシェルで一度リストに入れてしまって、そこでIFSを指定して出力時の区切り文字を指定するという方法がよさそうだ。 以下、実行例。ここでは、区切り文字をコロン(:)にしている。

echo $(set 'ABC'{1..10};IFS=:;echo "$*")
[root@BS-PUB-CENT7-01 ~]# echo $(set 'ABC'{1..10};IFS=:;echo "$*")
ABC1:ABC2...

ちょっとしたcsvファイルをソートする際、ヘッダーである1行目はそのままに中身だけソートする必要があったので、ちょっと調べてみた。 で、以下のようにすることで1行目の位置はそのままにソートが可能なので、備忘として残しておく。

awk 'NR==1;NR>1{print $0|"sort"}'
awk 'NR==1;NR>1{print $0|"sort -1krn"}' # 例1) 1列目で数字の降順
awk 'NR==1;NR>1{print $0|"shuf"}'       # 例2) ヘッダー以外の行でシャッフル

先日、ssh接続する際に.ssh/configで指定していた鍵ではない秘密鍵を使って接続しようとしてたところ、公開鍵を登録していない秘密鍵を指定しても接続されてしまうという事があった。 なんだこりゃと思って-vオプションを付与して見たところ、以下のような動きをしていた。

blacknon@BS-PUB-DEVELOP:~$ cat .ssh/config
Host 192.168.0.119
HostName 192.168.0.119
User root
Port 22
IdentityFile /home/blacknon/.ssh/id_rsa
blacknon@BS-PUB-D...

ここのところ、ちょっとした対応のためにレインボーテーブルについて調べていたのだが、Python3製のワードリストからレインボーテーブルを生成できる『Leprechaun』なるツールを見かけたので、試しに使ってみることにする。 指定したワードリストからハッシュ値を生成できるので、よく利用されるパスワードをワードリストに入れておけば、ランダムな文字列で生成したレインボーテーブルよりも効率よくパスワード解析ができるかもしれない。 ワードリストからの生成の他、地味にソルト(前後対応)やストレッチングも指定できるので、結構便利そうだ。 今回はUbuntu Server 16.04 LTS上でテストを...


最近、色々とsudoで設定を変えたりすることが多かったので調べてみたら、結構色々な設定やsudoコマンドのオプションとかがあるようだったので、調べた内容から基本的な設定や便利そうな使い方についてまとめてみることにした。 なお、/etc/sudoersではなくLDAPでもポリシー設定はできるようなのだが、あまり使うパターンも少ないだろうから今回は割愛する。 SELinuxのポリシー設定についても設定はできるようなのだが、今回は割愛する。 なお、検証にはCentOS 7の以下のバージョンを用いている。

[root@BS-PUB-CENT7-01 test]# sudo -V | head -1...

ぼけーっとネットで調べ物してたところ、ログの簡単な集計・分析用のコマンド『petit』なるものを見かけたので、ちょっと試してみた。 Debian/Ubuntu系であればaptから、RHEL系であればrpmファイルを指定してyumからインストールできるようだ。

sudo apt install petit # Debian/Ubuntu系の場合
yum install -y http://crunchtools.com/wp-content/files/petit/petit-current.rpm # RHEL系の場合

インストールができたら、以下のようにコマンドを実行することでログを...


Twitterボケっと見てたところ、指定したコマンド失敗時にリトライをする方法についてのツイートが流れてきたので、個人的にちょっと調べてみた。

回数制限を付けない場合

回数制限を付けない(失敗したらずっとリトライをし続ける)のであれば、untilでやるのが一番短く書けそうだ。

until COMMAND;do sleep 1;done

例えば、こんな感じでやると、成功するまでは1秒ごとにリトライをする。

[root@BS-PUB-CENT7-01 ~]# until mkdir $(date +%Y%m%d_%H%M00);do sleep 1;done
mkdir:...

前にssh越しにsudo経由でtarを用いるという事をやっていたのだが、今回はrsync。 で、rsyncもそうみたいなのだが、ssh越しで擬似端末(tty)を使っての通信できないらしい。 こうなると、sshで「-tt」オプションを付けて擬似端末を有効にしての対応は難しいので、CentOSなどのデフォルト(AWSとかAzure上のイメージでは手が入ってるので対象外)だとsudo実行時には擬似端末を要求する指定(Defaults requiretty)を解除する必要があるようだ。 ユーザごとに設定もできるのだが、面倒であれば以下のようなコマンドを実行してrequirettyを無効化してしまお...


時折、リモートサーバにある"ログインユーザでは読み取りができないファイル"をそのままローカルにコピーしたいことがある。 ssh経由でファイルをコピーするといえばscpがよく使われる方法だと思うが、残念ながらscpではリモートサーバ側でsudoを使ってroot権限でファイルを読み込んだりといった事はできない。 さて、じゃどうすればいいのだろうか。

こういったとき、sudoをNOPASSWDで実行可能な状態であれば、単体のファイルであればsshコマンドからsudoを使ってcatで、ディレクトリごとであれば一度tarでアーカイブ化してローカルでそのまま展開させる事ができる。 なお、RHEL系のデ...


『Open Visual Traceroute』を使ってパケットが世界のどこを辿っているのかを見てみる

ちょっと調べ物をしていたところ、『Open Visual Traceroute』という、tracerouteを実行した際にパケットが世界のどこを飛んでいるのかを3Dの地球儀上に表示してくれるツールを見かけた。 パケットスニッファとしても利用可能、Javaで書かれているためかWindows・Mac OS X・Linux(Ubuntu・OpenSuse)とマルチプラットフォームに対応していたりと、なかなか良さそう。

インストーラーはトップページにリンクがあるので、そこからダウンロードしてインストールしてやればいいだろう(今回は手元にGUIのある環境がWindows 10なのでexeを取得)。 なお、当たり前だがJavaが必要になるので注意。


Linuxなどのターミナル上で、複数列を1列にして表示させるのってどうすると良いんだろなと思ったので、ちょっと調べてみた。 1列に変換するといっても、横方向と縦方向の2パターンあると思うので、一応両方のパターンについてやってみる。

横方向から1列に変換する

横にスペース区切りに縦1列に変換する場合は、以下のようにxargsで読み込んでいってあげるといいだろう。

cat file.path | xargs -n1
blacknon@blacknon-ThinkPad-X201:~$ cat test1.txt 
a01 a02 a03 a04 a05
b01 b02 b03 b0...

Golangで、データのゼロ埋め・スペース埋めをする場合、以下のようにすれば良いようだ。

padding-test.go
package main import ( "fmt" ) func main() { // ゼロ埋め fmt.Print("--ゼロ埋め--\n") fmt.Printf("'%020d'\n", 123) fmt.Print("\n") // スペース埋め(右) fmt.Print("--スペース埋め(右)--\n") fmt.Printf("'%20s'\n", "Right") fmt.Print("\n") // スペース埋め(左) fmt....

Microsoft Azure上で鍵認証でLinuxを使っているのだが、諸事情によりログイン用の秘密鍵を紛失してしまうといったことがあった。 流石に何処かにはあるだろうと色々と探したのだけど、どうしても見つからない。 どうすりゃいいかなぁ…と調べていたところ、Azureポータルの対象VMを選択すると「パスワードのリセット」なる項目が。 藁にもすがる思いでそこから公開鍵を登録してみることにした。


CentOS 7にオープンソースのSSOサーバ『Keycloak』をインストールして触ってみる

ちょっとした好奇心というか、マイブーム的なものでWebアプリケーションのSSO(シングルサインオン)ツールについて調べていたところ、RedHatの出しているツール『Keycloak』が良さそうだというのを見かけたので、CentOS 7にインストールして触ってみることにした。 ただ、SSOだとログイン先の設定なども必要になってきて色々と準備も必要になるので、数回に分けることにして、今回は管理画面を表示するまでにしておく。 なお、バージョンは3.1.0を用い、.serviceファイルは今回は作成しない(次回以降)。 あと、(本当は良くないのだが、今回はお試しなので…)FirewalldとSEL...


awkで処理結果を元になったファイルに上書きする

ふと、「awkでファイルの上書き保存ってどうすんだろうなぁ…。GNU sedだったら-iオプションで上書きできるけど、awkだとんなオプションなかったよなぁ…」と思ってちょっと調べてみたところ、どうやらGNU awkの場合だと4.1.0以降で上書きができるようになってたらしい。 知らなかった…。 以下のように、-i inplaceで指定することで上書きができるようだ(参考:The GNU Awk User’s Guide: Extension Sample Inplace)。

awk -i inplace '{ ... }' File.path

blacknon@BS-PU...

夜中に寝れなくなって、なんとなくlastコマンド、lastbコマンドのログ改ざんできないんかなと思っていじってたところ、root権限があれば、utmpdumpで一度テキストに変換してから再度バイナリファイルに変換することで簡単に改ざんできてしまったので、備忘として残しておく。

utmpdumpコマンド自体はCentOS 7やUbuntu Server 16.04 LTSであれば最初からインストールされているはずなので、まずは以下のコマンドでwtmp、btmpをバイナリからテキストにエクスポートする。

utmpdump /var/log/wtmp > ~/wtmp.txt
[root...

bashでファイルを利用して処理を行い、その結果を処理に使ったファイルに上書き・追記するといった場合、普通にやると対象のファイルが空になってしまう。

[root@BS-PUB-CENT7-01 ~]# cat -n test.txt
     1  a01 a02 a03 a04 a05 a06 a07 a08 a09 a10
     2  b01 b02 b03 b04 b05 b06 b07 b08 b09 b10
     3  c01 c02 c03 c04 c05 c06 c07 c08 c09 c10
     4  d01 d02 d03 d04 d05 d06 d07 d...

秘密鍵ファイルからssh接続用の公開鍵を再度生成する

sshで公開鍵認証を使っている際、手元に秘密鍵はあるのだけど、間違えて公開鍵を削除してしまったり、なくしてしまった場合というのがある。 そんなときは、秘密鍵さえあるのなら 以下のコマンドで公開鍵を出力できる。

ssh-keygen -y 秘密鍵のPATH
[root@BS-PUB-CENT7-01 ~]# cat testkey.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVntFu0YdUXBerSVVKwX495TKxFuUV7y6yo+Ybx2oYAyZzPVAuXgoWctqwbbM7XmhAwidQtqjCy4xLUAZSTlXv...