在远程机器上运行本地脚本之前,先设置环境变量并执行bash

8

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

这看起来对我来说很合适,但它没有source命令:

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

你是否有关于远程命令实现的想法?在设置环境变量之前,我必须先源文件配置文件,否则会出现异常。但主要问题是关于源文件。

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


这两种解决方案都不行,我尝试了很多方法但是都不起作用!!:( - Hayra
它们存在于远程。 - Hayra
尝试执行远程本地脚本?这是什么意思?脚本是远程的还是本地的?在我看来,它似乎不能同时具备两者的属性。 - twalberg
@twalberg 这个脚本是本地的,但是它是在远程运行的(请查看问题中的语法:ssh [user]@[server] 'bash -s' < [local_script])。这个功能是内置在SSH中的。此外,对于任何通过搜索引擎找到这篇文章的人,请查看这个问题:通过ssh远程引用脚本 - blong
我认为值得链接的另一个讨论是这个。具体来说,是这个答案。 - blong
显示剩余3条评论
3个回答

9

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

0

我通过编写另一个模板脚本来解决问题,该脚本获取环境变量并运行脚本:

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

如果您在使用bash shell时使用source命令,则#!/bin/bash对于source命令无效。


0

我知道这是老方法,但只是想补充一下,可以不用额外的文件来实现 - 使用 '\' 转义本地变量和远程命令替换 - 例如:

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

我使用这个来执行远程Java命令,需要环境变量来找到Java。


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