문맥: 원격 컴퓨터에서 일부 스크립트를 실행한 다음 종료하는 작업이 있습니다.
스크립트가 있지만 내부에서 개행 문자를 사용하는 방법을 모르겠습니다.
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
두 번째 단계에서는 많은 속성이 있는 JMeter 스크립트를 실행합니다. 여기에 줄 바꿈을 사용하여 모든 줄이 한 단계에 있다고 생각하는 방법이 있습니까? 아래에 언급된 바와 같이
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
Bourne user-s-login-shell -c sh
과 같은 쉘이 코드를 해석하고 있음을 알 수 있습니다.
JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh...
Bourne-shell 또는 호환 구문의 예입니다. csh
, tcsh
, rc
, 및 쉘에서 작동 하므로 es
on의 로그인 쉘이 해당 쉘 중 하나이면 fish
작동하지 않습니다 .ssh user@server sh << EOF
user
server
그러나 한 가지 중요한 차이점은 이 경우 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
답변2
\
예, 다음 줄을 계속하려면 줄을 종료하세요 .
ssh user@server << EOF
command_one
command_two argument1 argument2 argument3 argument4\
argument5 argument6 argument7
command_three
EOF