関数をローカルで宣言し、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シェル呼び出しを想定します(リモートでも構いません)。SSH提案)標準入力でこのコードを解析し、シェルがスクリプトを解釈したシェルと同じ(同じロケールで実行されている)ksh、bash、またはzsh(サポート用typeset -f)の場合は、次のことができます。これ:

ez ssh two << EOSSH

$(typeset -f gitpull)
gitpull

EOSSH

つまり、関数を呼び出す前に関数を呼び出すシェルに関数定義が渡されますgitpullez 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

...機能がありません。

注意と命令&&の間。失敗すると、呼び出しは停止します。これは、(予期しない状況のために)必要なディレクトリが存在しない場合に誤ってコマンドが実行されるのを防ぐ一般的な方法です。スクリプトから欠落しているディレクトリを報告することもできます。cdgitgitcd/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`

関連情報