我正在尝试使用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
您是否了解此类远程命令的实现?我必须在环境设置之前获取配置文件,否则它会给出异常。但主要问题是关于来源。
也许这是一个简单的问题,但我没有任何想法。提前感谢您的所有答案。
答案 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。