【问题标题】:Is there a way to pass unicode symbols in the PAM conv function?有没有办法在 PAM conv 函数中传递 unicode 符号?
【发布时间】: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函数显示二维码吗?

标签: c linux ssh pam


【解决方案1】:

您可以尝试将 Unicode 数据编码为 UTF-8。这是 Linux 上最常用的编码,许多程序有理由拒绝支持其他任何东西。除非您需要发出 U+0000,否则您可以使用标准 C 字符串将所有 Unicode 代码点存储在 UTF-8 中。

但是,如果您的目标是在终端上打印二维码,您可能会遇到问题,因为终端字符通常不是方形的,并且它们没有标准的比例。因此,您的二维码可能无法在终端上以可接受的方式呈现,并且手机难以或无法读取。有一些程序可以做到这一点,所以它可能至少在某些情况下有效,尽管它可能并非在所有地方都有效。您可能会发现libqrencode 对您的工作很有帮助。

【讨论】:

  • 我尝试使用 libqrencode 对二维码进行编码,但无法正常工作。我现在使用不同的库进行编码。我认为 libqrencode 无论如何都不会将二维码作为可打印字符串返回?
【解决方案2】:

我发现了问题。我实际上并没有将 ASCII 块字符输入 conv 函数,而是输入代码来更改终端的颜色。这最终在身份验证期间按原样打印,因此没有显示二维码。

现在通过发送正确的 ASCII 块字符来修复它,当将其视为字符串时,在 PAM 身份验证期间可以很好地打印给用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2011-07-28
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多