Heredoc出力セグメントをローカルファイルにパイプする方法

Heredoc出力セグメントをローカルファイルにパイプする方法

インターフェイスの1つでtcpdumpを実行するためにリモートデバイスにコマンドを実行し、出力をUbuntu VMのローカル.pcapファイルにキャプチャします。私が下したコマンドは次のとおりです。

drew@Drew-Ubuntu:~/Desktop$ sshpass -p $password ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -T $username@$remote-ip -p $remote-port << EOF \ > /home/drew/Desktop/Example_Capture.pcap
> sh
> tcpdump -i eth5.1 -s 0 -n -v not host $local-ip -w -
> EOF
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
^Ct 23
drew@Drew-Ubuntu:~/Desktop$

私が経験している問題は、これによりtcpdumpを起動できることです。 tcpdumpが実行されると、「Got $counter」の値が増加することがわかりますが、これは素晴らしいです。その後、「CTRL+C」を押してキャプチャを停止すると、指定した場所にファイルが作成されます。問題は、最初のコマンド "> sh"がこのキャプチャファイルの最初の行に表示され、スキャンのためにファイルを正しく開くことができないことです。

""> sh > /dev/null"を追加しようとしましたが、うまくいかなかったので、私のものではなくリモート側からの出力だけを抑制することを確信しています。これが含まれていることを願っています。

修正する:

それ以来、tcpdumpキャプチャを実行する単一のスクリプトで動作するように更新しようとし、キャンセルすると、sedは必要に応じて最初の行をクリーンアップします。私が作ったものは次のとおりです。

#!/bin/bash

read -p $'\e[32mEnter Remote IP: \e[0m' remote_ip
read -p $'\e[32mEnter Username: \e[0m' username
read -sp $'\e[32mEnter Password: \e[0m' password
echo
read -p $'\e[32mEnter File Save Location and Name: \e[0m' save_file
echo -e '\e[32mEnter tcpdump Options (ie. -i eth1 -s 0 .....)\e[0m'
read -p $'\e[32m*note: You do not need to enter the \"-w\" modifier to save to a file: \e[0m' tcpdump_options

sshpass -p $password ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -T $username@$remote_ip -p 30007 <<- EOF \ > /tmp/Remote_Capture.pcap
        sh
        tcpdump $tcpdump_options -U -w -
EOF

trap '{ sed 1d /tmp/Remote_Capture.pcap > $save_file; rm /tmp/Remote_Capture.pcap; }' SIGINT SIGTERM

問題は、CTRL+を入力するとC最後の行に達せずにスクリプト全体が終了するようです。私のキャプチャファイルは上部に追加の行が追加された/ tmpディレクトリに作成されますが、sed操作は実際に内容をクリーンアップせず、クリーンアップされたファイルを私が設定した場所にプッシュしません。

ベストアンサー1

ファイルにリダイレクトする前に、最初の行を削除できます。

sshpass ... "$remote-port" | sed 1d << EOF > /home/drew/Desktop/Example_Capture.pcap
sh
tcpdump -i eth5.1 -s 0 -n -v not host $local-ip -w -
EOF

おすすめ記事