如何将 Heredoc 输出段通过管道传输到本地文件

如何将 Heredoc 输出段通过管道传输到本地文件

我正在向远程设备发出命令,以便在其接口之一上运行 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。我可以看到“Got $counter”值随着 tcpdump 的运行而增加,这很棒。然后我可以简单地“CTRL + c”来停止捕获,并且我的文件会在我的指定位置生成。问题是第一个命令“> sh”出现在该捕获文件的第一行,这使我无法正确打开该文件进行检查。

我尝试添加“"> sh > /dev/null”,但我很确定这只会抑制远程端的输出,而不是我的输出,因为它不起作用。我尝试过弄乱这一系列的语法,但要么我的命令不能完全工作,要么包含第一行。希望有一个正确的语法可以用 tcpdump 信息填充我的本地文件。

更新:

此后,我尝试更新内容以在运行 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

相关内容