
今日、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 の動作であり、明らかに存在しません。sudo
rm
/opt/nextcloud/*
*
/opt/nextcloud/*
- または、
sudo rm -rf
状況によっては (たとえば、Bash でnullglob
オプションが設定されている場合)、
他にも可能性はあります (例: failglob
Bash での比較) が、あなたのケースには当てはまらないようです。
いずれにせよ、-f
オプションがrm
重要になります。それは
-f
確認のプロンプトを表示しません。ファイルオペランドがない場合、またはオペランドが存在しない場合には、診断メッセージを書き込んだり、終了ステータスを変更したりしません。[…]
(ソース)
実際には、「存在しないオペランド」または「ファイルオペランドなし」を指定したため、コマンドは何も実行されず、何もせずに成功しました。
/opt/nextcloud/*
私の仮説は、一般ユーザーに の読み取り権限がないため、非昇格シェルが展開できなかったということです/opt/nextcloud/
。別の可能性としては、 でタイプミスをしたが、エラー メッセージがなかったためにこれに気付かなかったということがあります。これが動作の/opt/nextcloud/*
仕組みであるため、エラー メッセージは表示されませんでした。rm -f
sudo ls /opt/nextcloud/
シェルによる拡張は行われません。コマンドはls
root として実行されます。コマンドls
自体は指定されたディレクトリとその内容にアクセスできるため、正常に動作しました。
sudo su -
シェルを root として実行した後、このシェルは拡張できた/opt/nextcloud/*
ため、rm -rf /opt/nextcloud/*
期待どおりに動作しました。