Как передать параметры псевдониму?

Точное правило: можно пересечь каталог, если и только если Вы имеете, выполняют разрешение на нем.

Так, например, к доступу dir/subdir/file, Вы должны выполнить разрешение на dir и dir/subdir, плюс полномочия на file для типа доступа Вы хотите. Входя в угловые случаи, я не уверен, универсально ли это, что Вы должны выполнить разрешение на текущем каталоге для доступа к файлу через относительный путь (Вы делаете на Linux).

Путем Вы получаете доступ к вопросам файла. Например, если Вы имеете, выполняют полномочия на /foo/bar но не на /foo, но Ваш текущий каталог /foo/bar, можно получить доступ к файлам в /foo/bar через относительный путь, но не через полный путь. Вы не можете измениться на /foo/bar в этом сценарии; более привилегированный процесс, по-видимому, сделал cd /foo/bar прежде, чем идти непривилегированный. Если файл имеет несколько жестких ссылок, путь, который Вы используете для доступа к нему, определяет ограничения доступа.

Символьные ссылки ничего не изменяют. Ядро использует права доступа обработки вызовов для пересечения их. Например, если sym символьная ссылка на каталог dir, Вы должны выполнить разрешение на dir к доступу sym/foo. Полномочия на самой символьной ссылке могут или не могут иметь значения в зависимости от ОС и файловой системы (некоторые уважают их, некоторые игнорируют их).

Удаление выполняется, разрешение от корневого каталога эффективно ограничивает пользователя частью дерева каталогов (который более привилегированный процесс должен изменить в). Это требует, чтобы списки управления доступом были любым использованием. Например, если / и /home запрещены к joe (setfacl -m user:joe:0 / /home) и /home/joe joeкорневой каталог, затем joe не сможет получить доступ к остальной части системы (включая выполнение сценариев оболочки с /bin/sh или динамично связанные двоичные файлы, которые должны получить доступ /lib, таким образом, необходимо было бы пойти глубже для практического применения, например. setfacl -m user:joe:0 /*; setfacl -d user:joe /bin /lib).

Читайте разрешение на каталоге дает право перечислить записи. Предоставление выполняется, разрешение, не давая разрешение чтения иногда полезно: названия записей служат паролями для доступа к ним. Я не могу думать ни о каком использовании в предоставлении чтения или записать, что разрешение к каталогу без выполняет разрешение.

68
14.01.2012, 01:05
6 ответов

Псевдонимы похожи на команды в этом всем, аргументы им передаются как аргументы программе, которую они искажают. Например, если необходимо было исказить ls кому: ls -la, затем ввод ls foo bar действительно выполнился бы ls -la foo bar на командной строке.

Если Вы хотите иметь фактический контроль над тем, как аргументы интерпретируются, то Вы могли записать функцию как так:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}
52
27.01.2020, 19:31
  • 1
    opengroup.org/onlinepubs/009695399/utilities / … Функции в sh определяются my_program_wrapper() { ...; }. Bash действительно обрабатывает ключевое слово function но почему бы не пойти с тем, что является более портативным? –  ephemient 05.11.2010, 03:51
  • 2
    @ephemient. Я имею в виду помимо того, что все используют Bash GNU а не базовую оболочку POSIX. –  amphetamachine 05.11.2010, 14:53

Добавляя к существующим ответам, важная вещь понять о том, как работа псевдонимов состоит в том, что все параметры Вы вводите после того, как искаженная команда будет использоваться буквально в конце. Таким образом, нет никакого способа использовать псевдоним для двух команд (переданный по каналу или не), из которого первое должно интерпретировать параметры. Для прояснения вот, пример чего-то, что не работало бы как ожидалось:

alias lsswp="ls -l | grep swp"

(пример, вдохновленный этим вопросом), это будет всегда использовать вывод ls -l выполненный в текущем каталоге и делают grep на этом - настолько использующий

lsswp/tmp/

было бы эквивалентно ls -l | grep swp /tmp/ и нет ls -l /tmp/ | grep swp.

Во всех целях, где аргументы должны использоваться где-нибудь в середине, нужно использовать a function вместо alias.

19
27.01.2020, 19:31

Вы ничего не должны делать на самом деле; псевдонимы делают это автоматически. Например:

$ alias less="less -eirqM"
$ less foo.txt

Вы будете видеть первую страницу foo.txt, и less выйдет в EOF (-e), поиски будут нечувствительны к регистру (-i) и т.д.

15
27.01.2020, 19:31
  • 1
    Можете Вы смотреть на мой вопрос - ни одна из работ решений для меня, и мне не разрешают, запускают щедрость. –  JJD 10.02.2016, 01:40
  • 2
    @JJD тот, который ответил на Ваш вопрос, корректен: Вы хотите функцию в этом случае, не псевдоним. Так как принятый ответ на этот вопрос является по существу тем же, Ваш вопрос был справедливо закрыт. –  Warren Young 10.02.2016, 01:44

Псевдоним решение

Если вы действительно против использования функции как таковой, вы можете использовать:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Вы можете заменить $@ с $1, если вам нужен только первый аргумент.

Объяснение

Это создает временную функцию f, которой передаются аргументы.

Аргументы псевдонима передаются только в конце. Обратите внимание, что f вызывается в самом конце псевдонима.

unset -f удаляет определение функции при выполнении псевдонима, чтобы оно не зависало впоследствии.

75
20.08.2021, 13:39

Я отвечаю за csh:

Да, вы можете использовать параметры в псевдонимах и -в отличие от сказанного выше -вы можете ссылаться на них в любом месте определения псевдонима -не только в конце.

Пример для tar -gz -ing something:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, где !:1и !:2— параметры, которые вы указываете при вызове своего псевдонима.

Пример использования:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

Что фактически означает, что вы использовали два параметра, которые вы вставили в произвольные места команды tar, превратив все это в псевдонимtgz

3
20.08.2021, 13:39

Этот пример для красивой печати файла уценки в терминале работает, если первая команда канала может читать из стандартного ввода:

alias mdcat='(pandoc | lynx -stdin -dump) <'

Таким образом, вместо pandoc myfile.md | lynx -stdin -dumpможно использовать mdcat myfile.md.

Это не совсем ответ на ваш вопрос, так как он не делает «$@» доступным в псевдониме, но, вероятно, отвечает на некоторые реальные -мировые варианты использования этого вопроса.

0
24.11.2021, 09:34

Теги

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