可以在本地声明函数并在 SSH 连接的远程端使用它

可以在本地声明函数并在 SSH 连接的远程端使用它

我希望在本地脚本中创建一个函数,并通过 SSH 连接在远程主机上调用它,这可能吗?

set -e
gitpull () { 
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
}

ez ssh two << 'EOSSH'
    gitpull
EOSSH

基本上,我必须做类似以下的事情,我不想重复我的代码......

ez ssh two << 'EOSSH'
    gitpull
EOSSH

ez ssh three << 'EOSSH'
    gitpull
EOSSH

ez ssh four << 'EOSSH'
    gitpull
EOSSH

etc...

答案1

假设ez ssh调用一个 shell(可能是远程的)SSH建议)要在其标准输入上解析该代码,并且该 shell 与解释脚本的 shell 相同(并在同一语言环境中运行),并且它是 ksh、bash 或 zsh(用于typeset -f支持),您可以这样做:

ez ssh two << EOSSH

$(typeset -f gitpull)
gitpull

EOSSH

也就是说,在调用该函数之前将该gitpull函数的定义传递给调用该函数的 shell 。ez ssh或者与zsh

ez ssh two << EOSSH
$functions[gitpull]
EOSSH

或者当然你可以这样做:

gitpull='
  cd /var/www/html
  STATUS=$((git status) 2>&1)
  echo $STATUS
'
ez ssh two << EOSSH
$gitpull
EOSSH

或者

printf '%s\n' "$gitpull" | ez ssh two

其他方法可能是使用已经建议的循环或执行以下操作:

ez_ssh_gitpull() {
  ez ssh "$@" << 'EOSSH'
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
EOSSH
}

ez_ssh_gitpull two
ez_ssh_gitpull three

答案2

看起来您正在寻找一个循环:

for remote in two three four; do
    ez ssh "$remote" <<'END_SSH'
script
goes here
END_SSH
done

这里的文档只是一个文档,就像一个文件,重定向到一个命令中。如果您的函数调用位于重定向的文件而不是此处文档中,则函数定义必须在同一执行环境中可用,以便您能够调用它。此处文档中的函数调用也是如此。

在本地 shell 中定义该函数并不能使其可通过ssh.


两条线

STATUS=$((git status) 2>&1)
echo $STATUS

可以简化为单行

git status 2>&1

所以要远程执行的完整脚本是

cd /var/www/html && git status

...没有任何功能。

注意和命令&&之间的。如果失败,它将停止被调用。如果所需的目录碰巧不存在(由于不可预见的情况),这是防止意外运行命令的常见方法。您可能还想报告脚本中缺少的目录。cdgitgitcd/var/www/html

我还删除了两个输出流的组合。这允许您在调用 shell 中执行此操作,或者如果您愿意的话可以单独处理它们。

答案3

在定界文档之外创建一个函数并从定界文档中调用它,这可能吗?

好吧,看来,只要你不引用“here-document”的单词,并使用“命令替换”:

gitpull () { echo $1; }

cat << 'EOF'
$(gitpull T1)
EOF

$(gitpull ARG1)    <--- output of `cat`

cat << EOF 
$(gitpull ARG1)
EOF

ARG1               <--- output of `cat`

相关内容