Как я могу хранить команды как переменные и выполнять их случайным образом в bash?

Вам не нужно слишком беспокоиться о пользователе, если данные www -или любой пользователь на вашем веб/ftp-сервере имеет доступ для чтения.

Если загрузка работает, и каталог имеет значение 755, а файлы — 644, значит, можно продолжать.

Если вы не хотите, чтобы все локальные пользователи имели доступ к этим файлам, я бы прошел через группу, создал группу с именем ftpuploads, чтобы пользователь ftp и пользователь данных www -были членами этой группы, а ваш каталог загрузки теперь может быть

chgrp ftpuploads; chmod 750 $dir

Теперь в веб-части вам нужно, чтобы ваш виртуальный хост разрешил доступ для чтения к этому каталогу. Вы хотите, чтобы индекс файлов был разрешен? теперь он отключен по умолчанию.

Этот вопрос/ответ должен помочь вам в этом:

Apache :Как включить просмотр индекса каталога на корневом уровне документа?

0
21.02.2020, 14:03
2 ответа

Использовать функцию.

command1(){ 
   convert -size 2000x1000 xc:none -gravity center \
    -stroke yellow -pointsize 50 -font Courier-BoldOblique -strokewidth 3 -annotate +100+100 "${caption}" \
    -blur 0x25 -level 0%,50% \
    -fill white -stroke none -annotate +100+100 "${caption}" \
    in.jpeg  +swap -gravity center -geometry +0-3 \
    -composite  out.jpeg
}

command2() {
   convert -size 2000x1000 xc:none -gravity center \
    -fill white -pointsize 50 -stroke none -annotate +100+100 "${caption}" -channel alpha -evaluate multiply 0.35 -trim +repage \
    in.jpeg  +swap -gravity center -geometry +0-3 \
    -composite  out.jpeg
}

Узнайте, почему Почему переменные не работают при попытке выполнить команду

3
28.04.2021, 23:22

Во-первых, это не сработает, если в аргументах есть пробелы или обычные символы глобуса:

command1="convert... -fill white -stroke none -annotate +100+100 "${caption}"...

Обратите внимание, что даже подсветка синтаксиса показывает, что часть ${caption}заключена в кавычки , а не . Цитаты не работают внутри кавычек, т.е. кавычки, расширенные из параметра, являются буквальными, они не цитируются повторно.

См.:

Два лучших варианта — хранить команды в отдельных функциях или отдельных массивах. К сожалению, вам придется придумать для них имена, у вас не может быть (пронумерованного )массива функций или массива массивов.

Затем, предполагая, что у вас есть функции или массивы с именами cmd1и cmd2, выберите одну из них, как вы это сделали, и, если вы использовали функции, просто запустите ее:

commands=(cmd1 cmd2)
chosen=$(shuf -n1 -e "${commands[@]}")
"$chosen" args...

или, если вы использовали массив, вам нужно будет использовать ссылку на имя для доступа к нему:

commands=(cmd1 cmd2)
declare -n chosen=$(shuf -n1 -e "${commands[@]}")
"${chosen[@]}" args...
3
28.04.2021, 23:22

Теги

Похожие вопросы