最近遇到一台ubuntu服务器登陆时默认语言环境变量变成posix问题, 导致中文显示乱码,影响程序的正常运行

# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

按照常规的分析,应该是开机没有加载某个配置文件

在ubuntu系统下,语言变量一般是在 /etc/default/locale 中设置的,安装系统时选择的语言最终也会写入到这里

查看这个值发现并没有问题

cat /etc/default/locale
LANG="en_US.UTF-8"

那么另一个可以设置这个变量的就是 /etc/environment 了

在测试时,系统这个文件上并没有写入 LANG的配置,其实这也是合理的

现在最主要的问题是ssh登陆时没有加载到配置文件 /etc/default/locale

找了一会问题,还没完全解决,这时告诉同事等会再来排查问题。突然同时说问题已经解决了,

遂激动的询问是怎样解决的。

直接在 /etc/profile 里面加上 export LANG=en.US-UTF-8

尴尬了。。。 这么简单的事。。一直想着查找为什么无法加载locale文件,忘记了最简单的解决办法。下次切记~~

登陆流程获取shell,肯定会加载profile文件嘛,还有在用户家目录里面设置环境变量也是可以的

当然,上面虽然可以正常解决问题,可是具体原因并没有对症下药

后来对比了login获取shell时的环境变量 和su时获取的环境变量, 发现这两个都是正常的

查看了ssh的配置文件 /etc/ssh/sshd_config, 其中有一句

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

按照注释看,这应该是加载本地的环境变量, 所以我把当前shell的语言变量设置成其他的,用ssh到其他电脑,果然环境变量会随着本地机器的设定而变化,然后再用login及su登陆系统, 奇怪的是系通正常设定了语言(这才应该是正常的情况)

问题到这,已经确定是ssh登陆时会有问题,而login和su登陆没有问题

简单的联想到是不是PAM模块未加载这个配置文件,一番对比,发现 /etc/pam.d/ 下面的 login su sshd 并没有太大的区别 都有一句加载locale变量

# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
session required pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
session required pam_env.so user_readenv=1 envfile=/etc/default/locale

按理说,这应该是没问题的。。。

往往,答案就隐藏在某个看不见的最安全的也是最容易发现地方,只是可惜被我忽略了

在sshd_config配置文件的最后有一个配置

UsePAM no

都已经设置成不加载PAM模块了,之前设定的语言变量肯定也不会被加载了嘛, 更改成yes后,登陆正常

再来看下曾今答案离我多近

ClientAliveInterval 3600
ClientAliveCountMax 10 #MaxStartups 10:30:60
#Banner /etc/issue.net # Allow client to pass locale environment variables
AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server # Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes

也就是在设定加载本地语言环境变量的下面。。。。

好了,现在粗略总结下系统登陆时获取shell的加载过程。排除登陆问题可以按照这些流程一一排查可能出错的地方

开机-->init程序-->获取登陆shell-->加载PAM模块-->加载/etc/profile文件-->加载用户家目录配置文件

网络的设置是在init程序的时候由/etc/init.d内文件指定,开机时会按顺序加载,作为开机自启程序

PAM模块 会加载一些环境变量

/etc/profile文件会调用一些其他设置,包括/etc/profile.d/*.conf 文件

用户家目录配置文件可以设定一些自定义变量, 比如可以设置语言为 zh_CN.UTF-8 (系统环境最好保持en_US.UTF-8)

登陆获取shell时的配置文件加载过程的更多相关文章

  1. asp.netcore 深入了解配置文件加载过程

    前言     配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...

  2. .net core 深入了解配置文件加载过程

    前言     配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...

  3. shell脚本,配置文件加载顺序,以及什么时候加载。

    在linux系统中,有/etc/profile,/etc/bashrc ,~/.bash_profile,~/bashrc这四个配置文件,这些文件,会自动的在某些时候加载,也就是点一下,一般都是些别名 ...

  4. springboot启动流程(四)application配置文件加载过程

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 触发监听器加载配置文件 在上一篇文章中,我们看到了Environment对象的创建方法.同时也 ...

  5. Java web 项目 web.xml 配置文件加载过程

    转载自:http://blog.csdn.net/luoliehe/article/details/46884757#comments WEB加载web.xml初始化过程: 在启动Web项目时,容器( ...

  6. 解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题

    解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题. 有时候是src/main/resources下面的,有时候是sr ...

  7. myeclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题

    解决myeclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题. 有时候是src/main/resources下面的,有时候是 ...

  8. bash 的配置文件加载顺序

    bash配置文件的加载顺序和登陆方式有关,下面先介绍下登陆方式. 1 登陆方式有2种 登陆式SHELL: su - oracle    su -l oracle 正常从终端登陆 非登录式SHELL: ...

  9. Heka 的配置文件加载逻辑

    Heka 使用的是 TOML 格式的配置文件, 有关 golang 加载 TOML 配置文件的技术请参看:  http://www.cnblogs.com/ghj1976/p/4082323.html ...

随机推荐

  1. WebLogicSSL解决苹果IOS itms下载问题

    前提: 安装好openssl工具. 通过windows cmd 命令进入 openssl工作文件夹 如解压文件夹为:E:\ openssl-1.0.2-beta1 则工作文件夹为E:\openssl- ...

  2. Python内置函数之range()

    range(stop)range(start,stop[,step]) 返回一个range对象,第三个参数的含义为:间隔的个数. range对象同时也是可迭代对象. >>> isin ...

  3. Shader编程教程

    2010-05-13 11:37:14|  分类: DirectX 3D学习|举报|字号 订阅     Shader编程教程1-环境光照 您好,欢迎来到XNA Shader教程1.我的名字叫Petri ...

  4. linux中查找文件并合并文件

    find ./src -name '*.txt' -exec cat '{}' \; > test.txt

  5. 【Mac系统 + Mysql】之安装Mysql数据库

    安装Mysql步骤: 一.下载 参考文章<mac 安装MySQL> 到Mysql官网下载.dmg格式的文件 先放弃了,看下面的简易安装. 二.使用homebrew安装MySQL(推荐) 如 ...

  6. diamond源码阅读-目录监控

    PathNode(Path)StandardWatchEventKind(WatchEvent)Watchable(WatchKey WatchService WatchEvent)WatchKey( ...

  7. #region的作用和注释快捷键

    让函数在编辑器中收起来,简洁 #region All MenuItems [@MenuItem("xxx")] public static void Init() { XXXXX; ...

  8. 【很强大的Android图表引擎 - AChartSDK】

    在手机移动App开发中,图表在app中越来越占领举足轻重的地图.而在Android领域.AchartEngine 图表引擎可谓无人不知无人不晓. 可是今天就给各位推荐更为强大的图表引擎. 为什么说更为 ...

  9. html5+css3实现手机下拉和下拉刷新

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. python多进程-----multiprocessing包

    multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多 ...