にスクリプトがあり、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