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

転職先ではAWSとAzureを使用しているのだけど、結構VM(仮想マシン)とPublicIP(グローバルIP)、PrivateIPの紐付けを忘れてしまう事が多い。
で、いちいちWEBでアクセスして・・・とかやりたくないし、将来的には定期的にCSVとかで一覧を生成させて整形、あとはそれ見ればいいようにしたいので、Macからawsコマンドでその辺りの情報を取得させるようにした。

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | {InstanceName: (.Tags[] | select(.Key=="Na...

これだけは最低限おさえておきたいiTerm2の便利な機能・使い方9個

転職先で使うクライアントがMacになることから、ターミナルエミュレーターがTeratermからiTerm2に変更になる。
なので、ここのところiTerm2を自宅でいじくっていたのだけど、その際に「とりあえずこの辺だけ押さえとかないとなあ」と思った箇所が幾つかあったので、そのあたりをまとめてみることにした。

1.ターミナルのログを自動取得する

iTerm2では、Teraterm等と同様にターミナルログを自動取得させることもできる(ログ名は固定)。
設定方法は簡単。デフォルトで使用するプロファイルの設定画面で「Profiles」の「Session」を開いて、”Miscellaneou...


iTerm2で複数のタブに同じ処理を行わせる

iTerm2について引き続き。
Teratermのブロードキャストコマンドと同じく、iTerm2でもすべてのタブに同様の処理を行う(ブロードキャストする)ことができる。

対象のiTerm2のウィンドウで、「Command + Shift + i」キーを押下すると、以下のような注意ウィンドウが表示され、それ以降の処理はすべてのタブで適用されるようになる。

なお、ブロードキャストを終了する場合は再度「Command...


iTerm2でウィンドウを分割表示させる

引き続き、またもiTerm2について。
iTerm2では、基本的に新しいセッションを開く際はタブ(もしくはウィンドウごと別に開く)で開くことが多いのだが、どうやら画面を分割することができるみたいだ。

分割表示したいタブで、「Command + D」キーを押下すると横に、「Command + Shift + D」キーを押下すると縦にウィンドウが分割される。

横に分割

縦に分割

分割した各タブへの切り替え...


iTerm2でターミナルの以前の状態を確認する

今後、仕事でiTerm2を使っていくにあたって色々調べてみたところ、iTerm2には現在開いているターミナルの過去の状態を確認することができる機能「インスタンスリプレイ」なるものがあることを知った。

使い方は簡単。過去の状態を確認したいターミナルで、「Command + Alt + B」キーを押下すると、ターミナルウィンドウ下にバーが表示されるので、表示したい過去時点の時間を選択すれば良い。