chmod、chown の確認プロンプト

chmod、chown の確認プロンプト

chmodやなどのいくつかの Linux コマンドに確認プロンプトを追加しようとしていますchown

この件についてグーグルで検索してみましたが、このトピックに関する情報はあまり見つかりません。

rm検索中に、オプションを使用する解決策があることを発見しました-iが、これは上書きすることができます-f

ただし、特定の重要なディレクトリをブラックリストに登録するパッケージをサーバーにインストールすることができ、これは非常に優れたソリューションですが、残念ながら、およびsafe-rmには同様のパッケージがありません。chmodchown

chmodしたがって、私の理想的な解決策は、chown確認プロンプトを表示し、特定のディレクトリが chmod および chown からブラックリストに登録されるようにすることです。

どのような回答でも大歓迎です!!!

答え1

コマンドチョーン (1)そしてchmod (1)ネイティブでは、sunch オプションがありません。その機能を追加する場合は、次のいずれかを実行します。

  1. ソースを変更して再コンパイルする必要があります。
  2. またはラッパーを作成します。

最初のオプションが最も明確です。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.*

関連情報