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

我有一个脚本,将自动在Hive中运行查询。 我可以把脚本留在本地机器上,或者把它放在网关机器上。 如果我在远程机器上,我可以像运行update_table

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

但是,当我这样做时,它不能识别远程计算机上设置的环境variables。 如果我通过SSHlogin到远程机器,并运行./update_table.sh它运行良好。 如何从本地机器运行时识别环境variables?

当使用ssh指定命令时, ssh将不会为会话分配伪终端(tty)。 因此,一组不同的启动脚本(可能是)来源。 和/或脚本中的不同分支根据TERM环境变量的不存在/存在而被采用。

看到ssh人 :

当用户的身份已被服务器接受时,服务器或者在非交互式会话中执行给定的命令,或者如果没有指定命令,则登录到计算机并且给用户一个正常的shell作为交互式会话。


为了强制ssh分配tty,使用-t开关:

 ssh -t user@gatewaymachinexyz.com './update_table.sh' 

看到ssh人 :

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


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

也许你可以通过使用以下代码来源

 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' 

那么从你的bash_rc中获取你的环境变量呢?

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