久しぶりにPythonのバージョンを上げてみたところ、なぜかPython3.8のときには動作していた以下のようなプログラムで、『can't register atexit after shutdown』というエラーが出るようになった。

なんだろうなと思ったのだが、どうもthreadingでちゃんとjoinを待たないとエラーになるようになったらしい。 (ちゃんとjoinしてたつもりだったけど、どうも別の処理と混同していた...


xargsで各引数ごとの出力の先頭を色分けして表示する

結構前にネットサーフィンしてたところ、xargsの行頭に引数を色付きで出力するようなコマンドについて見かけたのだが、同じような処理を既存のxargsで行えないかと思ったのでやってみた。

seq 3 8 | nl | xargs -n2 bash -c 'seq $1 | sed "s/^/printf \$(tput setaf 0)\$(tput setab $(($0 % 9)))$1\$(tput sgr0)\"...

前にgrepでひらがな・カタカナ・漢字を抽出する方法について書いてたことがあったけど、先日置換が必要になったので念の為残しておく。

PerlのUnicodeプロパティスクリプトを使った置換(perl)

置換と言ったらsedなのだけど、残念ながらPerlのUnicodeプロパティスクリプト(\p{Hiragana}みたいな指定)がsedでは使えない。 なので、Perlで置換処理を実行する必要がある。

# perlでひらがなだけを置換する場合
command... | perl -C -ple 'use utf8;s/\p{Hiragana}/_/g'
$ cat a....

2021年あけましておめでとうございます(´・ω・`)。 色々とゴタゴタしてるうちに2020年が終わってしまった…。 最近は時間が経つのが早い…。

そんな年末年始にdotfilesを色々といじってる際、再読込するとPATHが重複して登録される記述がところどころに散見される状態だった。 これを修正するのも面倒だし、どうしたもんかなと考えていたのだけど、bashrc/zshrcで読み込みんだ最後にPATHから重複した要素をすべて削除させることで対応することにした。

以下のような記述をbashrc/zshrcの末尾に記述すればいい。

export PATH=$(printf %s "$P...

たまに、複数のDNSサーバに複数のドメインやIPアドレスの名前解決の結果を取得したいことがある。 要はdigを複数のサーバに対して複数の引数で連続でバーっと雑に実行したいということがあった。ので、bash functionを作った(昔に)。

本当は並列でバーっと処理するように書いたほうが良かったのかもしれないが、そんなに頻繁に実行しないだろってことでシングルになっている。

結構頻繁に使うので、自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$'\E[0;32m'...

たまに、雑にパラレルにpingを打ちたいということがあったので、そういうbash funcionを作った(だいぶ前に)。 pingの行頭にtimestampを付けて、かつ雑にブレース展開などで複数のipアドレスにpingを打ったりできるようにしている。

pingの他、port指定のためにcurlコマンドが必要になるけど、まあfunctionとかを自由に入れられる環境なら入ってるでしょってことでチェック入れてない。

自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$...

ふとした思いつきで、シェルスクリプトでちょっとしたツールを作ろうかと思ったのだけど、標準入力をパイプから受け付けると同時にキーボードからの入力を受け付ける方法がわからなかったので調べてみた。 そもそも、パイプから受け付けている場合にキー入力を受け付けるには仮想端末が必要になるので、以下のように記述してreadする必要があるようだ。

read ... </dev/tty

動くサンプルだとこんな感じかな。


最近、zshやbashの設定を弄ってカスタムするのにちょっと凝ってるのだけど、そうやっていじってるとキーバインドでも特定のコマンドを実行させたりしたくなってくる。 bashやzshではrcファイルにbindの設定を書けばキーバインドに任意のコマンド実行を割り当てたりできるので、ちょっと忘れないように備忘で残しておく。

bashの場合

bashで、キーバインドから任意のコマンドを実行させる場合、単純に実行させるなら以下のように定義する。 なお、このときaliasは読み込まないので注意。

# 例) Ctrl + Xで「ls -la」を実行させる場合
bind -x ' "C-X": "...

先日、Twitterをぼけっと見てたときに見かけたツール『browsh』。 なんとなんと、ターミナル上でANSIを利用して、WEBページを普通に閲覧するというツール。裏でFirefoxを動作させて、それをANSIに変換しているようだ。 Youtubeもターミナル上で再生できる様子。

ホントかよ…と思いつつ、Dockerコンテナが用意されているようなので以下のコマンドでインストールと起動をしてみる。

docker run --rm -it browsh/browsh

マジか…! 一部、使っているコンソールによっては表示できない文字があったりするが、それでもこれは凄い…。

...


先日、ボケーとネットサーフィン中にTwitterで見かけたツール『up』が良さげだったのでちょっと試してみることにした。 このupコマンドでどういうことができるかというと、コンソール上でパイプで渡した出力に対してgrepやsed、awkといった処理をリトライし、確定したらそのままシェルスクリプトとして出力することができる。

以下のgifを見てもらったほうがイメージしやすいかもしれない。

こんな感じで、特定の出力に対してパイプ後の処理を試行錯誤で試す際に便利なコマンドだ。


先日開催された、第38回シェル芸勉強会に参加してきたので、その復習。 実は1個飛ばしてたのでちょっと久しぶりな感じ。今回は数学の問題が多いらしい。

問題及び模範解答はこちら。最初に、問題等に使用するファイルをgitからcloneしておくといい。

Q1.

今回の勉強会のタイトル、Unicodeの文字を利用してちょっと読みにくい状態にしてある。

echo 'jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会'

この文字( 後のきゃろさんのLT でわかったのだが、キリル文字で大きい数字を表す際にこの○で数字を囲むらしい。そんな使い方なんだ…。)を消して...


bashrcで直前のexit statusが正常終了・異常終了に応じてプロンプトの表示を切り替えさせる

個人的にはローカルではzshを使っているのだけど、ローカルのbashrcファイルをリモートでファイルを配置せずに利用する方法を知ってリモートサーバ用のbashrcを設定するようになった。 で、zshでやっているようにプロンプトに顔文字と直前のコマンドの成功・失敗に応じて切り替えを行わせるようにしたので、(わざわざ残しとくほどのものでもなさそうだけど)一応その内容を備忘として残しておく。

直前のコマンドの終了ステータスを取得する場合、PROMPT_COMMAND を使って取得させる必要がある。 なので、以下のような設定を.bashrcに書いてやるといいだろう。

# カラーコードを...

2年くらい前からちょこちょこ作ってたツールがある程度形になってきて、個人的に結構便利に使えるようになったので(ここんとこ忙しくて書くこともないし)紹介してみる。

lssh』という名称でGolangで書いたsshクライアントコマンドで、設定ファイルの内容をもとに接続先を選択できる様になっている。 コマンドなのでMacOS XやLinuxで動くのと、WindowsでもWSL(2018.03のアップデートが適用されてる必要あり)で動作を確認してる(ssh接続処理も全部Golangで書いてるので、多分Windows単体でも動くと思うけど未確認)。 実際に使ってる画面はこんな感じ(gifフ...


普段はzshを使っているのだが、先日 ローカルのbashrcを利用してssh接続する方法 を知ったので、bashrcについても多少手を入れてみることにした。 で、zshでは右プロンプトにタイムスタンプを表示させたりしているのだが、今回はこれをbashでやる方法についてを残しておく。

zshでは右プロンプトは「RPROMPT」という設定項目で右プロンプトを指定できるのだけど、残念ながらbashにはそういったものは存在していない。 なので、PS1よりも先に実行されて、多少いろいろと自由がきく PROMPT_COMMAND にfunctionを指定することで、擬似的に右プロンプトを出...


認証が必要なTimeMachineサーバにバックアップを取ってから、Macbook(Mac OS X Sierra)のシステムリカバリをしようとしたところ、GUIに沿って操作するだけだとTimeMachineを認識できないようだ。
じゃ、どうするんだというと、Command + R + 電源ボタンでリカバリ用のmacOSユーティリティを起動→「TimeMachineバックアップ」を選択してネットワークに接続したら、上のメニューからターミナルを開いて以下のようにコマンドを実行する。


tmuxでpaneの色(文字色・背景色)を変更する

時折、ターミナルの背景色や文字の色などを環境や状況に応じて静的・動的に簡単に変更できたりしないかなーと考えたりする。 で、なんか方法あるのかなと調べてみたところ、tmuxの2.1からならpaneごとに背景色などを変更できるらしい。もちろんtmuxなので、デフォルト設定しておけば静的にもできるし、使用中でもpaneの色が変更できる。

動的にpaneの色を変更する場合は、プレフィックスキーの入力後、以下のようにコマンドを実行する。 「-t:.n」にはpaneの番号を入れる。

:select-pane -t:.0 -P 'fg=cyan,bg=black'

今まで余り考えずクライアント側のコマンドをただ実行するだけで知らなかったのだが、scpには-t-fというオプションがあるらしい。 このオプション付きでサーバ側でscpを実行することで、標準入力から処理内容を受け付けてファイルを転送しているそうだ。

1. ローカルからリモートへ転送する場合

ローカルからリモートに転送する場合は、以下のように改行区切りで指示を出し、それをパイプでscpに渡す。 転送する対象となるファイルPATHやサイズを指定して、次にその中身を出力している。1ファイルにつき1回づつ転送することになるようで、配下のディレクトリを指定したら自動で作成されるようだ。

...

時々、指定されたPATHに「/」が含まれている場合は自動的にディレクトリを作成してファイルを作成、コピーさせたいという事がある。 しかしtouchコマンドやcpでは自動でフォルダを作成することはできないので、通常であればその前にmkdirでディレクトリを作成しておく必要がある。

で、結構面倒だなと思って調べてみたところ、インストール時等にファイルを配置するために使われるinstallコマンドを利用することで、作成するファイルを配置するフォルダが無かったら自動で作成することができると知ったので、備忘で残しておく。

install -D /コピー元PATH /コピー先PATH
install -m 644 -D /コピー元PATH /コピー先PATH # -mでModeを指定できる

コンソール上で、ネットワークアドレスとCIDRを指定して対象範囲のIPアドレス一覧を出力したい場合、どんな方法があるかなと思いちょっと調べてみた。 大体3個くらい(PythonとかRubyでスクリプト書くって方法を入れればもっとあるけど)を思いついたので、とりあえず残しておく。

1. nmapを使う

疎通できるネットワークにいると疎通確認が行われてしまうのでちょっと問題があるが、nmapの疎通可能IPアドレスを調査する -sL オプションを利用してやることで、対象範囲のIPアドレスの一覧を取得できる。

nmap -sL 172.16.0.0/24|grep "Nmap scan...

sedでは四則演算とかの計算処理については対応していないのだが、bashと組み合わせる事で計算処理ができないかとやってみたので備忘で残しておく。 で、結論としては以下のように、e(置換や抽出した内容を元に組み立てたコマンドを実行する) を利用することで、bashで $((計算式)) をechoさせることで計算をさせることができる。

echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge'
blacknon@BS-PUB-UBUNTU-01:~$ echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge...

Yubikeyでは、Mac OS Xログイン時にパスワードとセットでYubikeyを使用しないとログインできないようにする(二要素認証設定ができる)ことができるので、実際やってみることにした。 手順も用意されていて結構簡単に実現できるようになっている。 参考にする手順はこれ(2016年12月)。 事前に、Yubikeyでチャレンジレスポンスの設定(手順上はSlot2なので、検証時はSlot2で行った)をしておくこと。

まず、こちらのページから「Mac OS X Logon (using Yubico-PAM)」をクリックし、pamモジュールのインストーラーをダウンロード、2要素...


ここのところ、個人的にseqコマンドを多様することが多くなったので、あとで見返すために色々と使い方を残しておきたいなというのがあるので備忘として残しておく。

1. 基本的な使い方

基本的には、以下のようにして連続した数字を出力させることができる。 マイナスや少数の数字も指定できる。

seq x # 1~xまでの数字を各行に出力する
seq y x # y~xまでの数字を各行に出力する
seq y n x # y~xまでの数字をnごとに各行に出力する
blacknon@BS-PUB-DEVELOP:~$ seq 5
1
2
3
4
5
blacknon@BS-PUB-DEVELO...

ぼけーっと調べ物していたところ、パイプで渡した内容をWeb上にペーストしてくれる『seashells』なるサービス・ツールを見かけたので、ちょっとお試し。
ncで1337ポートにポストするだけでもいけるようだが、クライアントプログラムも用意されているらしい。pipでインストールできる。

pip install seashells

後は、以下のようにコマンドを実行してやればその実行結果をそのままペーストしてくれる。 クライアントプログラムの場合、teeのようにPOSTしつつ標準出力にも出してくれるらしい。

コマンド | nc seashells.io 1337
コマンド | s...

ネットで調べものをしていたところ、『gtop』なるNodejsで書かれたモニタリングツールを見かけたのでちょっと試してみる。 Nodejsで書かれているので、npmコマンドからインストールができる。

# CentOSの場合
yum install epel-release
yum install nodejs
npm install gtop -g

# Ubuntuの場合
sudo apt install nodejs-legacy npm
npm install gtop -g


ファイルや標準入力を指定行数で分割して、かつそれをそのまま(一時ファイルを作成せずに)次のコマンドに渡したいといったことがある。 例えば、以下のようなファイルがあったとして、5行ごとに合計を集計するといった処理をしたいとする。

blacknon@BS-PUB-DEVELOP:~$ cat test3.list
a01 13320
a02 64
a03 29730
a04 28184
a05 8993
b01 32490
b02 29077
b03 29590
b04 1291
b05 14097
c01 17676
c02 7998
c03 9720
c04 30072
c05 7565...

コンソール上に一行のグラフを表示させる『spark』コマンド

前々から知ってはいたのだが、コンソール上にフォント使ってグラフを描くという『spark』コマンドをインストールしてみる。
シェルスクリプトのようなのだが、フォントをうまいこと使ってグラフを書いてるのでちょっと面白い。

インストールは、以下のコマンドで行える。

sudo sh -c "curl https://raw.githubusercontent.com/holman/spark/master/spark -o /usr/local/bin/spark && chmod +x /usr/local/bin/spark"


前回記述したプライベート認証局の構築から、クライアントへのCA証明書のインストール方法のみ抜粋。
各種OSでの配布したルート証明書のインストール方法は、以下のようになっている。

1. Windowsの場合

作成したルートCA証明書をダブルクリックし、「証明書のインストール」でインストールする。
なお、インストール時には「現在のユーザ」を使い、かつ証明書ストアは「信頼されたルート証明機関」を選択する。

コマンドでルート証明書をインストールする場合は、以下のようにする。

certutil -addstore -f "ROOT" ルートCA証明書

2.Mac OS Xの場合

...

sshやWordPressへのログインにワンタイムパスワードを利用できるようにするGoogle Authenticatorだが、少し残念なことにパスワードを確認するためのアプリケーションがiPhone/Androidにしか用意されていない。できればLinuxの特定のサーバだったり、手元のMacBookなどでも確認できるようならばいいのに…と思ったので、そういったことができないか少し調べてみた。

で、どうも「oath-toolkit」コマンドを利用することでワンタイムパスワードを取得できるようなので、試してみることにした。
まずは、以下のコマンドでインストール。

sudo yum in...

ログなどでキーワードをハイライト表示させるのに便利なコマンド『rainbow』

先日紹介した『colout』と似たようなコマンドで、『rainbow』というコマンドがあるので今回はそれを触ってみる。

1.インストール

まずはインストール。
以下のコマンドを実行する。

git clone git://github.com/nicoulaj/rainbow.git
cd rainbow
sudo python setup.py install

2.使ってみる

インストールされたr...


Linuxコンソール上で、指定したファイルからランダムに行を取得させたい時がある。
そんなときは、shufコマンドを用いれば良い。

以下のようにコマンドを実行することで、指定されたファイルからランダムに「-n N」で指定したN行を抽出する。

shuf -n N ファイルPATH