Ray Andrews Asked: 2024-04-04 23:34:58 +0800 CST2024-04-04 23:34:58 +0800 CST 2024-04-04 23:34:58 +0800 CST 我们可以使 aptitude 搜索区分大小写吗? 772 在脚本中: 能力搜索“ ?描述($1) ” ...可以区分大小写吗? aptitude 1 个回答 Voted Best Answer Stéphane Chazelas 2024-04-06T08:45:20+08:002024-04-06T08:45:20+08:00 aptitude使用系统 C 库中的POSIX regcomp()/ API 进行正则表达式匹配并使用flags进行调用,因此您得到的结果与 1 基本相同,并且没有内置支持关闭不区分大小写的功能。regexec()regcomp()REG_ICASE | REG_EXTENDEDgrep -iE 现在,如果你愿意花一点努力,仍然有一些事情可以做。毕竟,它都是免费和开源软件,因此您可以做的事情永远没有任何限制。 例如,您可以通过删除该标志的技巧来拦截regcomp()libc 函数调用:LD_PRELOADREG_ICASE $ cat case-sensitive.c #define _GNU_SOURCE #include <dlfcn.h> #include <regex.h> int regcomp (regex_t *_Restrict_ __preg, const char *_Restrict_ __pattern, int __cflags) { static int (*orig) (regex_t *_Restrict_ __preg, const char *_Restrict_ __pattern, int __cflags) = 0; if (!orig) orig = (int (*) (regex_t *_Restrict_ __preg, const char *_Restrict_ __pattern, int __cflags)) dlsym (RTLD_NEXT, "regcomp"); return (*orig)(__preg, __pattern, __cflags & ~REG_ICASE); } $ gcc -fPIC -shared -o case-sensitive.so case-sensitive.c 然后你可以通过搜索zsh描述包含以下内容的包来查看其效果Zsh is a UNIX command interpreter: $ apt-cache show zsh Package: zsh [...] Description-en_GB: shell with lots of features Zsh is a UNIX command interpreter (shell) usable as an interactive login [...] $ aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"' zsh zsh:i386 $ LD_PRELOAD=$PWD/case-sensitive.so aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"' $ LD_PRELOAD=$PWD/case-sensitive.so aptitude search -F %p '~n "^zsh$" ~d "Zsh .* UNIX"' zsh zsh:i386 它case-insensive.so可用于任何使用 libc 的regcomp()/ regexec()API 的东西。您可以判断是否对与调试器等匹配的特定正则ltrace表达式进行了操作。 添加int regcomp(addr, string, bitvec(int));到~/.ltrace.conf: $ ltrace -e regcomp aptitude search ZZZ [...] libapt-pkg.so.6.0->regcomp(0x55d9a6f1ad60, "^linux-image-[a-z0-9]*-[a-z0-9]*"..., <0-1,3>) = 0 libapt-pkg.so.6.0->regcomp(0x55d9a6f2f060, "^linux-.*-6\\.6\\.15-amd64$|^linux"..., <0-1,3>) = 0 aptitude->regcomp(0x55d9a6f1cb10, "linux-image-.*", <0-1>) = 0 aptitude->regcomp(0x55d9a6f62980, "linux-image-.*", <0-1,3>) = 0 libapt-pkg.so.6.0->regcomp(0x55d9a6ed08c0, "^linux-.*-.*$|^kfreebsd-.*-.*$|^"..., <0-1,3>) = 0 aptitude->regcomp(0x55d9a6f60270, "ZZZ", <0-1>) = 0 aptitude->regcomp(0x55d9a6f5e830, "ZZZ", <0-1,3>) = 0 p elpa-zzz-to-char - fancy version of `zap-to-char' command p python3-zzzeeksphinx - Zzzeek's Sphinx layout and utilities (这里的标志显示为位向量,其中 0 为REG_EXTENDED1 REG_ICASE) 了解如何在某些 apt 库中aptitude间接调用regcomp(),我们的关闭REG_ICASE可能会导致问题。 还要确保您不将其用于除searchin之外的任何用途aptitude。特别是,由于该$LD_PRELOAD变量将传递给它执行的所有命令,因此您不会希望在这样的环境中启动时安装任何包。aptitude在这方面,使用 预加载该共享对象文件/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --preload "$PWD/case-sensitive.so" /usr/bin/aptitude search...会更好,因为这将确保它仅针对aptitude. GNUed还使用 libc 的 POSIX 正则表达式 API: $ echo /Debian/I | ltrace -e regcomp ed -sE /etc/issue ed->regcomp(0x5653bd71f520, "Debian", <0-1>) = 0 Debian GNU/Linux trixie/sid \n \l +++ exited (status 0) +++ $ echo /Debian/I | LD_PRELOAD=$PWD/case-sensitive.so ed -sE /etc/issue Debian GNU/Linux trixie/sid \n \l $ echo /debian/I | LD_PRELOAD=$PWD/case-sensitive.so ed -sE /etc/issue ? 标准 ERE 没有运算符来打开或关闭不区分大小写,但 Perl 正则表达式可以使用(?i) (?-i),PCRE2 也可以,PCRE2 是一个旨在将 Perl 正则表达式引入其他工具的库。Perl 正则表达式大多与 ERE 兼容。 PCRE2 恰好在其库中支持regcomp()/标准 API。regexec()libpcre-posix 这使得修改aptitude使用 PCRE2 而不是标准 ERE 相对容易。 例如,作为 PoC,我所要做的就是: $ sudo apt build-dep aptitude $ apt source aptitude $ cd aptitude*(/) 创建一个src/regex.h如下: $ cat src/regex.h #ifndef _REGEX_H #define _REGEX_H 1 #include <pcre2posix.h> #endif 然后构建: dpkg-buildpackage -b -j5 由于失踪而失败-lpcre2-posix。我所要做的就是: make -C build MAYBE_LIBGTK=-lpcre2-posix (这里使用MAYBE_LIBGTK在链接阶段引用的否则未设置的 make 变量以避免修改任何文件)。 然后我现在有一个aptitude使用PCRE2正则表达式: $ build/src/aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"' zsh zsh:i386 $ build/src/aptitude search -F %p '~n "^zsh$" ~d "(?-i)Zsh .* unix"' $ build/src/aptitude search -F %p '~n "^zsh$" ~d "(?-i)Zsh .* UNIX"' zsh zsh:i386 1 尽管在 GNU 的情况下grep,使用的正则表达式引擎和 API 因版本和许多因素而异,但它可能不会使用系统 libc 中的regcomp()/ ,即使在使用 GNU libc 的系统上也是如此。regexec()
aptitude
使用系统 C 库中的POSIXregcomp()
/ API 进行正则表达式匹配并使用flags进行调用,因此您得到的结果与 1 基本相同,并且没有内置支持关闭不区分大小写的功能。regexec()
regcomp()
REG_ICASE | REG_EXTENDED
grep -iE
现在,如果你愿意花一点努力,仍然有一些事情可以做。毕竟,它都是免费和开源软件,因此您可以做的事情永远没有任何限制。
例如,您可以通过删除该标志的技巧来拦截
regcomp()
libc 函数调用:LD_PRELOAD
REG_ICASE
然后你可以通过搜索
zsh
描述包含以下内容的包来查看其效果Zsh is a UNIX command interpreter
:它
case-insensive.so
可用于任何使用 libc 的regcomp()
/regexec()
API 的东西。您可以判断是否对与调试器等匹配的特定正则ltrace
表达式进行了操作。添加
int regcomp(addr, string, bitvec(int));
到~/.ltrace.conf
:(这里的标志显示为位向量,其中 0 为
REG_EXTENDED
1REG_ICASE
)了解如何在某些 apt 库中
aptitude
间接调用regcomp()
,我们的关闭REG_ICASE
可能会导致问题。还要确保您不将其用于除
search
in之外的任何用途aptitude
。特别是,由于该$LD_PRELOAD
变量将传递给它执行的所有命令,因此您不会希望在这样的环境中启动时安装任何包。aptitude
在这方面,使用 预加载该共享对象文件/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --preload "$PWD/case-sensitive.so" /usr/bin/aptitude search...
会更好,因为这将确保它仅针对aptitude
.GNU
ed
还使用 libc 的 POSIX 正则表达式 API:标准 ERE 没有运算符来打开或关闭不区分大小写,但 Perl 正则表达式可以使用
(?i)
(?-i)
,PCRE2 也可以,PCRE2 是一个旨在将 Perl 正则表达式引入其他工具的库。Perl 正则表达式大多与 ERE 兼容。PCRE2 恰好在其库中支持
regcomp()
/标准 API。regexec()
libpcre-posix
这使得修改
aptitude
使用 PCRE2 而不是标准 ERE 相对容易。例如,作为 PoC,我所要做的就是:
创建一个
src/regex.h
如下:然后构建:
由于失踪而失败
-lpcre2-posix
。我所要做的就是:(这里使用
MAYBE_LIBGTK
在链接阶段引用的否则未设置的 make 变量以避免修改任何文件)。然后我现在有一个
aptitude
使用PCRE2
正则表达式:1 尽管在 GNU 的情况下
grep
,使用的正则表达式引擎和 API 因版本和许多因素而异,但它可能不会使用系统 libc 中的regcomp()
/ ,即使在使用 GNU libc 的系统上也是如此。regexec()