ssh登录目标服务器,环境变量传播问题

原创 2017年09月27日 12:25:12

坑系列:一、ssh登录目标服务器,环境变量传播问题

前言

近期在一家银行里面做CI/CD,由于各种原因,大部分逻辑都是通过shell脚本实现的。说实话,对shell脚本我并不是很熟悉,之前也就停留在cd、ls、vi的层面,所以不可避免地就踩到了不少大大小小的坑。现在这个项目基本快阶段性地结束了,准备梳理一下之前踩过的一些坑。然后我准备把这个做成一个系列,记录我过去以及将来的“坎坷之路”!

一、问题背景

在整个整个CI/CD的最后环节:将增量包部署到weblogic服务器之后,调用远程服务器的脚本重启weblogic服务器时,出现问题:启动时语言环境变量LANG不对。该weblogic服务器要求在LANG=zh_CN.UTF-8的环境下启动,在启动的过程中却发现是在英文环境下启动的。但是,如果通过终端直接登录远程服务器,执行weblogic服务启动脚本,一切正常!

理一下:
1、weblogic服务器A,A上有一个weblogic服务启动脚本Shell1
2、本地虚拟机B,B上一个脚本Shell2,Shell2通过Remote SSH的方式调用Shell1

现状:
1、通过终端登录A,执行Shell1,weblogic正常启动,LANG变量正常;
2、登录B,执行Shell2,weblogic服务启动异常,LANG变量错误。

当时是百思不得其解的,因为我在此之前已经成功部署并重启了几十台服务器了,用的都是同样的模式,而且,关键是,远程服务器上的启动脚本中也有export LANG=zh_CN.UTF-8这样的命令。

之后发现,在B上ssh到A,用env查看环境编码,显示LANG变量的值和直接终端登录A查看到的LANG值不相同,经对比,前者与B中的LANG相同,所以怀疑ssh过去LANG变量使用了B中的值(至于为什么,原谅我是个linux菜鸡),然后试着在Shell2中添加export LANG=zh_CN.UTF-8,失败!(日了狗了),难道要改全局的环境变量吗?但是我不想这么干,因为B服务器连了几十台weblogic服务器以及oracle服务器,之前已经完成了十几个项目的CI/CD,而且已经正常跑了两个月了,我不想冒这个险。
然后CSDN发给求助帖,解决!
只要在ssh到A之后执行su - xxx ,然后在调用脚本,就可以了

但是,Why?
上网搜了搜,说是执行了su - xxx之后,就可以获取到xxx的环境变量,确实,su - xxx之后env查看到的LANG值确实和终端直接登录A后看到的一样。

但是为什么su - xxx之前看到的是B上的LANG值?
再网搜,发现ssh会发送本地变量,通过参数-v可以看到(咳,为什么ssh –help看不到这个参数?)
执行 ssh -v user@ip,确实看到,在整个登录验证过程的最末尾,有这样几行:

debug1:Sending environment.
debug1:Sending env LANG=en_US.UTF-8

OK,罪魁祸首发现了。
说实话,我不能理解,为什么ssh登录时要发送本地环境变量到远程服务器上?我既然要登录到另一台linux服务器上去,那么显然我的本意就是要操作那一台,当然应该用它的环境变量啊,你本地的变量瞎参和什么呢?这有什么样的应用场景呢(疑问,留待后续
那么能不能不让它发送本地环境变量呢?当然可以。
vi 一下本地的/etc/ssh/ssh_config
在最后几行,有SendEnv xxx,注释掉去。
ssh -v查看debug信息,确实没有再发送本地环境变量过去了。
然后ssh到A,env一下,查看LANG变量,是A服务器上的变量值,对了!然后执行一下weblogic启动脚本,正常!也就是说,不用在ssh登录之后执行su - xxx的命令了。
当然,也可以更改远程服务器上的/etc/ssh/sshd_config,里面有AcceptEnv xxx的配置,注释掉就不会接收ssh发送过来的变量了。

正好,这样也解决了另外一个问题,之前ssh登录都是通过公钥免密登录的,而su - xxx是需要输入xxx的密码的,这意味着我要为脚本提供明文的密码参数,不怎么安全。而通过修改/etc/ssh/ssh_config的方式,就可以免掉su - xxx这一步,也不用提供明文密码了。

总结

通过Remote SSH方式调用远程脚本时需注意环境变量问题!

最后,推荐一篇文章
ssh 在linux下的用法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ssh连接远程主机执行脚本的环境变量问题

11 Nov 2014 • 6 min. read • 18 Comments 近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本...

ssh连接远程主机执行脚本的环境变量问题

近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本时,遇到一个奇怪的问题: ~/myscript.sh: line n: app:...

web服务器环境变量

  • 2016年10月27日 22:13
  • 3KB
  • 下载

解决Linux修改环境变量后导致登录循环进不去系统的问题

最近给移动硬盘装了个Ubuntu,然后在配置Java环境的时候,一不小心把/etc/profile里的环境变量输错了,还自信地source /etc/profile当时就终端java就不出东西,于是我...

ubuntu环境变量设置问题

  • 2014年10月04日 14:05
  • 47KB
  • 下载

Linux下adduser 及 环境变量问题

  • 2011年12月16日 13:45
  • 22KB
  • 下载

linux操作系统知识分享(进程简介,SSH使用原理图,配置环境变量,系统基本信息查询,系统管理,war包部署相关命令)

linux中进程简介,SSH使用原理图,配置环境变量,系统基本信息查询,系统管理,war包部署相关命令...

jdk环境变量配置问题

  • 2009年05月19日 04:45
  • 21KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ssh登录目标服务器,环境变量传播问题
举报原因:
原因补充:

(最多只允许输入30个字)