コンテキスト: リモートコンピュータでいくつかのスクリプトを実行して終了することがあります。
スクリプトがありますが、内部で改行文字を使用する方法がわかりません。
triggerPerformanceTest(){
report=$1
userDataFiles=$2
baseURL=$3
cdnURL=$4
streamingURL=$5
echo "Startin the Jmeter script"
ssh -tt -i Test.ppk username@<test server> <<EOF
cd apache-jmeter-3.1/bin/
JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh -n -t /home/ubuntu/JMeter/Test.jmx --jmeterproperty XMLReport=$report --jmeterproperty UserDataFile=$userDataFiles --jmeterproperty BaseUrl=$baseURL --jmeterproperty CdnUrl=$cdnURL --jmeterproperty StreamingUrl=$streamingURL --jmeterproperty isBenchMark=false --jmeterproperty Enable_DigitalExhaust=true --jmeterproperty Enable_Health=true --jmeterproperty HealthPollingInterval=6
exit
EOF
echo "Test successfully executed"
}
triggerPerformanceTest Log.csv UserDataFile.csv localhost localhost localhost
2番目のステップでは、多くのプロパティを持つJMeterスクリプトを実行します。ここでは、改行を使用してすべての行が1つのステップにあると思う方法はありますか?下記のように
ssh user@server << EOF
command_one
command_two argument1 argument2 argument3 argument4
argument5 argument6 argument7
command_three
EOF
ベストアンサー1
<<
hereドキュメントでは、(here)の後の区切り文字は引用符でEOF
はなく、<backslash><newline>
シーケンスが削除されます。行連続。
実際に<backslash><newline>
削除されなかった唯一のケースは次のとおりです。
- 一重引用符の中
- ここで区切り文字を参照する文書から
- バックスラッシュ自体が引用されている場所(
<backslash><backslash><newline>
)
cat << EOF
foo\
bar
EOF
出力
foobar
ここでは、次のことができます。
ssh user@server << EOF
command_one
command_two argument1 argument2 argument3 argument4 \
argument5 argument6 argument7
command_three
EOF
結局ssh
、餌を食べるでしょう:
command_one
command_two argument1 argument2 argument3 argument4 argument5 argument6 argument7
command_three
標準入力にあります。
以下を使用しても、ssh ... << 'EOF'
この文書内でパラメータ拡張、コマンド置換、および算術拡張を避けるために、次のようにssh
入力されます。
command_one
command_two argument1 argument2 argument3 argument4 \
argument5 argument6 argument7
command_three
ただし、リモートシェルはそれを<backslash><newline>
連続して解釈するため、同じ効果があります。
これを行うときは、次の点に注意してください。
ssh user@server << EOF
sshd
コードを解釈するには、リモートホストでユーザーのログインシェルを実行します。 Bourneのようなシェルである必要はありませんが、何でも可能なので、次のことを実行するのが最善です。
ssh user@server sh << EOF
実行されるので、sshd
Bourneuser-s-login-shell -c sh
のようなシェルがコードを解釈していることがわかります。
JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh...
Bourne-shell または互換構文の例です。csh
、、、、およびシェルで機能するため、onのログインシェルがそのシェルの1つである場合はtcsh
機能しません。rc
es
fish
ssh user@server sh << EOF
user
server
ただし、1つの重要な違いは、この場合はuser-s-login-shell
ログインシェルから始まらないため、ログインセッションを設定、読み取り、または/etc/profile
(または対応するユーザーのログインシェル)設定しないことです。~/.profile
あるいは、このコードをすべてのシェルと互換性のある構文に変換することもできます。 (env JVM_ARGS='-Xms512m -Xmx25000m' ./jmeter.sh...
二重引用符ではなく一重引用符を使用し、代わりにenv
env varsを渡すためにBourne / rc固有の構文を使用してくださいenvvar=value cmd
。)
以下を使用すると、バックスラッシュを回避できますxargs
。
ssh user@server sh << EOF
command_one
xargs command_two << END_OF_ARGS
argument1 argument2 argument3 argument4
argument5 argument6 argument7
END_OF_ARGS
command_three
EOF
または、、、配列などのrc
シェルksh93
を使用してくださいzsh
。bash
yash
使用法rc
/zsh
構文:
ssh user@server zsh << 'EOF'
command_one
args=(
argument1 argument2 argument3 argument4
argument5 argument6 argument7
)
command_two $args
command_three
EOF
(ローカルシェルが拡張されないようにここに引用しましたEOF
。$args
)
またはksh93
//bash
構文を使用してくださいyash
(また動作しますzsh
):
ssh user@server bash << 'EOF'
command_one
args=(
argument1 argument2 argument3 argument4
argument5 argument6 argument7
)
command_two "${args[@]}"
command_three
EOF