Linux環境において、あるユーザーが入力したコマンド履歴を取得するには、以下のように~/.bash_historyファイルを参照するといいです。
[root@ip-192-xxx ~]# cat ~ec2-user/.bash_history
sudo su -
ls -ld /bin
ls -l /
しかし、この情報は入力済みのコマンド履歴の参照となります。
現在、起動しているシェル上で入力されているコマンドをリアルタイムに監視したいという場合、straceコマンドを利用し、以下のように確認することができます。
まずは、監視対象となるシェルのプロセスを確認します。
例えば、sshで接続しているあるユーザーが入力しているコマンドを確認するという場合、whoコマンドで、端末名を確認します。
[root@ip-192-xxx ~]# who
ec2-user pts/0 2024-07-30 23:52 (153.242.xxx.xxx)
ec2-user pts/1 2024-07-31 00:21 (153.242.xxx.xxx)
ec2-user pts/2 2024-07-31 07:15 (192.0.xxx.xxx)
ユーザー名やログインした日時、接続元のIPアドレスにより、監視対象のユーザー端末を確認します。
今回は、pts/2端末のユーザーが入力したコマンド情報を監視します。
以下のコマンドを実行し、シェルのPIDを確認します。
[root@ip-192-xxx ~]# ps -ef | grep 'pts/2'
ec2-user 312776 312773 0 07:14 ? 00:00:00 sshd: ec2-user@pts/2
ec2-user 312777 312776 0 07:14 pts/2 00:00:00 -bash
root 313161 295368 0 07:23 pts/1 00:00:00 grep --color=auto pts/2
端末名が表示されているシェル(今回の場合bash)のPIDを確認します。
ps -efコマンド実行時、2列目の値がPIDになるため、今回は312777というのが監視対象のPIDとなります。
そして、以下のようなstraceコマンドを実行します。
[root@ip-192-xxx ~]# strace -p 313673 -e trace=write
strace: Process 313673 attached
write(2, "l", 1) = 1
write(2, "s", 1) = 1
write(2, "\n", 1) = 1
write(2, "\33[?2004l\r", 9) = 9
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=313702, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
行末に「= 1」という記述がある部分が監視対象となっている端末でキー入力された内容です。
入力されたキー1つにつき、1行結果が表示されます。
上記はlsコマンドを引数なしで実行したという例です。
"\n"は改行情報ですので、enterキーが押されているということがわかります。
この方法でのコマンド情報の監視、取得は、もちろん対象となるユーザーの承諾を得るなど、合法的な状態で行うようにしましょう。