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


ふと、ローカルにあるbashのrcファイルを、ssh接続先で一時ファイルを作成せずに利用できないかなーと思ったので調べてみた。 で、調べた結果bashには実行時に指定したPATHのrcファイルを読み込むオプション(--rcfile)があるのがわかった。 であれば、ssh接続時にそのコマンドを実行し、さらにローカルファイルの内容をプロセス置換でファイルとして読み込むようにssh越しに渡してやればいけるということになる。

ssh -t user@host 'bash --rcfile <(echo "'"$(cat ./path/to/local.rc)"'")' # そのまま渡す場合
s...

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を指定できる

UbuntuやCentOSに入ってるwhiptailでTUIっぽいスクリプトを作成する(+注意点とか)

個人的に、数字を入力してリストから選択するとかがあまり好きではなく、コンソール上でもカーソルキーとかで選択したりしたいタイプなのだが、実はUbuntuやCentOSの場合ならインストール時にwhiptailというコマンドがバンドルされている。 これ、なんのコマンドなのかというとOSインストール時とかに表示される疑似GUIみたいなTUIを扱えるようにするコマンドで、まあ↓のようなやつ。多分一回は見たことあると思う。

で、このコマンドでは色々な種類のレイアウト(リストからの選択や入力など)をオプションで指定ができる。 ncursesとか使って別途プログラムを書くという方法もあるけど、そこま...


だいぶ前に、CentOS 7にKeycloakをインストールして触ってみるということをしていたが、今回はちゃんとsystemdで管理できるようにインストールをしてみる。 基本的なインストール方法は変わらないが、一応事前準備から進めていく。

1.事前準備

前回と変わらず、以下のコマンドを実行して実行ユーザの作成や必要となるパッケージを導入しておく。

useradd keycloak
yum install -y git wget

動作にMavenが必要になるので、それらをインストールする。 まずはOracle JDKのインストールを行う。

wget --no-check-...

コンソール上で、ネットワークアドレスと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...

ここのところ、個人的に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...

Ubuntuで、パッケージのアップグレード時に適用されるバージョンを得る場合、aptコマンドを実行して取得するといいらしい。(sudo権限なしでも実行可能) パイプでまたぐと、「まだCLIツールとしては未完成だからスクリプトで使うときは注意しろ」という内容のstderrが出力されるので、grep等と組み合わせる場合は「2 > /dev/null」を追記した方が無難。

apt list --upgradable

ネットで調べものをしていたところ、『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...

Apacheのアクセスログやエラーログだが、デフォルトではSyslogは経由しない。 これらをSyslogを使って管理する場合、httpd.confに設定の追加が必要になる。

設定自体は簡単で、CustomLog/ErrorLogの設定に対して、パイプで繋げてloggerでSyslogに流すだけだ。 以下、設定の記述例(VirtualHostとか設定してると記述先のファイルも変わるので、自分の環境に合わせて記述すること)。 CentOS 7で確認をしている。

/etc/httpd/conf/httpd.conf
CustomLog "|/usr/bin/logger -p l...

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

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

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


ペネトレーションテストのデータマネジメントツール『Dradis』

ペネトレーションテストのデータ管理を行うツールについて調べてて、『Dradis』というものを見かけたのでUbuntu Server 16.04 LTSにインストールしていくつか診断データをインポートしてみることにした。 有償版と無償版があるようだが、今回は無償版。 Ruby製のツールらしく、インストールは簡単に行える。

sudo apt install -y ruby ruby-bundler ruby-railties ruby-dev git libsqlite3-dev mysql-server mysql-client libmysqlclient-dev redis-serv...

『OSSEC』はログ監視やファイルの改ざん検知、Rootkitの検出などが行える、WindowsやLinuxで利用できるホスト型IDSだ。 今回はこの『OSSEC』をCentOS 7にサーバ・エージェント方式で導入し、エージェントを導入したサーバへの侵入検知を行う。 OSSECには公式のWebコンソールも一応用意されているのだが、あまりコミットされてないし2016年12月時点では脆弱性もそのままっぽいので今回は利用しない。

なお、OSSECのサーバ⇔クライアント間通信ではUDPの1514ポートを利用するので、間にファイアウォールなどがあるようであれば事前に開放しておくこと。

1

...

今回はCentOS 7にファイルの改ざん検知を行う『AIDE』を導入する。 改ざん検知というと、『Tripwire』あたりが一番よく使われている(かなり頑張ってやればInotifyも使えなくはないのだが…応用効くし)のだが、yumでインストールする場合はEPELリポジトリが必要になる。 AIDEの方はデフォルトのリポジトリでそのままインストールできて、かつ設定も簡単に行えるようだ。

1. インストール

先ほど記述したように、インストールはデフォルトのリポジトリからそのままインストールできる。

yum install -y aide

これでOK。

2. 設定

次に...


Linuxをサーバとして複数人で利用する際、ssh接続するアカウント事に使用できるコマンドを制限したいことがある。 そのような場合には、以下のような手法が用意されている。

1. ログインシェルをrbashにする

前にここでも触れているのだが、rbashというbashのシンボリックリンクを作成して、それをログインシェルにすることで、特定のコマンドのみを実行可能なユーザを作成できる。 bashのシンボリックリンクなので、別にコマンドのバイナリを用意したりとかしなくてもいい。 また、PATHを直接指定してのコマンド実行も行えないようになっているのもよい。

おそらく、一番手軽な設定方法...


前回、Let's Encryptを使って無料のSSL証明書を取得してWebサーバの暗号化を行ったので、今回はメールサーバ(Postfix+Dovecot)での対応を行う。 なお、すでにPostfix + Dovecotでメールサーバは構築済みの状態とし、同居しているWebサーバはいないものとする。

1.Let's Encryptのインストール

まずは、以下のコマンドでgitをインストールしてLet's Encryptをダウンロードしてくる。

yum install -y git openssl mod_ssl
git clone https://github.com/lets...

CentOS 7にソースコードの静的解析を行う『SonarQube』をインストールする

JavaやC、PHPやPythonなど複数言語のソースを統合管理できるツール『SonarQube』なるものを知ったので、試しにCentOS 7にインストールしてみることにする。
『SonarQube』については、以下の概要が詳しい。

なお、すでにSELinux/Firewalldについては停止・無効化しているものとする。

1.前提パッケージの導入

『SonarQube』では、JavaとPostgreSQL(MariaDBはサポート外だが、MySQLも利用できる)を使うのでそれらを導入する。 まず、...


CentOS 7にWebベースのオープンソース請求情報管理システム『Simple Invoices』をインストールする

別件の調べものをしていたところ、Webベースのオープンソース請求情報管理システム『Simple Invoices』なるものを見かけた。
請求管理システムというと商用ではいろいろとあると思うのだが、オープンソースのものもあるのかと。
まぁ、日本と海外だと商習慣とか税金とか色々と違いがあるのでそのまま使えるかどうかはわからないけど、とりあえずインストールしてどんなもんかだけ触ってみることにする。なお、今回は検証なので、事前にFirewalldおよびSELinuxは停止住みとする。
(最後に更新されたのが2013年なのだが、大丈夫かな…?)

1.前提となるパッケージのインストール

ま...