住所、CSV
住所および。source IP
destination IP
destination port
私のスクリプトは基本的に2つのテストを実行します。
1パフォーマンス2接続性。
パフォーマンステストでネットワークIOを計算するためsource
にdestination
(を使用して)にファイルをコピーしました。scp
その後、ディスクI / Oを考慮するために、同じファイルがターゲットサーバーのある場所からターゲットサーバーの別の場所にコピーされます。
接続テストで開いていることを確認するnc
ためにfromを実行しています。source
destination
port
質問:時には、スクリプトの実行中にある時点で停止して追加のCtrl+C
実行を続行するには、[プロセスの終了]をクリックする必要があります。
ここでは、なぜ停止したのかわからず、スクリプトの他の場所に閉じ込められるたびに動作が一貫していません。
この問題を解決するのに役立ちます。必要に応じて、ここにスクリプト全体を公開できます。
修正する:
観察する:私が観察したもう1つのことは、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,
しかし、わかりません…面白いです。
これらの変数がどこから来るのかわからないので、私の言葉が完全に合っているかどうかはわかりません。しかし、これは私がやるべきことに近いです。
(実際に最後の2つの質問は関係ありません)
_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
実行中にスクリプトを食べます。
とにかく、これが役に立つことを願っています。私が逃した部分がある場合は、いつでもお問い合わせください。