
chmod
やなどのいくつかの Linux コマンドに確認プロンプトを追加しようとしていますchown
。
この件についてグーグルで検索してみましたが、このトピックに関する情報はあまり見つかりません。
rm
検索中に、オプションを使用する解決策があることを発見しました-i
が、これは上書きすることができます-f
ただし、特定の重要なディレクトリをブラックリストに登録するパッケージをサーバーにインストールすることができ、これは非常に優れたソリューションですが、残念ながら、およびsafe-rm
には同様のパッケージがありません。chmod
chown
chmod
したがって、私の理想的な解決策は、chown
確認プロンプトを表示し、特定のディレクトリが chmod および chown からブラックリストに登録されるようにすることです。
どのような回答でも大歓迎です!!!
答え1
コマンドチョーン (1)そしてchmod (1)ネイティブでは、sunch オプションがありません。その機能を追加する場合は、次のいずれかを実行します。
- ソースを変更して再コンパイルする必要があります。
- またはラッパーを作成します。
最初のオプションが最も明確です。2 番目のオプションの方が簡単です。これを書くのに困った場合は、新しい質問が必要になります。これはおそらく [SO] により適していますが、簡単に言うと次のようになります。
1) chmodを別の場所に移動します。例:mv /bin/chmod /bin/chmold.therealthing
2) 必要な処理を実行する (実際の chmod を呼び出す) chmod という実行可能スクリプトを作成します。
シェル スクリプトを使わない人 (つまり私) による、テストされていないもの
#!/usr/bin/env bash
echo "/bin/chmod (Shell script) called with these arguments:"
echo $@
read -p "Are you sure you want to do this? (y/n) " RESPONSE
if [ "$RESPONSE" = "y" ]; then
exec /bin/chmod.therealthing $@
else
echo "OK, aborting."
fi
より細かい制御が必要な場合は、スクリプトは急速に複雑になります。それでも、入力を解析し、すべてのファイルに対して chmod を実行したい場合があります (有効な構文を確認した後)。
答え2
bash での解決策としては、シェル関数とエイリアスを使用することです。特定のユーザーのみに使用したい場合は、/etc/bashrc または ~/.bashrc にそれらを配置できます。以下は、質問のようなことを実行するのに使用できる関数とエイリアスの定義です。
DANGERLIST=/etc/dangerous.paths
_dangerouspath() {
file=$(readlink -e "$1")
[ -z "${file}" ] && return 1
while read pattern
do
[[ "${file}" =~ ^${pattern}$ ]] && return 0
done < ${DANGERLIST}
return 1
}
_checkpaths() {
shift
while [ -n "$1" ]
do
[[ "X$1" =~ ^X[^-].* ]] && _dangerouspath $1 && return 0
shift
done
return 1
}
_saferun() {
p="$1"
shift
if _checkpaths $*
then
read -p "Are you sure you want to do this? (y/n) " r && [ "$r" = "y" ] && $p $*
else
$p $*
fi
}
alias chown="_saferun /bin/chown"
alias chgrp="_saferun /bin/chgrp"
alias chmod="_saferun /bin/chmod"
保護したいパスのリストを「$DANGERLIST」(/etc/dangerous.paths)に作成する必要があります。これは次のようなものになります。
/
/home
/etc.*
/usr/bin.*
/bin.*