标签: pipe

使用 RawCap、Wireshark 和一些管道实用程序在 Windows 上实时环回接口数据包捕获

在偶然发现另一篇关于 Windows 上环回数据包捕获的超级用户帖子后,我被定向到RawCap,这是一个提供环回数据包伪捕获的实用程序。RawCap 写入 Wireshark 可以读取的 libpcap 文件。这对于捕获然后显示捕获的数据非常有用,但我有一个用例,我想实时查看这些捕获的数据包。

Wireshark 支持来自 STDIN 的流数据包,但 RawCap 不支持将其输出定向到 STDOUT。它只能写入文件。RawCap 确实支持禁用缓冲的选项,将每个数据包写入文件。

是否有我可以使用的第三个实用程序,类似于tail将在 Windows 下写入文件时输出文件的内容,以便我可以实时从 RawCap 捕获文件传输到 Wireshark?

RawCap -> Intermediate File -> Tail-Like Utility for Binary -> Wireshark STDIN
Run Code Online (Sandbox Code Playgroud)

windows-7 wireshark pipe

4
推荐指数
1
解决办法
4512
查看次数

强制 scp(1)、sftp(1) 或 rsync(1) 传输命名管道

我打算将我的 btrfs 子卷的完整备份和增量备份传输到磁带存档服务。该服务公开 FTP 和 SSH 端点。如果允许我在 SSH 端点上执行任意命令,那么我将执行以下操作来执行增量备份:

btrfs send -p $LAST_SUBVOLUME $NEXT_SUBVOLUME | compress | encrypt |
    ssh -p $PORT $USER@$ENDPOINT "cat > $SUBVOLUME.$YYYYMMDD.btrfs.bz2.gpg"
Run Code Online (Sandbox Code Playgroud)

但是,我不允许这样做:

$ ssh -p $PORT $USER@$ENDPOINT
Last login: Mon Jan  3 01:23:45 2067 from 123.456.789.123

This account is restricted by rssh.
Allowed commands: scp sftp rsync 

If you believe this is in error, please contact your system administrator.

Connection to some.remote.endpoint closed.
Run Code Online (Sandbox Code Playgroud)

所以我想做的是使用 SCP 协议进行传输。但是,我的scp二进制文件拒绝传输命名管道:

$ scp -P $PORT <(btrfs send -p …
Run Code Online (Sandbox Code Playgroud)

ssh scp pipe btrfs

4
推荐指数
2
解决办法
1023
查看次数

从 udev RUN 命令写入文件

我正在创建一个 udev 规则集,每次插入某个 USB 驱动器时都会写入日志文件。我的规则集存储在 中/etc/udev/rules.d /99-log-USB-drive.rules,当前包含以下内容:

# Skip if not the expected USB drive
ENV{ID_FS_UUID}!="SOMEUUID", GOTO="end"

# Try different ways of interacting with the file system
ACTION=="add", RUN+="/usr/bin/touch /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/chmod 664 /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 2 >> /home/myusername/udevtest.txt"

# Exit
LABEL="end"
Run Code Online (Sandbox Code Playgroud)

touch 和 chmod 命令都按预期工作,但是当我尝试写入文件时,我什么也没得到。使用 udev 启用调试

udevadm control --log-priority=debug

将以下输出呈现为/var/log/syslog

Dec  3 18:00:49 Hostname systemd-udevd[9629]: starting '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec  3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 1 …
Run Code Online (Sandbox Code Playgroud)

linux redirection pipe udev

4
推荐指数
1
解决办法
6807
查看次数

如何用`sed`连接两行?

我正在尝试连接两行iwlist输出。我的grepsed删除前导和尾随空格的命令工作正常,但我无法获得sed删除\n工作的最后一条语句。我错过了什么?

sudo iwlist wlan0 scanning |
   grep -e ESSID -e Signal |
   sed -e 's/^[ \t]*//;s/[ \t]*$//' |
   sed -e 's/dBm\n/dBm /'
Run Code Online (Sandbox Code Playgroud)

正则表达式在vim.

sed pipe

4
推荐指数
1
解决办法
5187
查看次数

GNU“parallel --pipe”不按行处理标准输入

我对如何使用 GNU 并行将 stdin 传递给作业命令感到非常困惑。

我有一个我认为非常常见的用例。我有一些进程xxd使用标准输入执行某些操作并输出到标准输出。例如,我有某种方法可以从另一个标准流生成或获取工作,seq 3并且我可以将两者结合起来并制作一个临时的电动工具,如下所示:

$ seq 3 | while read line; do echo $line | xxd; done
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.
Run Code Online (Sandbox Code Playgroud)

伟大的。我们可以清楚地看到,每次调用都会xxd获取一行,并附加一个尾随换行符。

这就是管道的作用parallel

$ seq 3 | parallel --pipe --recend="\n" -L 1 xxd
...

00000000: 310a 320a 330a                           1.2.3.
Run Code Online (Sandbox Code Playgroud)

parallel --pipe获取所有标准输入并将其发送到一个调用,xxd这让我感到困惑,因为所有记录的参数及其默认值似乎与此行为相矛盾:(--recend="\n"默认值)通过换行符分隔作业,-L 1(默认值)最多向命令发送一行。

空分隔符也有同样的问题。它们也被逐字传递:

seq 3 | tr '\n' '\0' | parallel --null --pipe xxd
... …
Run Code Online (Sandbox Code Playgroud)

pipe gnu-parallel

4
推荐指数
1
解决办法
4094
查看次数

mpv:如何播放从标准输入管道传输的 URL 列表

有没有办法让 mpv 播放从另一个命令的标准输出通过管道传输的 URL 列表?

我的用例是从 HTML 页面播放所有媒体链接,例如使用以下内容:

extractlinks.py http://example.com '*.mp3' | mpv
Run Code Online (Sandbox Code Playgroud)

extractlinks.py返回一个可播放的 URL 列表,通常可以将其视为有效的 m3u 播放列表。我尝试使用mpv --playlist但它不接受来自标准输入的播放列表。

有没有办法mpv从标准输入读取 URL 列表?

pipe mpv

4
推荐指数
1
解决办法
2668
查看次数

文件重定向与 dd

假设我想将某个命令的输出通过管道传输到一个文件中。简单地……好吧,将它传送到一个文件,例如

some-command > file
Run Code Online (Sandbox Code Playgroud)

和管道它通过dd

some-command | dd $MAYBE_SOME_OPTIONS_LIKE_BS of=file
Run Code Online (Sandbox Code Playgroud)

这个问题主要是为了满足我的好奇心,除非后一种形式有一些不可忽视的好处或用例,否则在实践中我会省去练习并选择前者。

bash dd pipe

4
推荐指数
1
解决办法
326
查看次数

当 stdout 和 stderr 都被重定向时,ssh 如何/为什么输出到 tty?

我刚刚注意到

ssh user@host >/tmp/out 2>/tmp/err
Run Code Online (Sandbox Code Playgroud)

可以写类似的东西

Warning the RAS host key...
...
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)

