Поскольку бит suid
в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не как реальный UID (RUID), который возвращает getuid()
, и в дополнение к ограничению на suid
интерпретируется сценарии (любой исполняемый файл, начинающийся с «#!
»), некоторые оболочки, например bash
, в качестве дополнительной меры безопасности вернут EUID обратно к RUID, в этом случае вам потребуется использовать вызов setuid(0)
в коде C перед выполнением сценария.
См. man
страницы setuid
, seteuid
, getuid
и geteuid
, чтобы узнать точную семантику действительных и эффективных UID.
( ПРЕДУПРЕЖДЕНИЕ ) Конечно, уместно упомянуть, что ограничение на скрипты suid
во многих системах Unix, оболочках и интерпретаторах существует по причине, которая заключается в том, что если Скрипт не очень осторожен в отношении очистки входных данных и состояния среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Так что будьте очень осторожны при этом. Установите доступ к вашему сценарию и оболочке как можно более строго, разрешите только этот очень специфический сценарий, который вы собираетесь выполнять, и очистите среду в вашей программе на C перед запуском сценария, установив переменные среды, такие как PATH
, чтобы они содержали именно то, что необходимо в правильном порядке и нет каталогов, которые могут быть записаны для других.
: только
хочет список символов. Так и написана функция. Обратите внимание на строку документации для ссылка
, которая использует
использует.
refers to all public vars of ns, subject to filters.
filters can include at most one each of:
:exclude list-of-symbols
:only list-of-symbols
:rename map-of-fromsymbol-tosymbol
Она написана таким образом, что вы можете указать более одного символа, если хотите.
(use '[clojure.contrib.duck-streams :only (reader writer)])
Как обсуждалось в ] этот недавний пост , если вы пишете функцию, которая принимает или возвращает переменное количество аргументов, неплохо, чтобы она всегда принимала / возвращала список, вектор или набор, даже если она принимает / возвращает единичный предмет. Потому что:
nil
, часто используемый для обозначения «нулевых элементов», поддерживает seq
. Пустые коллекции также поддерживают seq
. seq
. seq
поместить в сам список. Было бы неудобно, если бы случай с одним элементом был особым случаем. Более согласованно и проще программировать, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список.
Обратите внимание, что все использование
заботится о том, является ли аргумент : only
последовательным набором символов. Это означает, что списки, векторы и наборы работают.
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
Один символ
, однако, не поддерживает seq
, поэтому вы получаете исключение, которое делаете.
Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.
Более последовательный и простой в программировании, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список. Обратите внимание, что все использование
заботится о том, является ли аргумент : only
последовательным набором символов. Это означает, что списки, векторы и наборы работают.
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
Один символ
, однако, не поддерживает seq
, поэтому вы получаете исключение, которое делаете.
Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.
Более последовательный и простой в программировании, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список. Обратите внимание, что все использование
заботится о том, является ли аргумент : only
последовательным набором символов. Это означает, что списки, векторы и наборы работают.
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
Один символ
, однако, не поддерживает seq
, поэтому вы получаете исключение, которое делаете.
Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.
Those aren't just "parens" — parens are the syntax for creating a list. It would appear the item after the :only tag is expected to be a list of things it applies to.