Казалось бы, что кун-фу полномочия на Вашем сервере является довольно интересной обрабатываемой деталью. Существует две вещи, которые можно попробовать, но поскольку мы можем только предположить, какой 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 как довольно хороший модуль для подоболочек и взаимодействующий с ними.
Что происходит, это то, что 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
Но это не так безопасное решение, как и для петли или параллельного вызова над; Это сломается на именах файлов, содержащих белое пространство.
Расширение скобки происходит до расширения подстановки, потому что расширение скобки создает отдельные слова, в то время как расширение подстановки происходит в самом конце, когда узоры подстановки уже в отдельных словах. (В любом случае, если это произошло наоборот, тогда 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'