それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェル(bash)の履歴を指定業だけど消す(間違えてパスワードを履歴に残した)

パスワードを打ち込んでエンターしてしてしまった。

パスワードなど、履歴を残したくない文字列を履歴に残してしまった場合。

たまに、やらかしますよね。複数ウインドウでフォーカスが違ってたとか。

takuya@:~$ 'MyP@$$word'
-bash: MyP@$$word: コマンドが見つかりません

ログアウトすると、パスワードが履歴に残ってしまいます。

takuya@:~$ history
 1844  history -d 1840
 1845  ll -al | grep hist
 1846  history 
 1847  'MyP@$$word'
 1848  history 

指定した行だけ消せます。

history -d 1847
history -w 

パスワードなど記録に残したくないコマンドの履歴を削除(?)して、historyファイル を更新しています。

その他の方法

history -r 
rm .bash_history
vim .bash_history

もちろん、 vim .bash_histrory をしてもいいのですが、vim を使ったことがバレてしまう!!

たいていは削除をしたがると思うのですが、履歴はその場でファイルに書き込まれているとは限りません。

history -r で保存するより先に、履歴をファイルから読み直すとかもありです。

履歴の考え方。

bash の設定にもよりますが、ヒストリは、環境変数と書き込みタイミングが設定次第で変えられます。

基本的にはログアウトした瞬間に書き込まれます。

shopt の histappend を設定していると、削除して保存は無く追記になります。

$HISTSIZE に指定した件数分が起動中にbash に保存されます。

$HISTFILESIZEに指定した件数分が ファイル保存されます。

$HISTFILE に指定したファイルに書き込まれます。

ファイルに書き込んだ履歴を呼び出すには history -r です。

この辺をうまく組み合わせると、保存せずにログアウトもできます。

保存先を /dev/null とかメモリにするとか。HISTSIZEをゼロにするとか。ですかね

ファイルを空っぽにするコマンド truncate

ファイルを空っぽにしたい

exim4 にパニックログが残ってると、エラー監視ログが上がってくるんですね。ログファイルを空にしたい。

exim paniclog /var/log/exim4/paniclog on acid has non-zero size, mail system might be broken. The last 10 lines are quoted below.

2019-11-21 22:53:06 socket bind() to port 25 for address 172.17.0.1 failed: Cannot assign requested address: daemon abandoned

truncate ファイルを空にするコマンド

truncate でファイルを空にする事ができます。

truncate -s 0 /var/log/file

空にする必要があるの?

あります。

ファイルの監視の問題とopenしている場合

削除であれば、ファイルをWatchしている各種サーバー類やファイルの移動をすると面倒くさいことがある。open していると取り合いにある。truncate は成功する可能性がある。

パーミッションの問題。

なにより rm して touch すると umask の設定によってはオーナやパーミッションが変わってしまうことがあります。面倒くさい。

ログファイルの空に

今回の exim4 のログファイルのように、「定期的にファイルを空にする」と解決する場合に活躍します。

ファイルを削除して作成してパーミッションを合わせるより、既存のファイルを空っぽにするほうがずっと楽だ。

truncate を crontab にサクッと書いて終わりです。

そもそもなぜexim4がlogrotate しないのかは謎だけど、調べるのも面倒くさい話です。

実例

takuya@:exim4$ cat  /var/log/exim4/paniclog
2019-11-21 22:53:06 socket bind() to port 25 for address 172.17.0.1 failed: Cannot assign requested address: daemon abandoned


takuya@:exim4$ sudo truncate  -s 0 /var/log/exim4/paniclog

takuya@:exim4$ cat  /var/log/exim4/paniclog

そもそもtruncate コマンドは?

ファイルを指定サイズに切り詰めます。

truncate のその他の使い方。指定サイズのファイルを作る。

一緒に覚えておくと便利です。

指定したサイズより、ファイルが小さいなら、指定サイズになるまで0埋めされる。

ファイルのサイズを指定したら0埋めしたダミーファイルをサクッと作れます。

たとえば1GBのファイルを作るのであれば truncate の 引数に 1GB を指定すれば良いわけです。

takuya@:~$ truncate -s $(( 1024*1024*1024 )) sample

takuya@:~$ ll sample
-rw-rw-r-- 1 takuya takuya 1.0G 2020-01-15 01:06 sample

参考資料

  • man truncate

dd のコピー進捗状況を表示する- progress

dd コマンドで進行状況を確認したい

dd といえば、USRシグナルを送れば進捗状況が見えるのですが。

kill -USR1 $pid; sleep 1; kill $pid

これは起動中にddコマンドに対してpidへシグナルを送ることで表示されるのですが。説明するのは大変ですよね。

かんたんにコマンドの引数で進捗表示する

どれくらい進んでいるか閲覧できるようにする。 status=progressをつける

dd if=/dev/zero of=out.img bs=1024 count=$((1024*512)) status=progress

rsync みたいに転送状況を知りたいときはこれを使うと便利。

ddするときは、忘れずにつけておきたい。

実例

次のような感じに、コピーの書き込み速度や、何バイトをddできたかを見ることができます。

takuya@NO NAME$ dd if=/dev/zero of=out.img bs=1024 count=$((1024*512)) status=progress
260588544 bytes (261 MB, 249 MiB) copied, 9 s, 28.7 MB/s

進捗見るならdd rescue が

dd の変わりに dd_rescue を使うと良いのは周知の事実ですが。dd のほうがbs count の細かい数字が指定しやすくていいですよね。

進捗を見る方法まとめ

dd コマンドで状況を確認するには、次の方法があります。

  • kill USR1 シグナル
  • ddrescue
  • dd status=progress