расширение фигурной скобки и * расширение

Казалось бы, что кун-фу полномочия на Вашем сервере является довольно интересной обрабатываемой деталью. Существует две вещи, которые можно попробовать, но поскольку мы можем только предположить, какой alice и боб могут и не могут сделать, YMMV.

Почему это должен быть скрипт, который запущен как alice? Поскольку это - некоторый автоматизированный доступ? Ну, если существует некоторый демон крона, у Вас может быть задание крона для боба, который регулярно выполняет некоторый сценарий удара. Если тот сценарий удара перезаписываем alice, Вы нашли себя методом для выполнения сценариев, как боб без потребности в su (делает)? вуду. Все же это действительно смягчает безопасность немного...

Другой подход, я никогда не пробовал, идет вроде фоновой оболочки с stdin и связанный с каналами. Должно быть возможно отправить sudo su - bob\n к каналу stdin и это должно заставить фоновую оболочку выполнить ту команду. Каждая последующая команда, отправленная в фоновую оболочку, должна быть выполнена как боб. Грубый эскиз - это:

mkdir -p /tmp/backshell
mkfifo /tmp/backshell/stdin
mkfifo /tmp/backshell/stdout
mkfifo /tmp/backshell/stderr

bash -l >/tmp/backshell/stdout 2>/tmp/backshell/stderr </tmp/backshell/stdin &

cat /tmp/backshell/stdout &
cat /tmp/backshell/stderr >&2 &

echo "sudo su - bob" >> /tmp/backshell/stdin
echo "whoami" >> /tmp/backshell/stdin

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

4
01.04.2015, 03:53
2 ответа

Что происходит, это то, что Bash впервые расширяется *. DJVU {,. BK} в *. DJVU * .djvu.bk , а затем делает глобус-расширение на тех. Это объяснило бы Что вы наблюдаете: в вашем случае *. DJVU , соответствует существующему файлу, Скажем foo.djvu и расширяется в это, но *. djvu.bk совпадает с файлом, И таким образом расширяется как сама, *. djvu.bk .

Орден расширения указывается в документации Bash:

The order of expansions is: brace expansion, tilde  expansion,  parame‐
ter,  variable  and arithmetic expansion and command substitution (done
in a left-to-right fashion), word splitting, and pathname expansion.

Я бы предложил перезаписывать команду вашей копии как:

for f in *.djvu; do cp -- "$f" "$f".bk; done

или, возможно, чтобы избежать синтаксического накладного расхода явного цикла для цикла:

parallel -j1 cp -- {} {}.bk ::: *.djvu

(по второму мыслям ... Это на самом деле не намного короче.)

Чтобы ответить на ваш под сомнение: «Как его можно расширить», можно использовать подделка (пример в каталоге, содержащий только foo.djvu и BAR.DJVU ):

$ echo $(echo *.djvu){,.bk}
bar.djvu foo.djvu bar.djvu foo.djvu.bk

Но это не так безопасное решение, как и для петли или параллельного вызова над; Это сломается на именах файлов, содержащих белое пространство.

8
27.01.2020, 20:47

Расширение скобки происходит до расширения подстановки, потому что расширение скобки создает отдельные слова, в то время как расширение подстановки происходит в самом конце, когда узоры подстановки уже в отдельных словах. (В любом случае, если это произошло наоборот, тогда CP * .djvu {,. Bk} ничего не соответствует, потому что нет файла, имя которого заканчивается .djvu {,. Bk}. , а затем расширение скобки дало бы два слова *. DVJU и *. DJVU.BK .) Итак, сначала CP * .djvu {,. Bk} расширяется до CP *. DJVU *. Djvu.bk , то каждое слово, содержащее подстановочные знаки, расширяется, если подстановочные знаки соответствуют хотя бы одному файлу. Поскольку у вас есть файлы сопоставления *. DJVU , но не совпадают *. Djvu.bk , вы оказываете что-то вроде CP A.DJVU b. DJVU *. DJVU.BK .

Если есть файлы сопоставления *. Djvu.bk , то этот шаблон подстановочного знака также будет расширен, поэтому вы получите что-то вроде CP A.DJVU B.DJVU A.DJVU.BK C.DJVU.BK . Если цель была запущена CP на обоих *. DJVU и *. Djvu.bk файлы, но позволяют либо образению, чтобы ничего соответствовать, то вы можете использовать КШ расширенные шаблоны:

shopt -s extglob
cp *.djvu?(.bk) somedir/

Но это не то, что вы пытаетесь сделать. Вы не можете получить то, что вы хотите по любой форме расширения на аргументах CP : вам необходимо выдать отдельный CP команду для каждого .djvu файл, каждый с правой целью. Единственный случай, когда есть один CP CP CR достаточно, если есть один .djvu файл, так что *. DJVU расширяется до одного файла. В этом случае самый простой способ ввести команду - ввести шаблон (начать набрать CP * .djvu ), затем сообщите Bash, чтобы расширить его, нажав CTRL + + + X * , нажмите , нажмите Backspace , чтобы удалить конечное пространство и тип {,. Bk} .

Если есть несколько файлов для копирования, вам необходимо вызвать CP в цикле, так или иначе или иначе использовать другой инструмент, который может копировать файлы в соответствии с шаблонами имен.

Написание петли в Bash довольно легко:

for x in *.djvu; do cp "$x" "$x.bk"; done

Другой инструмент, который вы можете использовать, является PAX . Здесь не намного меньше печатания.

pax -rw -s'/$/.bk/' *.djvu .

ZSH имеет ZCP для такого рода задача. Загрузите его в свой .zshrc :

autoload -U zmv
alias zcp='zmv -C' zln='zmv -L'

затем запустить

zcp '*.djvu' '$f.bk'
4
27.01.2020, 20:47

Теги

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