2013-01-21 38 views
0

幾周前,一位高級團隊成員意外地刪除了一個重要的oracle數據庫文件(.dbf)。幸運的是,我們可以通過使用前幾天保存的備份文件來恢復系統。我想通過bash腳本獲得rm命令過濾器的提示

看到這種情況後,我決定實施一個解決方案,在提示符下鍵入rm命令時至少得到一個雙重確認。 (支票超過rm -i

即使我們將rm -i作爲默認值進行別名,超級快捷鍵盤手通常會出現類似該成員的錯誤,包括我在內。

首先,我用一個特定的bash腳本文件替換(通過使用別名)basic rm命令,如果目標與oracle數據庫路徑或文件相關,bash腳本文件會多次打印和確認。 簡而言之,腳本在運行rm之前作爲過濾器運行。如果它與oracle不相關,那麼rm將正常運行。

在實施過程中,我認爲大部分功能都運行良好,因爲我期望除了一個問題外,只有用戶提示環境。

如果在其他腳本(提供oracle,其他供應商修改oracle路徑,安裝程序等)或程序(通過使用系統調用)中調用rm命令。

  1. 我該如何區分這種情況? 如果上面提供的腳本符合修改後的rm,那麼執行不會繼續。

  2. 你有更復雜的方法嗎?

我相信大部分讀者可以理解我的懶惰解釋。 如果你無法從上面看到清晰的風景,請告訴我。我將詳細闡述。

回答

1

答案是進入alias手冊頁:

  Note aliases are not expanded by default in non-interactive 
      shell, and it can be enabled by setting the expand_aliases shell 
      option using shopt. 

自己和man alias檢查它;)

無論如何,我會做你所選擇

3

以同樣的方式,我們閱讀man bash

當shell是別名時,別名不會被展開除非 expand_aliases外殼選項使用shopt設置,否則不會交互。

這時如果使用alias使rm調用你的shell腳本,其他腳本默認不會使用它。如果這是你想要的,那麼你已經安全了。

問題是如果你想要你的rm版本被腳本調用,並在發生時做一些聰明的事情。別名對前者不夠;即使把你的rm放在$PATH的某個地方,對於明確調用/bin/rm的程序來說也是不夠的。而對於不是shell腳本的程序,unlink系統調用比使用system("rm ...")更有可能被使用。

我認爲,對於整個「安全rm」的東西是有用的,它應該避免提示,即使交互式調用。每個用戶都會養成對其說「是」的習慣,而且周圍沒有已知的方法。什麼可能工作是將文件移動到回收站而不是刪除,使損壞容易撤消(正如我似乎記得,已準備好使用此解決方案)。

0

區分情況:您可以創建一個env變量,如APPL,它將被設置爲export APPL="DATABASE。在您的自定義rm腳本中,僅在APPLDATABASE(表示與數據庫相關的腳本)時才執行雙重檢查,否則將不會調用rm調用來自其他腳本。

0

如果您使用的是bash,那麼您可以使用export您的shell函數,它也可以在腳本中使用它。

#!/usr/bin/env bash 

# Define a replacement for `rm` and export it. 
rm() { echo "PSYCH."; }; export -f rm 

殼牌功能優先於內建和外部的公用設施,所以只用rm甚至腳本將調用函數 - 除非他們明確地通過調用/bin/rm ...command rm ...繞過功能。

將上述(與你的實際執行的rm())無論是在每個用戶的~/.bashrc文件,或者在系統範圍內的bash輪廓 - 遺憾的是,它的位置是不規範的(例如:Ubuntu的:/etc/bash.bashrc; Fedora的/etc/bashrc