주소 , CSV
주소 및 .source IP
destination IP
destination port
내 스크립트는 기본적으로 두 가지 테스트를 수행합니다.
1 성능 2 연결성.
성능 테스트에서 네트워크 IO를 계산하기 위해 source
에서 destination
(을 사용하여 ) 로 파일을 복사했습니다 . scp
그런 다음 디스크 I/O를 고려하기 위해 동일한 파일이 대상 서버의 한 위치에서 대상 서버의 다른 위치로 복사됩니다.
연결 테스트에서 열려 있는지 확인 하기 nc
위해 from을 수행하고 있습니다.source
destination
port
질문:때로는 스크립트를 실행하는 동안 어느 시점에서 멈춰서 Ctrl+C
추가 실행을 계속하려면 프로세스 종료를 눌러야 합니다.
여기서는 왜 멈췄는지 알 수 없고, 스크립트의 다른 위치에 갇힐 때마다 동작조차 일관되지 않습니다.
이 문제를 해결하도록 도와주세요. 필요한 경우 여기에 전체 스크립트를 게시할 수 있습니다.
고쳐 쓰다:
관찰하다:제가 관찰한 또 다른 점은 Ctrl+C를 누르지 않으면 5분 후에 스크립트가 자동으로 다시 시작된다는 것입니다.
실제 스크립트의 일부가 붙어 있습니다.
#Connectivity Test
TMP=$(mktemp)
nc -z -v -n $lastDestinationIP $port >\$TMP
if grep -q "succeeded" <<< cat echo \$TMP;then
echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Pass,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
else
echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Fail,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
fi
rm $TMP
fi
exit
ENDSSH
대부분의 경우 종료를 호출하는 동안 중단됩니다.
이것은 대부분의 시간 동안 멈추는 코드 조각(콘솔의)입니다.
21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> fi
>
> #rm KB_33.txt
> #rm MB_10.txt
> #rm MB_100.txt
> rm -rf dummy
> else
> #Connectivity Test
> nc -z -v -n -w 2 10.X.X.17 1524 >/tmp/tmp.GJ1knZF5Jn
> if grep -q "succeeded" <<< cat echo /tmp/tmp.GJ1knZF5Jn;then
21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> else
21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.Fail,'Fri Mar
> fi
> fi
> exit
>
답변1
이것은짧고 달다-ㅏheredoc
기본적으로 파일 설명자로 스트리밍되는 파일입니다.
대부분의 사람들은 그런 뜻이 아니다0<<descriptor
그래서 당신은 할 수 있습니다<&0 stdin. ssh
통과하다stdin
호출된 프로세스에 연결되므로,heredoc
호출하는 원격 셸에 입력을 전달합니다.
아주 특별한 품질heredocs
차이점은 다음과 같습니다.\"'quoted
그리고unquoted heredoc LIMITER.
그래서,<<'THIS'
와는 다르다<<THIS.
인용하지 않을 때LIMITER,
여기에서 문서의 내용을 평가하세요.${shell:+expansion}
.한번에 한${shell:+expansion}
일단 완성되면 이 문서를 다른 문서와 구별할 수 있는 것이 거의 없습니다.<~/input
.
예를 들어:
cat <<\QUOTED >~/file
$(echo "This is ${NOT:-} expanded.")
#END
QUOTED
cat <~/file
> $(echo "This is ${NOT:-} expanded.")
> #END
하지만...
cat <<UNQUOTED >~/file
$(echo "This is ${NOT:-} expanded.")
#END
UNQUOTED
cat <~/file
> This is expanded.
> #END
당신은 계속 사용bash <<< herestring
그리고cat.
정확히 어떻게 되는지는 모르겠지만herestring
작동하지만 내기할 의향이 있어요cat's
이미 참여했습니다. 그래서cat
연결하다그것은<&0stdin
그것으로stdout>&1
.그게 전부입니다. 그래서 불필요하게 일을 복잡하게 만드네요<<STDIN
때를<<< cat
그것.
다음과 같은 경우에는 실제 문제가 될 수 있습니다.cat
소비하고 싶지 않은 입력 스트림을 소비하게 됩니다. 그냥 실행% cat
터미널에서는 아무 일도 일어나지 않은 것처럼 보일 것입니다. 왜냐하면 터미널의stdin
그리고stdout
같은 파일입니다 - 당신의$(tty)
.그러나 그들이 다를 때,cat
맞잡다어쨌든, 그렇게 할 의도가 없다면 매우 혼란스러울 수 있습니다.
내가 보기엔 좀 닮은 것 같아\'quotes
확장자를 건너뛰는 동안$(date)
예$expanded
.그럼 그럴 수도 있지: null shell builtin
호출되고|piped
다음으로따옴표 없는 명령뒤쪽에ssh
이것은 ~이 될 것이다cat >> report.fail
이 파일에는 아무것도 생성되어서는 안 됩니다. 그래서cat
예>>appending /dev/null
도착하다report.fail
,그 정도는 견딜 수 있을 것 같아요. 아니면, 더 가능성이 높은 한,exit
허용하다ssh
대리인으로 활동null stream.
그리고 문자 그대로의 의미가 있는지 확인해보셨나요?$TMP
현재 작업 디렉토리에 있나요? 난 봤어ENDSSH
맨 밑에는 이렇게 생겼는데heredoc LIMITER
내 생각에는 그것이 완전한 대본이 아니거나 잘못 편집된 것 같습니다. 사용되는 heredoc의 본문이라면 의미가 있을 것입니다.\$TMP,
하지만 내 생각대로nc
먼저 할 것이다>truncate
그럼 그걸 써봐stdout
명명된 사람에게$TMP.
다시 말하지만, 아마도 당신은rm
어쨌든, 아마도 당신은 눈치 채지 못했을 것입니다.
그리고 당신이니까rm
영국$TMP
누군가가 다음과 같은 질문을 한다는 사실을 깨닫지 못할 수도 있습니다.
어떻게$(mktemp)
당신에게 도움이 됩니다. 필요하지 않습니다.filename.xxx
토론?
고쳐 쓰다귀하의 결과를 주의 깊게 살펴보았는데 확실히 그렇습니다.>/tmp/tmp.GJ1knZF5Jn
방법$(mktemp)
일하는 - 심지어\$TMP
부분. 그래서 당신은 내가 지정해야 한다고 말했어요mktemp .xxx
파일 이름을 지정하는 경우. 감사해요.
아직도 꼭대기 어딘가에 이단자가 있는 것 같은데? 아마도 그렇지 않을 것이고\\
단지 방법의 부작용을 해결하려고 노력 중입니다.echo \$TMP <<<herestring,
하지만 모르겠어요...흥미롭네요.
이 변수들이 다 어디서 오는지 모르기 때문에 제 말이 완전히 맞는지는 모르겠습니다. 그러나 이것은 내가 할 일에 가깝습니다.
(실제로 마지막 두 질문은 관련이 없습니다)
_ssh() ( ssh "$1"@"$2" 'printf %s, `cat` >> '"$3"
) <<-PARAMS
"$lastSourceIP"
"$lastDestinationIP"
"$sourceFqdn"
"$fqdn"
"$port" "
"ConnectivityNA"
"NA"
"NA"
"Pas"
"$(date)"
PARAMS
nc -z -v -n $lastDestinationIP $port |\
grep -q "succeeded" && suffix=txt
_ssh user host report.${suffix:-fail}
unset suffix
?ENDSSH?
노트:이것"$quotes"
위의 내용은printf's
상대방의 이해관계ssh
프로세스 - 다른 것은 없습니다. 그것들"quotes"
위의 작업을 모두 수행한 후에도 동일하게 유지됩니다.PARAMS
평가받다.
나는 이전에 거기에서 무슨 일이 일어나고 있는지 일부를 다루었습니다. 예를 들어func() ( scope )
나는 그렇게 생각하고 싶다여기 덮어줘 알았어. 이것${parameter:-expansion}
거기에도 포함되어 있지만 꽤 잘 표시되어 있습니다.여기그리고여기. 이상한 heredoc 문제가 있습니다.여기,여기, 그리고여기. 다른 사람도 있을 수 있습니다. 저는 껍질이나 물건을 만지작거리는 것을 좋아하는 것 같습니다.
하지만 이 경우에는 내가 가지고 있는 함수와 heredoc을 사용하여cat
붙어있을 수 없습니다.PARAMS
다음과 같이 전송됩니다stdin
그리고cat
도달하면 종료됩니다.EOF
(또는 CTRL-D
)그래서 한번 섭취하면PARAMS
매번 멈출 것입니다. 이는 이 프로그램을 다음 환경에서 실행하는 경우 특히 중요합니다.heredoc
이것은반품존재하다<&0
왜냐하면PARAMS
방해할 것이다cat
실행 중에 스크립트를 먹습니다.
어쨌든, 이것이 도움이 되기를 바랍니다. 제가 놓친 부분이 있으면 언제든지 문의해 주세요.