Я пишу сценарий bash, который требует ввода нескольких частей пользователя, в первую очередь путей к каталогам и имен файлов. Программа создаст указанные каталоги и файлы.
При написании пути к каталогу я запрашиваю абсолютный путь - ~ / DIR / ..., или $ PATH / DIR / ... или ./DIR / ... не допускаются. Пути к каталогам следует указывать только в форме / DIR / DIR / ..., пути к файлам - в форме /DIR/DIR/.../filename и имена файлов в виде имени файла. Я также хочу убедиться, что пользователь не добавил никаких параметров командной строки (например, если я запускаю sudo, я хочу убедиться, что пользователь не добавил -u где угодно в их заявлении) к их входным данным.
Однако я не совсем уверен в том, как лучше всего очистить их ввод, поскольку пути к каталогам и имена файлов могут содержать дефисы, подчеркивания, пробелы, точки и буквенно-цифровые символы. Любой другой персонаж должен быть обнаружен.
Пользовательский ввод собирается посредством чтения. Я использую систему Ubuntu, поэтому, если она соответствует оболочке Ubuntu, она будет работать. Предположим, что установлены только системные пакеты по умолчанию.
Для обработки отдельных разделов проверки допустимо несколько параметров (например, использование --
для обработки следующих данных как параметра, а не команды [предложено Siguza], а затем еще один вариант для обработки путей к каталогам).
Абсолютные пути необходимы для правильного отображения структуры каталогов. Любой другой формат пути приведет к тому, что программа неправильно интерпретирует структуру при сопоставлении или добавлении к другим путям из-за функций, которые я выполняю над строками путей.
Спасибо.
Что сработало: я использовал принятый ответ, в некоторых случаях используя realpath и readlink, а также используя - для интерпретации следующего текста как параметров. Если вы хотите разрешить относительные пути, используйте в качестве пути результат readlink или realpath. Если вы хотите запретить относительные пути, сравните исходную строку с результатом readlink или realpath.
--
, что позволяет им рассматривать все следующие параметры как аргументы, а не параметры / флаги. Кроме того, заключите все переменные в двойные кавычки, чтобы избежать раскрытия. - person Siguza   schedule 20.08.2016foo
, можно ответить с помощью: о, есть специальнаяcheck_path_for_foo
утилита, которая может сделать эту проверку безопасности за вас.) - person ruakh   schedule 21.08.2016mkdir
,cd
иcp
не имеют никаких ограничений на имена файлов, которые они принимают; что заставило вас думать, что они сделали? Re: Я сравниваю их со статическими полными путями: какое сравнение вам нужно? Обратите внимание, что два пути могут быть как абсолютными, так и совершенно разными, но указывать на один и тот же файл. Поэтому, пожалуйста, отбросьте свои ошибочные сомнения и отредактируйте свой вопрос, чтобы добавить соответствующие сведения о том, что вам действительно нужно. - person ruakh   schedule 21.08.2016~/DIR
или$DIR
или еще чем-то, если вы правильно цитируете, не будут расширены до того, как они будут переданы в вашmkdir
илиcp
или что-то еще, поэтому, если у вас нет имени файла с~
или$
в нем, он просто придет - не найден. Есть ли причина, по которой вы не можете просто обработать эту ошибку, когда она возникает? - person Charles Duffy   schedule 21.08.2016while read
довольно глючен: имена файлов с литералами с обратной косой чертой лишены их (если не удвоены); завершающие пробелы удаляются самой командойread
, если IFS не очищен; и если запись действительно заканчивается обратной косой чертой,read
считает, что строка после является частью той же записи! - person Charles Duffy   schedule 21.08.2016IFS= read -r -d '' path
или, если вы хотите поддерживать любой символ, кроме новой строки,IFS= read -r path
. - person Charles Duffy   schedule 21.08.2016