我有一个问题描述here
出现此问题的原因是主机通过ssh将语言环境放入guest虚拟机。
解决这个问题的正确方法是什么?
我如何强制流浪ssh这样做:
LC_ALL=en_US.UTF-8 vagrant ssh
每一次?
我建议在Vagrantfile中覆盖主机区域设置
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/vivid64"
ENV['LC_ALL']="en_US.UTF-8"
end
在Vagrant外部看不到变化(主机env变量保持不变)
当连接到我的Vagrant Ubuntu盒子时,我在OSX上遇到了同样的问题(解决方案类似于Linux)。
我只是通过编辑/etc/ssh_config
(或Linux上的/etc/ssh/ssh_config
)并评论以下行来“解决”它:
# SendEnv LANG LC_*
这基本上阻止ssh
将LANG
和LC_ALL
(所有LC_
变量)发送到远程主机,从而导致使用框中的默认值。在这种情况下en_US.UTF-8
。
显然,这将导致您的远程连接始终使用可能不是您想要的默认语言环境。
我相信你也可以设置每个主机的ssh偏好但从未这样做过。我对此感兴趣,可能值得一看。
我的回答:我只是在我的ansible剧本中添加一行。但就只有Vagrant而言,它不是一个答案
- name: set locale
lineinfile: dest=/etc/default/locale line="LC_ALL=C"
LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
将这些行添加到VM的〜/ .bash_profile,然后通过vagrant重新启动VM
正确的方法是将虚拟机中的ssh守护程序配置为不接受此环境变量。
在您的开发环境中修改文件/etc/ssh/sshd_config
并像这样注释AcceptEnv
行:
$ cat /etc/ssh/sshd_config | grep AcceptEnv
# AcceptEnv LANG LC_*
如果你使用Docker作为提供者,你可以放入你的Dockerfile:
sed -i 's/AcceptEnv/# AcceptEnv/' /etc/ssh/sshd_config
您还需要生成和设置默认语言环境。你可以这样做:
# Set the locale
ENV LANG en_US.UTF-8
RUN locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8
扩展Havok的答案,您可以使VM配置确保创建一个区域设置(下面是en_US.UTF-8
),并在您通过SSH连接到VM时使用(通过运行必要的shell命令来配置区域设置)。在Vagrantfile
:
config.vm.provision "shell", inline: <<-EOF
apt-get update
apt-get install -y locales # install locales support
echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
locale-gen # enable locales in `/etc/locale.gen`
update-locale LANG=en_US.UTF-8 # setup default VM locale
sed -i -E 's/^(\s*AcceptEnv\b)/#\1/' /etc/ssh/sshd_config # avoid SSH overriding it
EOF