Команда «sudo rm \\» зависает – хотите, чтобы система не наносила ущерба системе

Я пытаюсь выяснить, что произошло. Около часа назад я редактировал файл в / root с помощью sudo, но когда я пошел, чтобы сохранить и выйти, я случайно ударил ключ обратной косой черты и попал в файл в моем собственном домашнем каталоге под названием «\», принадлежащем root, с разрешениями 640. Зная, что я не могу удалить файл, используя имя, которое оно было дано, я попытался избавиться от него обратно, избегая обратной косой черты с помощью другой обратной косой черты sudo rm \\ , однако это, казалось, заставило систему висеть, в этот момент я впал в панику и сначала попытался Control-C (что, конечно, не сработало), а затем Control-Z, который (после удара комбинации пару раз) вернул мое приглашение.

Убедившись, что я был в своем домашнем каталоге, когда я выпустил оригинальную команду, я решил искать процесс и, конечно же, он все еще присутствовал в списке, просто остановился. Мне пришлось выпустить kill -9 , чтобы, наконец, избавиться от него, но я просто хочу убедиться, что он не собирается нигде в системе удалять файлы. Я не могу придумать другую причину, по которой команда повела бы.

Я предполагаю, что пользователь попытался выполнить sudo rm \ .


Набрав любую команду, тогда \ и Enter ничего не сделают.

Это ничего не сделало бы, потому что вы просто избежали новой строки. Вероятно, у вас появилось новое приглашение, похожее на > , верно? Это вторичное приглашение ( $PS2 ), и оболочка использует его, когда ему требуется больше данных для завершения текущей команды.

Вы получите его, если случайно (или по назначению) не закроете цитату, как в

 $ echo 'hello > 

Продолжая оттуда:

 $ echo 'hello > world' hello world 

Набрав \ в конце строки, вы вводите строку продолжения:

 $ ls -l \ > 

Оттуда мы можем продолжить предыдущую строку:

 $ ls -l \ > /usr \ > /bin 

Когда вы позже нажмете Enter, новые строки преобразуются в пробелы и выполняют команду (как если бы вы набрали ls -l /usr /bin в этом случае).

Итак, в заключение: вы ввели

 $ sudo rm \ 

Затем вы нажали на возврат. Это означает, что команда еще не была выполнена оболочкой, потому что она все еще ждет вас, чтобы завершить команду. На этом этапе просто нажмите Ctrl + C, чтобы отменить команду.

Следующий вопрос: Как удалить файл с именем \ ? (принадлежит root)

Как это:

 $ sudo rm \\ 

или вот так:

 $ sudo rm '\' 

В этом ответе рассматривается вопрос в заголовке – и в предреализованном тексте вопроса – о запуске sudo rm \\ . Основываясь на том, что вы на самом деле вводили здесь на Unix.SE, похоже, что это то, что вы побежали. Однако, исходя из поведения, которое вы наблюдали, вы, возможно, не выполняете эту команду или даже какую-либо команду, как объясняет Кусалананда . Поэтому я рекомендую вам также прочитать этот ответ. В любом случае, я думаю, что оба ответа должны помочь успокоить вашу озабоченность (и, возможно, других читателей), что вы, возможно, удалили другие файлы. В конце концов, часть концерна не знает точно, что было сделано.

Я просто хочу убедиться, что он не будет нигде в системе, удаляя файлы

Если вы не передали параметр -r , -R или --recursive в rm , он не будет пытаться удалить более одного файла на один операнд имени файла, который вы ему дали. Запуск rm \\ в оболочке проходит \ в качестве операнда файла.

Иногда вы можете передать что-то похожее на один операнд, но он расширяется до нескольких операндов. Это может произойти, например, если вы использовали подглавные символы типа * или ? , Это не то, о чем вам нужно беспокоиться с \\ .

Иногда имена файлов начинаются с - и могут быть интерпретированы как параметры, поэтому некоторые команды, в том числе rm , поддерживают параметр -- чтобы указать конечные параметры. Но в этом случае это тоже не проблема. \ начинается с \ , not - .

Это возможно – хотя и маловероятно, а также очень плохая идея – то, что rm может быть функцией псевдонима или оболочки, которая передает опцию для рекурсивной операции в /bin/rm а не только с запуском /bin/rm . Вероятно, вы бы знали, сделали ли вы это. Вероятно, вы этого не сделали. Однако вы можете проверить. В большинстве оболочек в стиле Бурна, включая Bash, что вы, вероятно, используете на RHEL (также вы отметили bash ), вы можете запустить:

 type rm 

Это, скорее всего, покажет одно из следующих:

 rm is /bin/rm 
 rm is hashed (/bin/rm) 

Он также может показать, что rm является псевдонимом, который передает такие параметры, как -i или -I rm . До тех пор, пока он не пройдет -r , -R или --recursive , он не попытается удалить несколько файлов, кроме тех, которые вы сказали ему удалить.

Версия rm предоставляемая в системах GNU / Linux, включая Red Hat Enterprise Linux (вы отметили rhel ), является версией GNU Coreutils. Здесь вы можете прочитать документацию Coreutils rm . В некоторых дистрибутивах применяются последующие патчи, но такой патч не должен изменять основную операцию rm или добавлять новые способы случайного удаления файлов рекурсивно. Поведение rm в основном одинаково для разных Unix-подобных операционных систем, и даже если вы не сказали, на какой ОС вы работаете, должно быть указано выше.

Чтобы удалить «сложное» имя файла, укажите его ./ :

 sudo rm ./\\ 

Это также можно использовать, если тизер добавил в ваш корневой файл смешной файл, например файл -rf * :

 cd / sudo rm ./-rf\ \* 

Без ./ все ваши файлы исчезнут.