ウェブサイト検索

Linux のパワー Bash シェルの「履歴コマンド」


コマンドの履歴を確認したり、ユーザーが実行したコマンドに関する情報を取得したりするために、日常業務で history コマンドを頻繁に使用します。この記事では、history コマンドを効果的に使用して、Bash シェルでユーザーが実行したコマンドを抽出する方法を見ていきます。これは、監査の目的や、 どの日付時刻にどのコマンドが実行されたかを調べるのに役立つ場合があります。

デフォルトでは、履歴コマンドの実行中に日付タイムスタンプは表示されません。ただし、bash シェルには、ユーザーのコマンド履歴を編集するためのCLI ツールが用意されています。便利なヒントとテクニック、そしてhistory コマンドの機能を見てみましょう。

1. Linuxで最後に実行された/すべてのコマンドをリストする

ターミナルから簡単なhistory コマンドを実行すると、最後に実行されたコマンドの完全なリストが行番号とともに表示されます。

[narad@tecmint ~]$ history

    1  PS1='\e[1;35m[\u@\h \w]$ \e[m '
    2  PS1="\e[0;32m[\u@\h \W]$ \e[m "
    3  PS1="\u@\h:\w [\j]$ "
    4  ping google.com
    5  echo $PS1
    6   tail -f /var/log/messages
    7  tail -f /var/log/messages
    8  exit
    9  clear
   10  history
   11  clear
   12  history

2. すべてのコマンドを日付とタイムスタンプとともにリストします。

コマンドに対して日付 タイムスタンプ を確認するにはどうすればよいですか?変数を指定した 「export」 コマンドを使用すると、コマンドの履歴が、コマンドが実行されたときの対応するタイムスタンプとともに表示されます。

[narad@tecmint ~]$ export HISTTIMEFORMAT='%F %T  '

      1  2013-06-09 10:40:12   cat /etc/issue
      2  2013-06-09 10:40:12   clear
      3  2013-06-09 10:40:12   find /etc -name *.conf
      4  2013-06-09 10:40:12   clear
      5  2013-06-09 10:40:12   history
      6  2013-06-09 10:40:12   PS1='\e[1;35m[\u@\h \w]$ \e[m '
      7  2013-06-09 10:40:12   PS1="\e[0;32m[\u@\h \W]$ \e[m "
      8  2013-06-09 10:40:12   PS1="\u@\h:\w [\j]$ "
      9  2013-06-09 10:40:12   ping google.com
     10  2013-06-09 10:40:12   echo $PS1
HISTTIMEFORMAT 変数の意味
%F Equivalent to %Y - %m - %d
%T Replaced by the time ( %H : %M : %S )

3. 履歴内のコマンドをフィルタリングする

上記の出力では、同じコマンドが何度も繰り返されていることがわかります。履歴内の単純なコマンドまたは非破壊的なコマンドをフィルタリングする方法は? HISTIGNORE=’ls -l:pwd:date:’ でコマンドを指定して、次の ‘export’ コマンドを使用します。このコマンドはシステムによって保存されず、履歴コマンドに表示されません。

[narad@tecmint ~]$ export HISTIGNORE='ls -l:pwd:date:'

4. 履歴内の重複したコマンドを無視する

以下のコマンドを使用すると、ユーザーが行った重複したコマンド入力を無視することができます。ユーザーが Bash プロンプトで同じコマンドを複数回実行した場合、履歴には 1 つのエントリのみが表示されます。

[narad@tecmint ~]$ export HISTCONTROL=ignoredups

5. エクスポートコマンドの設定を解除する

その場でエクスポート コマンドの設定を解除します。 export コマンドでエクスポートしたコマンドを変数に指定して、unset export コマンドを 1 つずつ実行します。

[narad@tecmint ~]$ unset export HISTCONTROL

6. エクスポート コマンドを永久に保存する

.bash_profile に次のようなエントリを作成して、export コマンドを永続的に保存します。

[narad@tecmint ~]$ vi .bash_profile

.bash_profile

Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

User specific environment and startup programs

export HISTCONTROL=ignoredups

PATH=$PATH:$HOME/bin
export PATH

