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
ええ、うまくいかないのは知っていますが、これを達成する方法はありますか?
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の実行前に関数の定義をインラインに配置します。
私は個人的にあなたの質問に対する正しい答えを知りませんが、sshを使用して自分自身をコピーするだけのインストールスクリプトがたくさんあります。
コマンドでファイルをコピーし、ファイル関数をロードし、ファイル関数を実行してから、ファイルを削除します。
ssh user@Host "scp user@otherhost:/myFile ; . myFile ; f ; rm Myfile"
別の方法:
#!/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
関数の定義を出力します