chrootをさせるときなど、OpenSSHではアクセスしてきたクライアントに対し、matchに記述した条件に応じてその後の処理を変えることができる。 これを利用することで、たとえば特定のネットワークアドレスからのアクセスの場合はchrootを、そうでない場合は普通にsshで接続させるようにするなどの指定が行える。

設定は「/etc/ssh/sshd_config」で、以下のような内容を追記してやる。 (ちなみに、調べた内容はCentOS 7の「openssh-server-6.6.1p1-33.el7_3.x86_64」なので、バージョンによっては差異があるかもしれない)

/et...

ちょっとしたスクリプトをPythonで作成しようとしてて、バージョン番号の比較をさせる必要があったので備忘として残しておく。 Pythonでバージョン番号の比較を行う場合は、以下の2つの方法があるようだ。

1. 『distutils.version』を用いる

『distutils.version』を利用することで、バージョン番号の比較が行えるようだ。 以下のようにインポートして関数を利用、比較してやれば良いようだ。

比較用の関数は2つ用意されており、「StrictVersion」と「LooseVersion」が利用できる。 アルファベットを含むような、数字だけではないバージョン番号...


個人的には、ログはテキストファイルの方が色々と都合が良い(後からの統計取得だったり検知・加工してエラー確認とかシェル芸でできるので)のだが、諸々の事情(セキュリティ的な色々だったり、コマンド操作があまりできない人でも使える状態にしたいなど)によって、テキストファイルでの出力や保管、閲覧が都合が悪い事がある。 で、rsyslogではログをDBに出力可能なので、今回はOSにはCentOS 7を、出力先のDBにはローカルにインストールしたMariaDBを用いる。

1. MariaDBのインストール

まずはMariaDB自体のインストールから。以下のコマンドでインストールする。

yum i...

Graylogのクエリでヒットした箇所をハイライト表示させる

Graylogでは、クエリでヒットした箇所についてハイライト表示させるオプションがある。 コレを有効にしてやることで、ログのどこの箇所で検索がヒットしたのかがわかるようになっている。 設定方法は簡単で、Graylog Serverの設定ファイルで以下の項目をtrueにしてやるだけだ。


シェル芸で、文章から特定の文字列が縦読みで存在するかどうかgrepする

ふと、文章の中に縦読みで特定の文字列が仕込まれていないかどうか、シェル芸で確認できないかなと思ったのでやってみた。 至極当たり前の話として、grepは行に対して処理を行うので縦書きのものには利用できない。 で、じゃあどうすればいいのか。 縦書きに対して処理できないなら、横書きに変換してしまえばいい。

縦書きから横書きに変換するのは、結構前に表に対して同様の処理を行っていたので、それを応用してやれば良い。 ちょっと長くなるけど、awkでやった際のコマンドが以下。


LANケーブルの物理配線時に、物理nicとeth0とかens18とかが、どれがどれに紐付いているのかわからない事が多い。 で、もし載ってるOSがLinuxであれば以下のようにethtoolコマンドを実行することで対象のNICのLEDを点灯させることができるので、どれがどれに紐付いてるのか識別が可能だ。


lsshを使って鍵に応じてアクセス可能なサーバを切り替えさせる簡易的なsshの踏み台を構築する

この間、lsshというsshのラッパーコマンドをGolangで書いてみたのだが、なんか他に使い道ないかなと考えてみた。

このコマンドは リストから接続先を選択する という作りなので、コマンド実行さえさせてしまえばあとは接続先を指定してsshへのログインを自動で行える。 なので、「/etc/passwd」とか秘密鍵の実行コマンドに指定することで、(接続先のカギやパスワードをクライアントに渡すことなく)ssh接続だけを行う踏み台サーバにできるというのがあったので、 他にネタがなかったので せっかくなので実際に鍵ファイルに応じてアクセス可能なサーバを変更するように設定してみることにし...


Azureの新ポータル上で鍵認証方式のLinuxサーバを立てる際に、前にちょっと引っかかった(+他に特に書くことが無かった)ので、残すほどのことでも無いかと思ったが備忘として残しておく。 Azure上で使用するサーバの鍵を作成する場合、「---- BEGIN SSH2 PUBLIC KEY ----」から始まる形式(SECSH形式)で登録してやる必要があるので、以下のようにコマンドを実行して鍵を作成してやる。


ちょっとした作業で、親プロセスIDを指定して子プロセスを再帰的にkillしたいということがあったので、その備忘。 特定のプロセスをkillする場合だと、よくpgrepを使ってプロセスidを取得してそこからkillさせていたのだが、それだと子プロセスが残ってしまう。 でどうすればよいのかと調べたところ、pgrepやpkillでは-g オプションを付与することで全プロセスIDを取得・指定できるので、それを利用すれば良い。

