【问题标题】:How can I get the user's locale when running as root?以 root 身份运行时如何获取用户的语言环境?
【发布时间】:2011-11-29 18:03:28
【问题描述】:

我以 root 身份运行,但拥有用户的 uid(例如 504)。如何计算出用户的语言环境(在我的情况下为 en_GB)?以下方法不起作用:

setuid(user_uid);
fprintf(stderr,
        CFStringGetCStringPtr(CFLocaleGetIdentifier(CFLocaleCopyCurrent()),
                              kCFStringEncodingMacRoman);
setuid(0);

这将为我输出en_US

【问题讨论】:

  • 用户没有语言环境。只有 environment 具有语言环境。但是,环境取决于许多因素,通常在用户登录时由一系列 shell 脚本设置。
  • @KerrekSB 好点。知道如何在这种情况下开始吗?
  • @Crawl 用户的目录,grep 所有文件以查找区域设置exports 并预测用户将在她的命令行中键入的内容!挖掘bash_history 文件可能会为您提供有关过去行为的统计信息;例如如果你看到很多LC_ALL=en_AU.utf8 ./myprog,你就知道用户可能喜欢袋鼠...
  • 如果真的那么努力,setuid(0) 怎么会改变CFLocaleCopyCurrent() 的结果,而setuid(user_uid) 不是?
  • setuid(0) 是如何“改变”它的?通常,当您获得提升的权限时,操作系统应该重置或清除整个环境,以便非特权用户无法将任何内容注入特权上下文。我认为这会将语言环境设置为 C 或类似的东西。

标签: c++ macos locale setuid


【解决方案1】:

此信息包含在GlobalPreferences.plist 中,因此运行:

$ defaults read /Library/Preferences/.GlobalPreferences AppleLocale

给出想要的结果。

【讨论】:

    【解决方案2】:

    你不能,因为它不存在。语言环境由 环境变量,可以动态变化,从窗口到 窗口,甚至从应用程序到应用程序(即,如果用户 启动了一个程序:

    env LC_LANG=fr_FR program_name ...
    

    .) 在 Unix 下,您可以通过以下方式获取用户的默认语言环境 类似:

    FILE* in = popen("su -c 'env | grep ^LC_ ; env | grep ^LANG' - user", "r" );

    ,然后读取并解析输入,但我认为没有 任何更简单的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 2013-07-02
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2018-07-02
      • 2017-06-22
      相关资源
      最近更新 更多