我希望在本地脚本中创建一个函数,并通过 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
...没有任何功能。
注意和命令&&
之间的。如果失败,它将停止被调用。如果所需的目录碰巧不存在(由于不可预见的情况),这是防止意外运行命令的常见方法。您可能还想报告脚本中缺少的目录。cd
git
git
cd
/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`