sudo を使用してフォルダーを削除する場合と root としてフォルダーを削除する場合の違い

sudo を使用してフォルダーを削除する場合と root としてフォルダーを削除する場合の違い

今日、sudo を使用してコマンドを実行する場合と root としてコマンドを実行する場合の興味深い違いに気付きました。

sudoを使用するとrm -rf /opt/nextcloud/*フォルダは削除されません

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

最初にルートになってコマンドを実行すると、フォルダが削除されます

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

これはなぜでしょうか? sudo を使用してフォルダーを削除する正しい方法は何ですか?

答え1

コマンドは、sudo rm -rf /opt/nextcloud/*通常のユーザーとして実行されているシェルによって解釈されます。シェルは実行*前に展開を試みますsudo。何らかの理由で*展開できない場合、コマンドは次のようになります。

  • (そして)はリテラルと文字通り同じになりsudo rm -rf /opt/nextcloud/*、それ以上の展開は行われません。これは POSIX の動作であり、明らかに存在しません。sudorm/opt/nextcloud/**/opt/nextcloud/*
  • または、sudo rm -rf状況によっては (たとえば、Bash でnullglobオプションが設定されている場合)、

他にも可能性はあります (例: failglobBash での比較) が、あなたのケースには当てはまらないようです。

いずれにせよ、-fオプションがrm重要になります。それは

-f
確認のプロンプトを表示しません。ファイルオペランドがない場合、またはオペランドが存在しない場合には、診断メッセージを書き込んだり、終了ステータスを変更したりしません。[…]

ソース

実際には、「存在しないオペランド」または「ファイルオペランドなし」を指定したため、コマンドは何も実行されず、何もせずに成功しました。


/opt/nextcloud/*私の仮説は、一般ユーザーに の読み取り権限がないため、非昇格シェルが展開できなかったということです/opt/nextcloud/。別の可能性としては、 でタイプミスをしたが、エラー メッセージがなかったためにこれに気付かなかったということがあります。これが動作の/opt/nextcloud/*仕組みであるため、エラー メッセージは表示されませんでした。rm -f

sudo ls /opt/nextcloud/シェルによる拡張は行われません。コマンドはlsroot として実行されます。コマンドls自体は指定されたディレクトリとその内容にアクセスできるため、正常に動作しました。

sudo su -シェルを root として実行した後、このシェルは拡張できた/opt/nextcloud/*ため、rm -rf /opt/nextcloud/*期待どおりに動作しました。

関連情報