7. 特定のユーザーが実行したコマンドを一覧表示する

特定のユーザーが実行したコマンド履歴を確認する方法。 Bash は、履歴の記録を 「~/.bash_history」 ファイルに保存します。ファイルを表示または開いてコマンド履歴を確認できます。

[narad@tecmint ~]$ vi .bash_history

cd /tmp/
cd logstalgia-1.0.3/
./configure
sudo passwd root
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
./configure
make
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc++
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
apt-get install make
mysql -u root -p
apt-get install grsync
apt-get install unison
unison

8. コマンド履歴の保存を無効にする

組織によっては、組織のセキュリティ ポリシーにより、コマンドの履歴が保存されない場合があります。この場合、ユーザーの .bash_profile ファイル (隠しファイルです) を編集し、次のようにエントリを作成します。

[narad@tecmint ~]$ vi .bash_profile

.bash_profile

Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

User specific environment and startup programs

PATH=$PATH:$HOME/bin
HISTSIZE=0
export PATH
.bash_profile (END)

ファイルを保存し、以下のコマンドで変更をロードします。

[narad@tecmint ~]$ source .bash_profile

注: 入力したコマンドをシステムに記憶させたくない場合は、以下のコマンドを実行するだけで、その場で履歴の記録が無効化または停止されます。

[narad@tecmint ~]$ export HISTSIZE=0

ヒント:HISTSIZE」を検索し、スーパーユーザーで「/etc/profile」 ファイルを編集します。ファイルの変更はグローバルに影響します。

9. コマンドの履歴を削除または消去する

矢印を使用すると、役立つかもしれない、またはイライラするかもしれない、以前に使用したコマンドが表示されます。 「-c」オプションを使用して、bash 履歴リストからすべてのエントリを削除またはクリアします。

[narad@tecmint ~]$ history -c

10. Grep コマンドを使用して履歴内のコマンドを検索する

以下のように履歴ファイルを「grep」にパイプして「.bash_history」を通じてコマンドを検索します。たとえば、以下のコマンドは履歴リストから「pwd」コマンドを検索して見つけます。

[narad@tecmint ~]$ history | grep pwd

  113  2013-06-09 10:40:12     pwd
  141  2013-06-09 10:40:12     pwd
  198  2013-06-09 15:46:23     history | grep pwd
  202  2013-06-09 15:47:39     history | grep pwd

11.最後に実行されたコマンドの検索

「Ctrl+r」 コマンドを使用して、以前に実行したコマンドを検索します。探しているコマンドが見つかったら、「Enter」を押して同じコマンドを実行するか、「esc」を押してキャンセルします。

(reverse-i-search)`source ': source .bash_profile

12. 最後に実行したコマンドを呼び出す

以前に使用した特定のコマンドを呼び出します。 Bang8 (!8) コマンドを組み合わせると、実行した番号 8 コマンドが呼び出されます。

[narad@tecmint ~]$ !8

13. 最後に実行した特定のコマンドを呼び出す

以前に使用したコマンド (netstat -np | grep 22) を思い出してください。「!」 の後にその特定のコマンドの文字が続きます。

[narad@tecmint ~]$ !net
netstat -np | grep 22
(No info could be read for "-p": geteuid()=501 but you should be root.)
tcp        0     68 192.168.50.2:22             192.168.50.1:1857           ESTABLISHED -
tcp        0      0 192.168.50.2:22             192.168.50.1:2516           ESTABLISHED -
unix  2      [ ]         DGRAM                    12284  -                   @/org/freedesktop/hal/udev_event
unix  3      [ ]         STREAM     CONNECTED     14522  -
unix  2      [ ]         DGRAM                    13622  -
unix  3      [ ]         STREAM     CONNECTED     12250  -                   @/var/run/hald/dbus-ujAjOMNa0g
unix  3      [ ]         STREAM     CONNECTED     12249  -
unix  3      [ ]         STREAM     CONNECTED     12228  -                   /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     12227  -

履歴コマンドの威力を強調してきました。しかし、これで終わりではありません。以下のコメント ボックスを通じて、history コマンドの経験を共有してください。