web-dev-qa-db-ja.com

シェルスクリプト:sshを介してスクリプトから関数を実行する

Sshを介してリモートホストでローカルBash機能を実行する賢い方法はありますか?

例えば:

#!/bin/bash
#Definition of the function
f () {  ls -l; }

#I want to use the function locally
f

#Execution of the function on the remote machine.
ssh user@Host f

#Reuse of the same function on another machine.
ssh user@Host2 f

ええ、うまくいかないのは知っていますが、これを達成する方法はありますか?

38
Mr.Eddart

typesetコマンドを使用して、ssh経由でリモートマシンで関数を使用可能にすることができます。リモートスクリプトの実行方法に応じて、いくつかのオプションがあります。

_#!/bin/bash
# Define your function
myfn () {  ls -l; }
_

リモートホストで機能を使用するには:

_typeset -f myfn | ssh user@Host "$(cat); myfn"
typeset -f myfn | ssh user@Host2 "$(cat); myfn"
_

さらに良いのは、なぜパイプで悩むのか:

_ssh user@Host "$(typeset -f myfn); myfn"
_

または、HEREDOCを使用できます。

_ssh user@Host << EOF
    $(typeset -f myfn)
    myfn
EOF
_

myfnだけでなく、スクリプト内で定義されたすべての関数を送信する場合は、次のように_typeset -f_を使用します。

_ssh user@Host "$(typeset -f); myfn"
_

説明

_typeset -f myfn_は、myfnの定義を表示します。

catは関数の定義をテキストとして受け取り、$()はそれを現在のシェルで実行し、リモートシェルで定義された関数になります。最後に、関数を実行できます。

最後のコードは、sshの実行前に関数の定義をインラインに配置します。

83
alvits

私は個人的にあなたの質問に対する正しい答えを知りませんが、sshを使用して自分自身をコピーするだけのインストールスクリプトがたくさんあります。

コマンドでファイルをコピーし、ファイル関数をロードし、ファイル関数を実行してから、ファイルを削除します。

ssh user@Host "scp user@otherhost:/myFile ; . myFile ; f ; rm Myfile"
5
user2836202

別の方法:

#!/bin/bash
# Definition of the function
foo () {  ls -l; }

# Use the function locally
foo

# Execution of the function on the remote machine.
ssh user@Host "$(declare -f foo);foo"

declare -f foo関数の定義を出力します

3
Ushakov Vasilii