pgrep -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスを取得する
pkill -g $(pgrep 親プロセス名) # 子プロセスを含め...

MariaDBで、rootのパスワードを失念してしまってその後の操作ができなくなってしまった。 で、初期化をしたので備忘として残しておく。 なお、MariaDBのバージョンは5.5を用いている。

やり方は簡単で、一旦MariaDBのプロセスを落としてからセーフモードで起動、パスワードを設定してMariaDBのプロセスを再度起動させてやるだけだ。


vimで権限のないファイルをそのまま保存させる

仕事などで各サーバに入っているvimでの操作を行うことが多いのだが、疲れてくるとうっかりroot権限が必要になるファイルを一般ユーザで開いてしまい、そのまま保存させることができずに再度rootで開き直して再編集する、といったことをよくやってしまう。 で、これをそのまま保存させる方法があるようなので備忘として残しておく。 やり方は単純で、保存する時に以下のようにコマンドを実行してやれば、sudoでroot権限で保存がされる。 (当たり前の話だが、sudo権限がないと行えない操作なのでそこは注意)


sedやawkで、置換前の値を元に、計算した値で置換を行いたいというのがあったので、備忘で残しておく。 例えば、以下のようなファイルに対し、数字を3足した内容を出力させたいとする。

[root@BS-PUB-CENT7-01 ~]# cat test.txt
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10

1. gnu sedの場合

sedの場合、sed自体には計算を行う機能がないため、後方参照とサブプロセス、さらに後方参照で得た値をサブプロセスに渡すために、置換した値をOSのコマンドとし...


sedでは1行目からn行目までの範囲に対して処理をするように指定できるのだが、最終行からn行に対してのみ置換などの処理を行わせたい場合、普通には指定ができない。 たとえば、以下のようにしてすることで頭の4行のみを対象とする事はできるのだが、後ろの4行を対象に処理をさせることはできない。

sed '1,4s/^/#/g' test # 先頭4行のみを対象とする。これは動く
sed '$-4,$s/^/#/g' test # 末尾4行を対象にしたいが、マイナスは指定できないのでこれは動かない
[root@BS-PUB-CENT7-01 ~]# cat test
1
2
3
4
5
6
7...

Twitterでそんなのを見かけたので、そういやどうやんのかなと思ってちょっと調べてみた。 そもそも、cdで複数個上の階層のディレクトリに移動する場合、以下のように指定する。

cd ../../ # 2個上の階層
cd ../../../ # 3個上の階層

ただ、こんなのいちいち書いてられないので、もうちょっと分かりやすく書けないものか。 で、調べてみたところprintfをうまく利用することで、historyなどから再利用しやすく書けるようだ。

cd $(printf "%0.s../" {1..n})


前にGraylogのSSL化対応について記述したことがあったが、今回は同一OS上にNginxを同居させて、リバースプロキシとして動作させることでSSL化を行う。 設定自体は特に難しいこともなく、すぐに行える。 参考手順は、公式ドキュメントとして用意されているこちら

ただ、Graylog Collector Sidecarを使っている場合は各エージェントで設定変更が必要になるので注意。

1. Graylogの設定変更

先にGraylog側の設定から。 Graylog Serverの設定ファイルである「/etc/graylog/server/server.conf」で、以下のよう...


ちょっと前にも書いたが、scriptコマンドとawkを組み合わせることで、ターミナルログをタイムスタンプ付きで記録することができる。

