源环境变量并在远程计算机上运行本地脚本之前执行bash

时间:2014-08-26 08:27:05

标签: bash shell ssh

我正在尝试使用ssh连接执行远程本地脚本。我已经阅读了有关它语法的文档。但我的问题是,在运行脚本之前,我需要执行bash和源环境变量。

这看起来适合我,但它没有源命令:

ssh [user]@[server] 'bash -s' < [local_script]

我用EOF尝试过这样的事情,但它对我也不起作用:

#!/bin/bash
/usr/bin/ssh  "$user@$$host" <<EOF
bash -s
source /dir/to/profile/.profile
source /dir/to/env/set/env.sh
/path/to/script/script.sh stop
EOF

您是否了解此类远程命令的实现?我必须在环境设置之前获取配置文件,否则它会给出异常。但主要问题是关于来源。

也许这是一个简单的问题,但我没有任何想法。提前感谢您的所有答案。

3 个答案:

答案 0 :(得分:2)

eval 可以为您完成此任务:

eval $(cat /path/to/environment) ./script.sh

如果您知道,如果您需要,也可以通过这种方式获取多个文件 路径:

eval $(cat /path/to/environment1 /path/to/environment2) ./script.sh

或遍历目录:

eval $(cat $(find -type f /path/to/environments)) ./script.sh

如果您正在远程执行此操作以解决您的特定问题,请将SSH粘贴在其前面:

# note the quotes otherwise we'll source our local environment
ssh user@host "'eval $(cat /path/to/environment)' ./remote_script.sh"

# If it's a local environment you want to sort, then do the same
# command without the quotes:
ssh user@host "eval $(cat /path/to/environment)" ./remote_script.sh

如果您想将远程环境采购到您自己的环境中,请使用eval 在当地如此:

eval "$(ssh user@host cat /path/to/environment)" ./local_script.sh

这需要你来源一个外部文件,在同一个分叉实例中设置它的环境变量,这个实例将调用你的脚本(使它们可用)。

考虑一个如下所示的脚本文件:

#!/bin/sh
echo "$VAR1"
echo "$VAR2"
test_function

现在考虑您的环境文件如下所示:

# Environment Variables
VAR1=foo
VAR2=bar
test_function()
{
   echo "hello world"
}

如果使用eval示例,则会看到输出:

foo
bar
hello world

或者,如果您只是打开您编写的脚本,则可以提供源代码 这些环境变量直接来自它,然后就可以了 正常调用脚本没有任何技巧:

#!/bin/sh

# Source our environment by starting with period an then following
# through with the full path to the environment file. You can also use
# the 'source' keyword here too instead of the period (.).
. /path/to/environment

echo "$VAR1"
echo "$VAR2"
test_function

答案 1 :(得分:0)

我修复了另一个模板脚本的问题,该脚本获取环境变量并运行脚本。希望它有效。

PROFILE=/dir/to/profile/.profile
source $PROFILE
cd /dir/to/script
/bin/bash script $1

如果对bash shell使用source命令,则#!/ bin / bash对源命令不起作用。

感谢您的所有意见。

答案 2 :(得分:0)

我知道它已经过时但只是想补充一点,它可以在没有额外文件的情况下完成 - 使用&#39; \&#39;转义局部变量和远程命令替换 - 即:

ssh me@somehost "RMTENV=\$(ls /etc/profile) && source \$RMTENV"

我用它来执行远程java命令,需要ENV来查找java。