stdout 和 stderr 都被重定向,但这仍然显示在 tty 中。

  1. ssh这是怎么做的?
  2. 为什么ssh要这样做?它不违反 *nix 习语吗?
  3. 当我ssh作为通过管道连接的 stdin/stdout/stderr 的子进程运行(或另一个具有类似行为的程序)时,我希望父进程看到子进程的输出。如果子进程像这样躲避stdout/stderr,父进程怎么捕获呢?

linux ssh bash redirection pipe

4
推荐指数
1
解决办法
984
查看次数

Unix命令行用管道重复命令

我想编写一个脚本来重复一个通常包含管道的命令行

./myscript.sh ls -lart |grep ^d
Run Code Online (Sandbox Code Playgroud)

而在myscript.sh我做了一堆东西,然后想执行ls -lart |grep ^d和管道从输出到别的东西。

(如果这真的很简单并且有 1 线解决方案,请提前抱歉)。

到目前为止我已经尝试过

$@ | someothercommand
Run Code Online (Sandbox Code Playgroud)

$* | someothercommand
Run Code Online (Sandbox Code Playgroud)

但无济于事...

unix bash command-line pipe

3
推荐指数
1
解决办法
1076
查看次数

如何在 OS X 上通过管道输出 tail -F?

我最近从 Ubuntu 转移到 OS X,我发现“tail”命令的行为有所不同。

在 Ubuntu 上我可以运行

tail -f xyzzy.log | espeak
Run Code Online (Sandbox Code Playgroud)

(例如,让计算机读取 IRC 上发生的事情。)

但是在 OS X 上

tail -F xyzzy.log | say
Run Code Online (Sandbox Code Playgroud)

(我希望它是等效的)不会产生任何结果。

大概这是因为管道想要发送 tail 的完整输出 to say,但由于 tail 不断运行(使用 -f),它永远不会到达进程的末尾,因此输出永远不会被传递给 say。老实说,如果我理解正确的话,这种行为比我在 Ubuntu 上的行为更有意义——只是没那么有用。

那么有没有另一种方法可以达到相同的结果?(我关于为什么会发生这种情况的假设是否正确?)

command-line pipe tail macos

3
推荐指数
1
解决办法
6608
查看次数

标签 统计

pipe ×10

bash ×3

command-line ×2

linux ×2

redirection ×2

ssh ×2

btrfs ×1

dd ×1

gnu-parallel ×1

macos ×1

mpv ×1

scp ×1

sed ×1

tail ×1

udev ×1

unix ×1

windows-7 ×1

wireshark ×1