私が達成したいのは、ヤクアケ/コンソーレを使用するときはいつでも、ターミナルセッションを自動的にファイルに記録できることです。
セッションの開始時に次のようにすると、簡単に達成できます。
script -f /home/$USER/bin/Shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log
しかし、ヤクアケを起動するか、新しいタブを開くたびに、上記を自動的に実行したいと思います。
.bashrcを使用すると、「スクリプト」が新しいセッションを開いて.bashrcを読み取り、別の「スクリプト」を開始するなどして無限ループが発生するため、機能しません。
新しいタブが開かれたときに一度「スクリプト」を実行するために、どういうわけかヤクアケ/コンソーレをスクリプト化する必要があるでしょう。問題はどのようにですか?
誰かがscript
ユーティリティを使用して、SSHセッション(!)を含むターミナルセッションを自動的に記録したい場合は、次のようにします。
ホームディレクトリの.bashrc
の最後に次の行を追加します。または、すべてのユーザーのセッションのみを記録する場合は/etc/bash.bashrc
を追加します。 Shellの親プロセスがscript
でないことをテストしてから、script
を実行します。
Linuxの場合:
test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log)
BSDおよびmacOSの場合、script -f
をscript -F
に変更します。
test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log)
それで全部です!
新しいターミナルを開くと、次のように表示されます。
Script started, file is /home/username/file_name.log
script
は、ホームディレクトリのファイルにセッションを書き込み、結果として30-Nov-11_00-11-12_Shell.log
のような名前を付けます。
より多くのカスタマイズ:
script -a /path/to/single_log_file
を使用して、セッションごとに新しいファイルを作成するのではなく、1つの大きなファイルにセッションを追加できます。script -f
(Linux)またはscript -F
(BSDおよびmacOS)の後のパスを変更することにより、ファイルの書き込み先を調整できますこの回答は、もちろんscript
がインストールされていることを前提としています。 Debianベースのディストリビューションでは、script
はbsdutils
パッケージの一部です。
この質問は、自分のセッションを記録したい個人から寄せられたものですが、別のユースケースは、さまざまなユーザーが何をしているかを追跡したいシステム管理者かもしれません。
システム全体の
script
内でbashrc
を実行することは、マシンのユーザーがセッションの記録を作成することに消極的である場合には適さないかもしれません。シークレットモードのままにしたいユーザーは、sshdに別のシェル(
zsh
など)を開くように要求するか、bash --rcfile ___
を実行して/etc/bash.bashrc
が読み込まれないようにして、ログをバイパスできます。
2008年のこのガイド ( アーカイブ済み )は、異なるメソッドを使用して、script
を強制的に実行しますユーザーがsshを使用してログインする場合、ユーザーは公開鍵/秘密鍵を使用してログインする必要があります。
これは、キーの前にあるユーザーの.ssh/authorized_keys
ファイルにスクリプトを追加することによって行われます。
command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....
log-session
( archived )スクリプトは、/usr/bin/script
を実行してこのユーザーのセッションをログに記録するかどうかを決定します。
exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE
ユーザーが追加されたコマンドを削除できないようにするには、管理者がユーザーのauthorized_keys
ファイルの所有権を引き受ける必要があります。
chown root:root ~user/.ssh/authorized_keys
残念ながら、これはユーザーが自分で追加のキーを追加することができないことを意味します。または、さらに重要なことに、侵害された場合に既存のキーを取り消すことは理想的ではありません。
Sshdのデフォルト設定では、ユーザーがsshログインを介してSFTPを実行できるようにするのが一般的です。これにより、ユーザーは変更をログに記録せずにファイルを編集できます。管理者がユーザーにそれを許可しない場合は、SFTPのログを有効にするか、サービスを無効にする必要があります。それでも、ユーザーはターミナルで次のようなものを実行することにより、ファイルに目に見えない変更を加えることができます。
curl "http://users.own.server/server/new_data" > existing_file
すべてのファイル履歴を記録するコピーオンライトファイルシステムを使用することで、そのような変更を監視できる場合があります。
しかし、同様のトリックにより、ユーザーはログに記録されることなくコマンドを実行できます。
curl "http://users.own.server/server/secret_commands_824" | sh
簡単な解決策は知りません。次の可能性があります。
このようなことは auditd で可能になるかもしれません。
とにかく...
ユーザーセッションをログに記録しても、管理者に実際のセキュリティが提供されることはほとんどありません。デフォルトでは、ユーザーは自分のファイルのみを操作でき、システムに害を与えることはできません。悪意のあるユーザーが特権をエスカレートできた場合、ログを無効にしてログを削除できます(管理者がログを別のマシンに保存するように構成している場合を除きます)。
ユーザーセッションを自動的にログに記録する管理者は、おそらくこれが行われていることをユーザーに通知する必要があります。管轄区域によっては、この形式のデータ収集はデータまたはプライバシー法に違反する可能性があります。そして、少なくとも、ユーザーに気づかせるのは敬意を払うことです。
管理者が
Sudo
ユーザーのセッションをログに記録することに関心を持つ可能性が高くなります。それはおそらく別の答え、または実際に別の質問で取り組むことができます。
の代わりに:
test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||
私は使うだろう:
grep -qx "$PPID" <(pgrep -x "script") ||
この場合、二重引用符は必要ありませんが、とにかく標準的な方法として使用する傾向があります。まれですが問題のある部分文字列との一致を避けるために、grepとpgrepの両方に「x」スイッチを使用することをお勧めします。