在shell脚本中设置环境变量以在远程服务器上运行

3

我有一个可以自动运行Hive查询的脚本。我可以将脚本留在本地机器上,也可以放在网关机器上。如果我将其放在远程机器上,我可以运行update_table命令。

ssh user@gatewaymachinexyz.com ‘./update_table.sh'

然而,当我这样做时,它无法识别在远程机器上设置的环境变量。如果我通过ssh登录到远程机器,并只运行./update_table.sh,它就能正常运行。如何让它在从我的本地机器运行时识别环境变量?
4个回答

2
当使用ssh命令时,默认情况下,ssh不会为会话分配伪终端(tty)。因此,可能会使用不同的启动脚本集。并且根据TERM环境变量的存在/缺失,采取不同的脚本分支。
请参见ssh man
引用:

当服务器接受了用户身份后,服务器将在非交互式会话中执行给定的命令;或者,如果没有指定命令,则登录到机器并将正常 shell 作为交互式会话提供给用户。


要强制ssh分配tty,请使用-t开关:
ssh -t user@gatewaymachinexyz.com ‘./update_table.sh'     

请参阅ssh手册

-t 强制分配伪终端。这可用于在远程计算机上执行任意基于屏幕的程序,非常有用,例如在实现菜单服务时。多个-t选项会强制分配tty,即使ssh没有本地tty。


尽管可以通过强制分配伪终端来解决问题,但最好修复启动脚本以为所有会话设置相同的环境。

0

也许你可以通过以下方式获取你的环境:

ssh user@gatewaymachinexyz.com 'source /etc/bashrc && source /etc/profile && ./update_table.sh'

或者:

ssh user@gatewaymachinexyz.com 'source ~/.bashrc && source ~/.bash_profile && ./update_table.sh'

我该如何指定在远程机器上查找而不是本地机器上查找? - Max
1
只需编辑您的 update_table.sh 文件并添加 source /etc/bashrc/source /etc/profile 命令,它将会 source 您的远程环境。 - chengpohi

0

你可以从你的bash_rc中获取环境变量,然后再使用它。

ssh user@gatewaymachinexyz.com "source ~/.bashrc; ./update_table.sh"


抱歉,这会在远程机器上获取bashrc吗? - Max

-1
尝试使用Jenkins管道,它会起作用。 例子:- sh“ssh(然后是您的ssh行)”

这里需要更多的解释会更有帮助。目前还不清楚Jenkins pipeline是什么。 - thelr
感谢您的评论。实际上,我在使用Jenkins-AWS CLI为我的AWS基础架构启动和配置EC2实例时遇到了这个问题,我使用了以下命令:ssh -i mypemfile.pem -t ec2-user@IP 'ls -l && source myscript.sh && ./myscript.sh'。注意:在这种情况下,myscript.sh位于/home/ec2-user目录中。 - Mudit Nagpal
好的,你的意思是你在Jenkins中遇到了问题,而不是使用Jenkins作为解决方案,对吗? - thelr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接