B級システムエンジニアの備忘録

インフラ・プログラミングなんでもやるぞ雑用エンジニアブログ

CentOS Linux システム・技術情報

Linux Historyコマンド 日時表示とアクセスIP表示と記録件数の変更をやってみた

更新日:

サーバーの設定をしていると何をしたか忘れたり、

さっき打ったコマンドなんだっけみたいなよくなるのは私だけでしょうか?

てっとり早くCtrl+Rでコマンド検索もいいですが、前後の流れを見返したいときもありますよね??

そんなときのことを以下にメモ

linuxのhistoryコマンドはコマンドの実行履歴を記録しています。
ただ、デフォルトの設定のままだと実行時間がわからないので、
日時と照らし合わせることが難しいです。
そこで日付を履歴に振って記録していきます。
※注意点としては表示するようにしたタイミングで遡って日時がつけられるで、
過去は現在の時間で埋まります。

まず、historyコマンドの扱い方について

コマンドレファレンス

history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
-h ヘルプ
-c コマンド実行履歴を削除
-d 履歴番号(offset)を削除する ※前後がある場合は番号が切り詰められる
-a セッション開始されてからのコマンドを履歴ファイルに追加する
-n historyの履歴ファイルから読み出されていない行を追加表示する
-r 指定履歴ファイルを読み出し表示を切り替える(別の場所に履歴ファイルを保管している場合そちらに置き換える)
-w 指定履歴ファイルに現在読み込んでいる履歴内容で上書きする
-p 指定文字列を表示。変数の場合は変数の内容を表示。また、履歴に記録が残りません。
-s 指定された文字列を追加
コマンドサンプル(わかりづらいオプション)
$ history -ps $PATH #変数の中身を表示して文字列として追加
.....
88 2017-07-28T01:48:29+0900 history
89 2017-07-28T01:48:45+0900 /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hoge/.local/bin:/home/hoge/bin
.....

history -s start_history
.....
94 2017-07-28T01:53:32+0900 start_history
.....

bashのバージョン確認

まず前提条件としてbashのバージョンが3以上じゃないとだめらしいがCentOS5でも3がデフォルトではいっていたので、
問題ないかと。

$ bash -version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

問題がなければ早速シェル変数へ[HISTTIMEFORMAT][HISTSIZE]をセットする。

[HISTTIMEFORMAT][HISTSIZE]をセット

一時的に時間表示と記録件数変更をしたい場合 ※再起動したりすと変数がリセットされます。

export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S'
export HISTSIZE=10000

ユーザー単体に対して時間表示と記録件数変更

$ vim ~/.bashrc
#時間表示
HISTTIMEFORMAT='%y/%m/%d %H:%M:%S'
#1万件記録
HISTSIZE=10000
source ~/.bashrc

全体にユーザーに対して時間表示と記録件数の変更を行いたいとき ※推奨しません。

# vim /etc/profile
#時間表示
HISTTIMEFORMAT='%y/%m/%d %H:%M:%S'
#1万件記録
HISTSIZE=10000
source /etc/profile

大変申し訳ございません。
以下内容については正常に機能しないことがわかりましたので、削除致します。
読者のみなさま本当にごめんさない。
正常に機能しない理由はhistoryコマンドはそもそもHISTTIMEFORMATで日付のみ受け入れるかたちで、ログイン時にIPはすべて書き換わります。
※保存はされないということです。
プロセス毎のメモリーで保管する為、cron等を使用して試してみましたが、
無理でした。
違う記事でセキュリティアップを書くつもりです。

HISTORYにSSHログインIP(HOST名)を表示させてセキュリティアップ!
大規模開発をするようになってくるとアクセス元のIPとコマンドを紐付たくなることありませんか??
そんなときは以下のようにすれば追加でIPも表示してくれます。
通常だと/var/log/secureから該当時刻のSSH接続者のIPとコマンドを照合したりするとおもいますが、
てっとり早く管理したいので、以下のようにすると便利!

# vim /etc/profile
#HISTORY SETTINGS
#who -m でログイン中の情報(HOST名)を表示して、その中のHOST名のみ抜出
SSH_ADDR=who -m | awk '{print $6}' | tr -d "(" | tr -d ")"
HISTTIMEFORMAT=${SSH_ADDR}' %y/%m/%d %H:%M:%S'
HISTSIZE=10000
.....HOST名(名前解決)を追加する
293 127.0.0.1.example.jp 17/08/03 00:56:19vim /etc/profile
294 127.0.0.1.example.jp 17/08/03 00:57:21source /etc/profile
295 127.0.0.1.example.jp 17/08/03 00:57:23history
......

※難点としては名前解決をを停止できないのでホスト名に変換してしまいます。
あとコマンドがなんか微妙なので、より良いコマンドに置き換えていただければと思います。(我ながらださいコマンド。。。)
というかHOST名に変換せずにIPが取得できるような出し方知っているかたおられたらコメント覧でご指摘いただけると幸いですm(__)m

以下よりその他historyについての予備知識です。

historyの履歴保管場所

~/.bash_history
#1500137208等と入っているところがUNIXタイムです。

そのほかシェル変数について

HISTIGNORE=ls:pwd:history ※複数ある場合は:で区切る wildcard使用可能
HISTFILE=ファイルパス ※.bash_history以外のファイルで書き出す場合の指定
HISTCONTROL={erasedups or ignorespace or ignoredups}
erasedups 履歴に存在する重複コマンドを全削除する
ignorespace 空白から始まるコマンドを記録しない
ignoredups 重複カット(連続での同じコマンドを記録しない)

2017/11/09追記

IPを表示する際のwho -m コマンドですが、
CentOS6とCentOS7で個数が違います。
CentOS7では$6ですが、CentOS6では$5になります。
以下が違いです。
環境設定依存であればすみません。。。

 

 

336

336

-CentOS, Linux, システム・技術情報
-,

Copyright© B級システムエンジニアの備忘録 , 2021 All Rights Reserved.