如何将本地shell变量导出到多命令ssh中?

时间:2016-08-16 22:41:39

标签: linux bash shell unix scripting

我正在尝试ssh到shell脚本中的另一台服务器并运行一些脚本。

目前我的行看起来像:

ssh user@$SERVER '$(typeset -a >> /dev/null); PROFILE_LOCATION=`locate db2profile| grep -i $INST_NAME| grep -v bak`; . $PROFILE_LOCATION; function1; function2;'

我已经尝试了'",以及使用\;';'

的组合

如何将我ssh中当前shell脚本中的变量用于另一台服务器并运行多个命令?谢谢!

1 个答案:

答案 0 :(得分:1)

如果你想要函数声明,而你的shell是bash,请使用typeset -p而不是typeset -a(它将提供变量的文本转储,但不提供函数)。此外,您需要在将在本地评估它的上下文中实际运行它(并确保您的远程shell是理解它的东西,而不是/bin/sh)。

以下点击所有这些要点:

evaluate_db2profile() {
  local db2profile
  db2profile=$(locate db2profile | grep -i "$INST_NAME" | grep -v bak | head -n 1)
  [ -n "$db2profile" ] && . "$db2profile"
}

ssh "user@$SERVER" bash -s <<EOF
$(typeset -p)
evaluate_db2profile
function1
function2
EOF
  • 由于使用的是<<EOF而不是<<'EOF',因此typeset -p命令在本地运行并替换为heredoc。 (您也可以通过在单行公式中使用双引号而不是单引号来实现此目的,但请参见下文。)
  • 在本地定义evaluate_db2profile作为函数可确保typeset -p以远程shell可以评估的格式发出它,而无需担心转义。
  • 在远程命令行上使用bash -s可确保shell解释您的函数是bash,而不是/bin/sh。如果您的代码是为ksh编写的,请运行ksh -s以达到同样的效果。