【发布时间】:2021-10-31 20:34:00
【问题描述】:
我正在创建一个 PAM 模块,以向尝试通过 SSH 登录系统的用户显示 QR 码,以允许他们对其进行扫描并使用手机上的生物识别技术进行身份验证。有没有办法将 unicode 字符传递给 PAM conv 函数以允许应用程序向用户显示它们?
我需要提交 unicode 字符的原因是因为我想使用 uincode 字符 █ (U+2588 Full Block) 作为一种将 QR 码打印到屏幕上的方式。
我曾尝试使用 wchar_t 类型来提交值,也只是尝试将其作为 char 提交,但最终都将丢失的字符问号打印到屏幕上。
如果无法做到这一点,是否有办法在身份验证之前显示二维码,或者只有常规文本可以显示?
来自 PAM 源的 Pam conv 结构:
struct pam_conv {
int (*conv)(int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr);
void *appdata_ptr;
};
编辑(21 年 10 月 31 日):我尝试过将编码为 UTF8 的建议,我相信这样做是这样的:\u[unicode char code]。这产生了以下编译器警告:
src/pam-qr.c:118:58: warning: multi-character character constant [-Wmultichar]
118 | row[x] = qrcodegen_getModule(qrcode, x, y) ? '\u2588' : ' ';
这个输出:
\210\210\210\210\210\210\210 \210 \210\210\210 \210\210 \210\210\210\210\210\210\210\214\2723O\177
\210 \210 \210 \210 \210 \210\214\2723O\177
\210 \210\210\210 \210 \210\210 \210 \210\210 \210 \210\210\210 \210\214\2723O\177
\210 \210\210\210 \210 \210 \210 \210\210 \210 \210\210\210 \210\214\2723O\177
\210 \210\210\210 \210 \210\210 \210\210\210 \210 \210\210\210 \210\214\2723O\177
\210 \210 \210 \210 \210\214\2723O\177
\210\210\210\210\210\210\210 \210 \210 \210 \210 \210 \210\210\210\210\210\210\210\214\2723O\177
\210\210\210 \210\210 \214\2723O\177
\210 \210 \210\210\210\210 \210 \210\210 \210\210\210\210\210 \210\214\2723O\177
\210 \210 \210\210 \210 \210\210\210 \210\210 \214\2723O\177
\210\210\210 \210\210 \210\210\210\210\210 \210 \210 \210\210\210 \214\2723O\177
\210\210\210\210\210 \210 \210\210 \210 \210\210 \214\2723O\177
\210\210 \210\210\210 \210\210 \210 \210\210\210\210 \210\210\210\210\214\272
以下是我使用#而不是块字符时得到的输出:
####### # ### ## #######
# # # # # #
# ### # ## # ## # ### #
# ### # # # ## # ### #
# ### # ## ### # ### #
# # # # #
####### # # # # # #######
### ##
# # #### # ## ##### #
# # ## # ### ##
### ## ##### # # ###
##### # ## # ##
## ### ## # #### ####
# ## # # #### ### #
# ## ## ### # ##
#### # ## # # # #
### ## ## # ## ##### #
### # # # ### #
####### # ##### # # #
# # ## # # # #
# ### # # # ## #########
# ### # # ### ## ##
# ### # ## ### # #
# # # ## ### ##
####### ## # ### # # ###
这无法扫描,但带有块字符的打印版本可能是我想要使用它的原因。这是使用我想要实现的块字符的所需输出:
███████ █ ███ ██ ███████
█ █ █ █ █ █
█ ███ █ ██ █ ██ █ ███ █
█ ███ █ █ █ ██ █ ███ █
█ ███ █ ██ ███ █ ███ █
█ █ █ █ █
███████ █ █ █ █ █ ███████
███ ██
█ █ ████ █ ██ █████ █
█ █ ██ █ ███ ██
███ ██ █████ █ █ ███
█████ █ ██ █ ██
██ ███ ██ █ ████ ████
█ ██ █ █ ████ ███ █
█ ██ ██ ███ █ ██
████ █ ██ █ █ █ █
███ ██ ██ █ ██ █████ █
███ █ █ █ ███ █
███████ █ █████ █ █ █
█ █ ██ █ █ █ █
█ ███ █ █ █ ██ █████████
█ ███ █ █ ███ ██ ██
█ ███ █ ██ ███ █ █
█ █ █ ██ ███ ██
███████ ██ █ ███ █ █ ███
【问题讨论】:
-
绝对可以通过任何东西。
void *不在乎。您可能想问“如何从我的函数中打印 Unicode 字符?”,并展示您当前的尝试。 -
那么我是否可以将任何内容转换为 void * 并将其交给上面显示的 conv 函数而不会出错?使用传入值的应用程序是否也不会遇到困难,因为它期待 char * 类型的东西?
-
'\u2588'不起作用。此 Unicode 字符不能表示为单个char。 UTF-8 是一种多字节 编码。你现在需要阅读this。或者更确切地说是 10 年前。 -
您还假设远程终端适合显示此字符,这是一个大胆的假设。
-
那你说登录时不能通过pam conv函数显示二维码吗?