スクリプトをコピーせずにリモートシステムでスクリプトを実行する

スクリプトをコピーせずにリモートシステムでスクリプトを実行する

にスクリプトがあり、server Aからスクリプトを実行する必要がありますserver Bが、スクリプトをにコピーしたくありませんserver B

テキストファイルをスクリプトにパラメータとして渡す必要があります。

どうすればいいですか?

答え1

単にcatスクリプトを使用してSSHセッションにパイプすることができます。

cat /path/to/local/script.sh | ssh user@remote

これはほとんどの場合機能しますが、スクリプトはリモートのデフォルトのログインシェルによって解釈されます。スクリプトが別のシェル用に作成された場合は機能しません。

答え2

個人的に見つけた最良の方法は、Base64を使用してコピーしてデコードしてから実行することです。これにより、1)ファイルを作成してリモートホストで実行可能にする必要がなくなり、2)エンコードや面白い文字に問題が発生しません。これを非常に簡単に解釈された言語に拡張できます(スタンドアロンプ​​ログラムでなければなりません)。

cat script.sh | base64 | ssh user@host "base64 -d - | bash"

スパゲッティに少し似ていますが、コンセプトがあります。

答え3

代わりに関数を使用してください!

スクリプトを関数に変換し、パラメータを使用して渡します。

だから:

ssh user@host -tq "function foo(){ echo $*;}; foo hello world"

ただし、毎回関数をパラメータとして作成するのは非現実的です。

作業を簡単にするには、リモートシステムでローカル関数を呼び出すのに役立つ関数を作成してください。

foo () { 
    echo "${@}" 
}
bar () { 
    echo ${#} 
}

ssh_func() {
    ssh -tq user@host "function $(typeset -f ${1}); "  ${2:+"${@:2}"}; 
    # typeset -t (prints function's body chunk) to be sent with args
}
ssh_func foo hello world # this will call foo on remote machine
ssh_func bar hello world

関連情報