Добрый день Товарищи!Скажите пожалуйста, если есть такая гипотетическая задача:
Скрипт в PHP берёт из БД данные и делает с ними что-то типа того:
//Массив строк для shell'а
$arr = [];//В $result данные типа SELECT aa.filePath, aa.linkPath FROM tablename
while($cur=mysqli_fetch_array($result)){
//Собственно сам вопрос в этом блоке. Как в PHP корректно экранировать путь к файлу для shell
//чтобы исходный к примеру путь: /home/vasyan kudrikov/file super cool!!!.avi
//был экранирован c учётом всех требуемых для shell к экранированию символов
//для свободного уже использования этого значения как аргумента к командам shell'а?
$escFilePath = HOW_TO_ESC($cur[0]);
$escLinkPath = HOW_TO_ESC($cur[1]);//Мне надо сформировать shell скрипт с манипуляцией файлов.
$arr[] = 'ln -s '.$escFilePath.' '.$escLinkPath;
}//Вывод результата в stdout
echo implode("\n", $arr);Собственно как организовать эту HOW_TO_ESC()?
Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать в пхп. realpath/stat для валидации путей.
Или наоборот, все делать в шелле, например пайп вида mysql | sed | xargs -l sh -c
> Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать
> в пхп. realpath/stat для валидации путей.
> Или наоборот, все делать в шелле, например пайп вида mysql | sed
> | xargs -l sh -cНу там на самом деле просто более-менее развесистая логика по обработке данных в БД ип прочее. Конечно можно всё и в shell организовать, но это точно забивание гвоздей микроскопами. Если делать всё в PHP, то есть мнение что будем медленнее существенно работать. А вот логику на PHP с формированием заданий оптимальных для shell и их выполнения на его уровне - это как мне кажется сбалансированный подход.
> Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать
> в пхп. realpath/stat для валидации путей.
> Или наоборот, все делать в шелле, например пайп вида mysql | sed
> | xargs -l sh -cСпасибо за пояснения!
слава костылям и велосипедам!п.с. как только ни извратятся, лишь бы имя файла в кавычки не брать...
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...Т.е. прямо вот можно файл с абсолютно любым именем просто оформить в виде
ln -s '$srcFile' '$dstFile'
?
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...Спасибо за мысль, подумаю над этим вариантом.
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...А если в имени файла уже есть и пути, и кавычки, и точка с запятой?
>> слава костылям и велосипедам!
>> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
>> брать...
> А если в имени файла уже есть и пути, и кавычки, и
> точка с запятой?Вообще чисто с практической точки зрения, попробую сегодня создать такое имя и с ним проверить кавычки на месте. Достаточно ли будет например в исходном имени (пути) заменить все ' на \' и оставить неэкранированные лишь те которые обрамляют аргумент, т.е.
ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'Но в моём конкретно случае, справедливости ради надо заметить, что в моём случае это будет структура каталогов, и дикий имён для них в БД не предполагается, т.к. это не "сырой пользовательский ввод", а сформированные условно мной данные. Поэтому на всякие совсем уж дикие спецсимволы я поставлю принудительную замену на _ и всё.
> Вообще чисто с практической точки зрения, попробую сегодня создать такое имя и
> с ним проверить кавычки на месте. Достаточно ли будет например в
> исходном имени (пути) заменить все ' на \' и оставить неэкранированные
> лишь те которые обрамляют аргумент, т.е.
>ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'Не сработало. Т.е. создав файл с кавычкой в имени, не удаётся это имя ни просто поместить в кавычки, ни даже поместить в кавычки, экранировав "именную" кавычку как \'
Короче видимо можно помещать в кавычки, но вот от жоских экранируемых символов лучше просто предварительно избавляться, чтобы их принципиально в именах файлов и каталогов не было.
>[оверквотинг удален]
>> с ним проверить кавычки на месте. Достаточно ли будет например в
>> исходном имени (пути) заменить все ' на \' и оставить неэкранированные
>> лишь те которые обрамляют аргумент, т.е.
>>ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'
> Не сработало. Т.е. создав файл с кавычкой в имени, не удаётся это
> имя ни просто поместить в кавычки, ни даже поместить в кавычки,
> экранировав "именную" кавычку как \'
> Короче видимо можно помещать в кавычки, но вот от жоских экранируемых символов
> лучше просто предварительно избавляться, чтобы их принципиально в именах файлов и
> каталогов не было.ln -s touch 'bloodstream'\''s file.txt' touch 'bloodstream'\''s link.txt'
> ln -s touch 'bloodstream'\''s file.txt' touch 'bloodstream'\''s link.txt'лишнего скопировал. так
ln -s touch 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'
да блинln -s 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'
> да блин
> ln -s 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'Да, работает. Т.е. условно можно все одинарные кавычки в имени при необходимости заменять на '\'' ?
Спасибо за монетку в копилку знаний :)
> Собственно как организовать эту HOW_TO_ESC()?getenv/setenv, я так в шелле пихаю аргументы в awk и там уже достаю нетронутыми. И места не будет занимать.
>> Собственно как организовать эту HOW_TO_ESC()?
> getenv/setenv, я так в шелле пихаю аргументы в awk и там уже
> достаю нетронутыми. И места не будет занимать.А если у тебя там какая-нибудь магия с цонтрол флоў, вызов шелла делается методом "закат солнца вручную" с помощью вилки/экзекуции. Или нереста, нерест позволяет указывать это икринкам.