script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)
[root@BS-PUB-CENT7-02 ~]# cat session.log
2017-02-02 11:06:26 スクリプトは 2017年02月02日 11時06分26秒
2017-02-02 11:06:26  に開始しました[root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:0...

行儀が悪いというか、あまり作ることはないと思うのだが、コンソール上で『-~』で始まるファイルを扱う場合。 こういったファイルの場合、ただ単にシングルクォーテーション・ダブルクォーテーションで括ってやっても駄目だったりする。 こういったファイルをコンソール上で扱う場合、大体のコマンドでは以下のように二重ハイフンを付与することで対応できる。

コマンド -- ファイルPATH

sshやRDP、VNCの踏み台サーバとして利用できるApache Guacamoleでは、LDAP連携を行うことでActive Directoryユーザでのログインが行える。 設定は簡単で、公式で配布されているjarファイルを所定の位置に配置してやり、かつLDAP連携の設定を設定ファイルに追記するだけだ。 公式でも手順が公開されている(…今回は既存のADとの連携だったからかそのままは利用できなかったけど)ので、参照すると良いだろう。

まず、以下のコマンドでjarファイルのダウンロード・配置を行う。 (以下の例では、Guacamoleのバージョンが0.9.10となっているので、自身の環境に合わせてファイルをダウンロードすること。また、ファイルの配布先についても環境に応じて変更すること。)


空行区切りのブロックに対して、特定のキーワードを持つブロックを除外して出力する、ということをやりたいというツイートを見かけて、将来的に自分にも必要になる時が来るかもしれないので備忘として残しておくことにした。 とりあえず、ここに記述したようにawkを使えばいけるようだ。

sed '1d;$d' test.txt | awk -vRS= -vORS='\n\n' '!/XXX/'

諸事情により、ドメインの有効期限についてスクリプトで取得する必要が出てきたので、取得方法について残しておく。 LinuxやMac OS Xの場合、whoisコマンドでドメインのwhois情報が得られるので、そこからドメイン有効期限を取得する。 ドメインの種類によってwhoisの出力内容は異なり、有効期限の表示方法も変わってくる。

以下、一般的によく利用されるドメインの種類別での取得方法(google.\~で確認している)。

whois google.co.jp | sed -n '/状態/s/^.*(\(.*\)).*$/\1/p'
whois google.jp | awk '/有効...

awkで、n回目に条件にマッチした行のみに処理を行わせたいことがあったので、備忘として残しておく。 ちなみに、1回目ならこれでOK。

cat test1.txt | awk '/abc/{print $1;exit}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt
1 abc
2 bbb
3 ccc
4 ddd
5 eee
6 fff
7 ggg
8 abc
9 bbb
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt | awk '/a...

wgetやcurlなどで、よく利用するURLと言うのはあると思う。 で、毎回historyから取ってくるのも面倒だなぁと思って調べてみたところ、コンソール上でよく使うURLをブックマークできるツール『Buku』というコマンドを見かけたので、ちょっと試してみた。

1. インストール

Python3で書かれているらしいので、事前に必要となるパッケージをインストールをしておく。

sudo apt install python3-cryptography python3-bs4 git # Debian系の場合
sudo yum install python3-cryptography p...

Yahoo!PipeやIFTTTのように使える自動化ツール『Huginn』をUbuntu Server 16.04 LTSにインストールする

まえにStackStorm(St2)という、イベントドリブンな自動化ツール(特定のイベントが発生したら、指定された処理を自動で行ってくれるツール)を触ったことがあったのだが、それと同じように利用できそうな『Huggin』というツールを見かけた。 Yahoo!PipeやIFTTTのような利用ができるらしい。

今回は、この『Huggin』をUbuntu Server 16.04 LTSにインストールしてみる。 (Dockerもあるようなので、パッと試す場合はそちらでもいいだろう)

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

まずは、以下のコマンドでupdateを行っておこう。

su...

Apache GuacamoleでsshやRDP接続時の操作を記録する(テキストor動画)

以前にも触れたことのある、HTML5の踏み台サーバであるApache Guacamole。 ssh接続時のターミナル操作のログを記録することもできるため、今回はそれを行う。

取得できるログは2種類で、「Typescript(テキストベース)」および「Screen Recording(動画で取得)」のパターン。 当たり前ではあるのだが、テキストベースはsshやtelnetでしか取れない。

今回利用するGuacamoleのバージョンは0.9.9とする。 0.9.9の場合、テキストやビデオでの操作ログの取得は簡単で、Webの設定画面から行える。

Guacamoleでは、接続先ごとにログ...


会社で同僚と会話中、こういった話題になったので"そういや、どうやって取るんだろ"と思って調べてみた。 結果、専用のコマンドでどうにかするってのは厳しそうだったので、ipcalcおよびsipcalcを使って計算、取得させてみた。

ipcalc $(ip addr show en0 | awk '$1=="inet"{print $2}') | awk 'NR==5{print $2}'
sipcalc en0 | awk -F- '/Network address/||/Network mask \(bits\)/{print $2}' | xargs | sed 's/ /\//g'

Golangの標準ライブラリだと、プロセスIDは取得できるみたいなのだけど、どうもプロセス名は取ってこれないらしい。 で、なんかいい方法ないかなと調べてたところ、『go-ps』というライブラリを見つけた。 これなら、プロセス名も取ってこれそうだ。

以下、実際にいじってみた際のコード。FindProcessの使い方は、基本的にはos.FindProcessとあまり変わらないみたいだ。

package main

import (
    "fmt"
    "os"

    "github.com/mitchellh/go-ps"
)

func main() {
    pid...