Возможно, вам не следует этого делать, но вы можете. Ответ Кусалананды лучше подходит для поставленной задачи и объясняет проблему.Поскольку вы спросили конкретно, как использовать любые библиотечные вызовы внутри терминала, вот несколько способов...
Tiny C Compiler(tcc
)поддерживает -run
флаг , который позволяет вам (фактически )интерпретировать код C путем написания небольшой программы, поэтому вы можете использовать любые библиотечные вызовы внутри терминала посредством одного вызова этого.
Вы можете запустить функцию strnlen
следующим образом:
$ tcc -run <(echo '#include '; echo '#include '; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
При этом используется подстановка процесса из Bash, zsh и других оболочек для предоставления tcc
файла для чтения, который, по-видимому, содержит результаты всех echo
s; есть другие варианты.
Вы можете создать функцию, которая будет генерировать это для вас:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include '; echo '#include '; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(Я использовал strlen
здесь, так что это строка унарной функции ->int -вам понадобится отдельная функция для каждой другой арности и типа возвращаемого значения ).
Другим вариантом является подключаемый модуль ctypes.sh
Bash Тэвиса Орманди, который объединяет dlopen
и dlsym
. Это, вероятно, самое близкое приближение к тому, что вы пытались. Вы можете использовать, например,:
$ dlcall -r uint64 strlen "hello world"
и вызовет функцию, как и ожидалось.
Это самый прямой способ сделать это "из терминала", но вряд ли это будет что-то из вашего дистрибутива, поэтому вам придется устанавливать его вручную (, что нетривиально ). Вот несколько информативных цитат с собственного веб-сайта ctypes.sh
, чтобы дать общее представление о том, как люди относятся к этому:
- "that's disgusting"
- "this has got to stop"
- "you've gone too far with this"
Для других оболочек могут быть подобные инструменты, но я о них не знаю. Теоретически нет никаких причин, по которым не может быть отдельной команды, которая делала бы это именно для простых случаев, но я несколько удивлен, что не смог найти ее...
... так что я сделал один!dlcall
позволяет вызывать библиотечные функции из командной строки:
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Он поддерживает ограниченный набор прототипов функций, в настоящее время он не очень надежен или отказоустойчив, но теперь он существует.
Вы также можете использовать, например, Python и python -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, но это, безусловно, не самый простой способ. Perl, Ruby и другие языки имеют схожие функции, которые вы могли бы использовать.
Итак, ответы на ваши вопросы:
В общем, вам почти наверняка будет лучше сделать это любым другим способом.
Вы должны использовать опцию --expand
certbot
--expand
указывает Certbot обновить существующий сертификат новым сертификатом, который содержит все старые домены и один или несколько дополнительных новых доменов. С опцией --expand
используйте опцию -d
, чтобы указать все существующие домены и один или несколько новых доменов.
Пример:
certbot --expand -d mysite.com,imap.mysite.com,smtp.mysite.com
https://certbot.eff.org/docs/using.html#re-creating-and-updating-existing-certificates