在我的日常操作中,我经常需要在远程服务器上执行 tcpdump,将输出保存到文件然后必须将文件移动到我的笔记本电脑上以在 wireshark 上进行分析,这很麻烦。
我正在探索下面的命令,它在 Linux 上运行良好
ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | wireshark -k -i -
但不幸的是,公司为我提供的办公笔记本电脑装有 Windows,他们不允许我更换操作系统。鉴于这一限制,我试图在 Windows 中实现相同的结果...
如果我在 Windows 中的 powershell 中执行以下命令
ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
我收到这个错误
At line:1 char:87
+ ... -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+ ~~
Unexpected token '-k' in expression or statement.
At line:1 char:44
+ ... -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expressions are only allowed as the first element of a pipeline.
At line:1 char:90
+ ... -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+ ~~
Unexpected token '-i' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
如果我执行不带 ssh 部分的 wireshark 命令,我会得到同样的错误,但如果我像这样执行它
& 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
它打开 wireshark 并等待数据输入。考虑到这一点,我尝试将命令更改为
ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | & 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
这样,ssh 命令就会执行,远程主机上的 tcpdump 就会启动,而 wireshark 则永远不会启动。我做错了什么?为什么与 Linux 中最相似的管道命令在 Windows 中不起作用,管道有什么不同吗?
答案1
正如@Jasen 在评论中提到的,我尝试不使用 PowerShell 而是使用 Windows 10 上的 Git Bash 执行该命令。
#!/bin/bash
server=<remote-host>
iface="ens6"
ssh $server "tcpdump -s 0 -U -n -w - -i $iface not port 22" | wireshark -k -i -
此脚本假设您已在 Windows 计算机上安装了 GitBash 和 wireshark,并且服务器和主机通过公钥身份验证进行通信。使用时请确保您具有 root 权限tcpdump
。端口 22 被明确忽略,因此在数据包嗅探会话期间看不到 ssh 流量。
答案2
搭便车@krylon 的回答,我能够使用 git-bash 通过以下单行命令来运行它:
(根据这里的答案:如何使用 wireshark 嗅探远程机器的流量?)
ssh user@host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -
(请注意,tcpdump
为了简化操作,我将 sudoers 文件添加为无密码文件)
为了能够从 PowerShell 使用它,你可以使用以下命令从 PS 提示符启动 git-bash:
对于交互式 shell:
& "C:\Program Files\Git\bin\bash.exe" -i -l
运行命令:
& "C:\Program Files\Git\bin\bash.exe" -c "command"
我将它们组合在我的 powershell 配置文件 (C:\Users\username\Documents\WindowsPowerShell\profile.ps1) 中以创建一个快捷方式:
function capture-remote {
& "C:\Program Files\Git\bin\bash.exe" -c "ssh user@host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -"
}
现在,重新启动 powershell 窗口,然后就可以通过命令启动 wireshark 并进行远程数据包捕获capture-remote
。
您可以通过向上面的函数添加用户、主机等参数来进一步增强此功能。
function capture-remote ($user = default-user, $host = default-host) {
& "C:\Program Files\Git\bin\bash.exe" -c "ssh $user@$host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -"
}
然后从 PS 提示调用capture-remote user host
。