
ローカルスクリプトから関数を生成し、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
シェル呼び出しを想定します(リモートでも構いません)。SSH提案)標準入力でこのコードを解析し、シェルがスクリプトを解釈したシェルと同じ(同じロケールで実行されている)ksh、bash、またはzsh(サポート用typeset -f
)の場合は、次のことができます。これ:
ez ssh two << EOSSH
$(typeset -f gitpull)
gitpull
EOSSH
つまり、関数を呼び出す前に関数を呼び出すシェルに関数定義が渡されますgitpull
。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
ここでのドキュメントは、ファイルのようにコマンドにリダイレクトされるドキュメントだけです。関数呼び出しがこの文書ではなくリダイレクトされたファイルにある場合は、関数定義を呼び出すために同じ実行環境で使用できる必要があります。ここでは、ドキュメントの関数呼び出しにも同様に適用されます。
ローカルシェルで関数を定義しても、関数が渡すことはできませんssh
。
2行
STATUS=$((git status) 2>&1)
echo $STATUS
1行に減らすことができます
git status 2>&1
したがって、リモートで実行されるスクリプト全体は次のようになります。
cd /var/www/html && git status
...機能がありません。
注意と命令&&
の間。失敗すると、呼び出しは停止します。これは、(予期しない状況のために)必要なディレクトリが存在しない場合に誤ってコマンドが実行されるのを防ぐ一般的な方法です。スクリプトから欠落しているディレクトリを報告することもできます。cd
git
git
cd
/var/www/html
また、両方の出力ストリームの組み合わせも削除しました。これにより、呼び出しシェルでこれを実行したり、必要に応じて個別に処理したりできます。
答え3
区切り文書の外部で関数を作成し、区切り文書から呼び出すことは可能ですか?
さて、「ここに書かれている」という言葉を引用せずに「コマンドの置き換え」を使用する限り、
gitpull () { echo $1; }
cat << 'EOF'
$(gitpull T1)
EOF
$(gitpull ARG1) <--- output of `cat`
cat << EOF
$(gitpull ARG1)
EOF
ARG1 <--- output of `cat`