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

时间:2015-08-24 01:14:15

标签: linux bash shell ssh environment-variables

我有一个脚本会自动在Hive中运行查询。我可以将脚本保留在本地计算机上,也可以将其放在网关机器上。如果我在远程计算机上有它,我可以运行update_table,如

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

但是,当我这样做时,它不会识别远程计算机上设置的环境变量。如果我通过ssh登录到远程计算机,然后运行./update_table.sh就运行正常。从本地计算机运行时如何识别环境变量?

4 个答案:

答案 0 :(得分:1)

当使用ssh指定命令时,ssh默认情况下不会为会话分配伪终端(tty)。因此,可能(可能)采购了一组不同的启动脚本。根据{{​​1}}环境变量的存在/存在,和/或脚本中的不同分支。

请参阅ssh man

  

当服务器接受用户的身份时,服务器在非交互式会话中执行给定的命令,或者,如果没有指定命令,则登录到机器并给出使用普通shell作为交互式会话。

要强制TERM分配tty,请使用ssh开关:

-t

请参阅ssh man

  

ssh -t user@gatewaymachinexyz.com ‘./update_table.sh' 强制伪终端分配。这可用于在远程机器上执行任意基于屏幕的程序,这可能非常有用,例如,实现菜单服务时。即使-t没有本地tty,多个-t选项也会强制进行tty分配。

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

答案 1 :(得分: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'

答案 2 :(得分:0)

如何从bash_rc中获取环境变量?

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

答案 3 :(得分:-1)

尝试使用Jenkins管道。会的。 例如:-sh“ ssh(然后是您的ssh行)”