web-dev-qa-db-ja.com

コマンドをncに配管する

私は非常によく似た質問をたくさん検索したようですが、うまくいくものはまったく見つかりませんでした。 Raspberry Pi(第2世代)を使用してWifiOBDIIセンサーと通信しようとしています。次のコマンドを使用できます

nc -C 192.168.0.10 35000

192.168.0.10は車のセンサーで、35000はポートです。接続は問題ないように思われるので、それほど関連性はありません。とにかく、ncインスタンスを開いて、たとえば「0145」(センサーコード)と入力すると、代わりにncセッションの出力(たとえば、エンジンのRPM)でそのセンサーの値が返されます。 )。それはうまくいきます。私がやりたいのは、プロットの目的で、テキストファイルからncセッションにコマンドをパイプすることです。したがって、私の理想的な結果は、RPM値の一定のストリームと関連する時間がテキストファイルにダンプされることです。そこから仕事ができます。しかし、私はそれを行う方法を正確に知りません。数千行の「0145」であるcommands.txtを設定しました。そのファイルを読み取り、1行ずつncに渡します(おそらくスリープでサンプリング間隔を制御できます)。出力を出力し、それらをテキストファイルに隠します。この問題がstdin、stdout、およびpipingに関係していることはわかっていますが、何らかの理由で、完全に把握することはできませんでした。私は決してそれらのマスターではありません。また、プロセス全体のスクリプトを作成したいと思います。

今、走れば

cat <(echo 0145) - | nc -C 192.168.0.10 35000

これにより、必要な端末での出力が得られますが、単一の値に対してのみ機能します。しかし、それをループに入れようとするとすぐに、その0145をスクリプトの$コマンドに入れて、txtファイルから1行ずつ$コマンドを取得すると、機能しなくなります。実際、0145のままにして変数を使用しなくても、ループ内またはブロックの場合は機能しなくなります。

つまり、簡単に言うと、txtファイルを1行ずつnc接続に送信するスクリプトを作成してから、各応答を別のファイルに抽出したいと思います。スクリプト化されていない場合は、そのnc接続を開き、1秒ごとに0145を送信して、それらの応答を取得できます(ファイルに渡す方法はまだわかりません)が、効率はほとんどありません。これを行うもっと簡単な方法があるはずだと思います。私はやや初心者ですが、ここで試してみてください。どんな助けでも大歓迎です

3
Markysm

これを行うにはおそらく多くの方法があります。

netcatを使用

netcatの問題は、ファイルの終わりを検出するとすぐに接続を閉じることです。 GNUnetcatの実装にはいくつかのオプションがあります(-k または-w -1)リスニングインスタンスを無期限に開いたままにしますが、どちらも機能しません。機能するのはnmapnetcatのバージョン、ncat =。

PCに、nmapパッケージをインストールしてから、以下を発行します。

mkfifo return_pipe
ncat -k -l 12345 0<return_pipe| ncat -C 192.168.0.10 35000 1>return_pipe &

今、あなたは多くの異なる束で、あなたが好きなものすべてを転送することができます

echo Ciao | ncat localhost 12345
cat somefile.txt | ncat localhost 12345 

リスナーが協力していれば、接続が切断されることはありません(つまり、最初のファイルの終わりの後でリスニングを終了しません)。または、名前付きパイプを使用して、この部分を単純化することもできます。最初のコマンドを発行した端末とは異なる端末から、

mkfifo mypipe
tail -f mypipe | ncat localhost 12345 &
echo Ciao > mypipe
cat somefile.txt > mypipe

デバイスからのリターンメッセージは、名前付きパイプreturn_pipeにあります。コマンド

tail -f return_pipe >> responses

responsesというファイルにデバイスの応答を追加します。

netcatなし

これはIpor Sircer(Nice!、+1 from me)によって指摘されています。しかし、私はそれを少し違う方法で行います、

exec 3>/dev/tcp/192.168.0.10/35000
exec 4</dev/tcp/192.168.0.10/35000
exec 4>>somefile.out
echo "Ciao" >&3 
cat somefile.txt >&3

コマンドも追跡したい場合は、

echo Ciao | tee  -a file_with_my_commands 1>&3
cat somefile.txt | tee -a file_with_my_commands 1>&3

そして、あなたがこのコミュニケーションを終えたとき、

exec 3>&-
exec 4>&-
4
MariusMatutiae

なぜnetcatを使用するのですか? Bashは、エイリアスが組み込まれたtcpソケットを処理できます。

n=0
while read -r line;do
 ((n++))
 exec 3<>/dev/tcp/192.168.0.10/35000
 echo -e "$line" >&3
 cat <&3 > response.$n
 exec 3<&-
 exec 3>&-
done < data.txt
3
Ipor Sircer