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上执行脚本...
  • whitehack
  • whitehack
  • 2016年06月18日 15:04
  • 6144

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

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

无需重启服务器让系统环境变量生效…

在我的电脑>属性>高级>环境变量,添加新环境变量或修改已有的环境变量后需要重新启动电脑才能生效。 因为刚才刚在服务器上修改了环境变量,而且服务器不能重启,所以只能想想办法看看能不能不用重启服务器就生效...
  • senlin1202
  • senlin1202
  • 2016年03月04日 09:53
  • 642

SSH客户端设置环境变量

当使用SSH客户端时,会发现设置的环境变量不好用,一些命令执行不了。具体的解决办法为:1.确认ssh服务端的版本$ telnet localhost 22SSH-2.0-OpenSSH_4.3确认版本...
  • wonder4
  • wonder4
  • 2009年04月29日 08:54
  • 4558

SSH 在本地执行远程机器上的命令

在本地使用 ssh $RemoteNode    可以在执行远程机器上的命令,例如 ssh  user@node ls /local  会执行远程机器上的 ls /local 命令,如果想在远程机器上...
  • zklth
  • zklth
  • 2011年03月30日 19:00
  • 27635

设置HOME环境变量来修改git默认查找的ssh-key的路径

编辑git安装目录下的etc目录中的profile文件。例如: E:\Git\etc\profile 找到如下行: # Set up USER's home directory if [ -z ...
  • cjh6311882
  • cjh6311882
  • 2015年03月11日 15:21
  • 1654

Linux设置环境变量方法

一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,b...
  • hanzheng260561728
  • hanzheng260561728
  • 2016年05月31日 21:09
  • 595

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

坑系列:一、ssh登录目标服务器,环境变量传播问题前言近期在一家银行里面做CI/CD,由于各种原因,大部分逻辑都是通过shell脚本实现的。说实话,对shell脚本我并不是很熟悉,之前也就停留在cd、...
  • sanjuejianke
  • sanjuejianke
  • 2017年09月27日 12:25
  • 265

如何使用SSH登录远程服务器

买了搬瓦工,有时候需要远程登录进行一些配置。这时候就需要SSH了。搬瓦工自带SSH服务端,因此这里只需要配置客户端就可以了。默认配置Windows下有很多SSH工具。在这里我是用的是Putty。如果安...
  • u011054333
  • u011054333
  • 2016年09月05日 19:54
  • 30098

ssh免密码(秘钥)登录Linux服务器

转载:http://www.cnblogs.com/dudu/archive/2012/12/11/linux-ssh-without-password.html 在Terminal中用ssh...
  • huludan
  • huludan
  • 2016年10月21日 01:05
  • 1542
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ssh登录目标服务器,环境变量传播问题
举报原因:
原因补充:

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