ワイルドカード付きの sudo を使用して、ルート所有のディレクトリからファイルを削除する

ワイルドカード付きの sudo を使用して、ルート所有のディレクトリからファイルを削除する

保護されたフォルダ/var/log/nginx(ルートが所有し、他の誰も読み書きできないフォルダ)があるとします。sudo を使用しても、sudo rm -f /var/log/nginx/ab*「そのようなファイルまたはディレクトリはありません」というメッセージが表示されずにはいられません。これを行うには、実際にルート シェルをロードする必要がありますか、それとも他の方法がありますか?

答え1

原因

シェルは、アスタリスクなどの glob 文字 (ワイルドカード) を解釈して展開します。このコマンドの解釈は、sudoディレクトリの読み取り権限を持たない現在のシェル (コマンドの実行前) で行われます。現在のシェルは glob パターンに一致するファイルを見つけられないため、パス名の展開は実行されず、シェルはrm、、、-fおよび/var/log/nginx/ab*(リテラルのアスタリスク付き) をコマンドの引数として渡しますsudo

コマンドsudoは、パス(アスタリスクはUnixファイル名の有効な文字)rmのファイルを削除しようとするコマンドを起動します。そのようなファイルは実際には存在しないため、失敗を報告します。GNUでは、このエラーメッセージは明示的です。/var/log/nginx/ab*rm満杯以下のエラー メッセージは、削除される (単一の) ファイルが存在しないことを示しています。

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

解決

解決策は、ファイル名の拡張を実行するために必要な権限を持つスーパーユーザーとして新しいシェルを起動することです。

sudo bash -c "rm -f /var/log/nginx/ab*"

上記のコマンドは、ルートとして実行される新しいシェルを起動し、-cオプションを使用してシェルで実行されるコマンドを渡します。コマンドは引用符で囲まれているため、アスタリスクは現在のシェルによって解釈されず、そのまま新しいルート シェルに渡され、コマンドを起動する前にパス名を展開できますrm

答え2

ファイル名に問題があるか、ファイル名にスペースが含まれている可能性があります。

したがって、次の回避策を試してください。

  1. --オプションの終了を示すには、preceed を試してください。例:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. 使用find

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. Linux 上でファイルが保護されていると思われる場合は、まず保護を解除してみてください。

    chattr -i ab*
    

関連情報