在偶然发现另一篇关于 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) 我打算将我的 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) 我正在创建一个 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) 我正在尝试连接两行iwlist输出。我的grep和sed删除前导和尾随空格的命令工作正常,但我无法获得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.
我对如何使用 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) 有没有办法让 mpv 播放从另一个命令的标准输出通过管道传输的 URL 列表?
我的用例是从 HTML 页面播放所有媒体链接,例如使用以下内容:
extractlinks.py http://example.com '*.mp3' | mpv
Run Code Online (Sandbox Code Playgroud)
extractlinks.py返回一个可播放的 URL 列表,通常可以将其视为有效的 m3u 播放列表。我尝试使用mpv --playlist但它不接受来自标准输入的播放列表。
有没有办法mpv从标准输入读取 URL 列表?
假设我想将某个命令的输出通过管道传输到一个文件中。简单地……好吧,将它传送到一个文件,例如
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)
这个问题主要是为了满足我的好奇心,除非后一种形式有一些不可忽视的好处或用例,否则在实践中我会省去练习并选择前者。
我刚刚注意到
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 中。
ssh这是怎么做的?ssh要这样做?它不违反 *nix 习语吗?ssh作为通过管道连接的 stdin/stdout/stderr 的子进程运行(或另一个具有类似行为的程序)时,我希望父进程看到子进程的输出。如果子进程像这样躲避stdout/stderr,父进程怎么捕获呢?我想编写一个脚本来重复一个通常包含管道的命令行
./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)
但无济于事...
我最近从 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 上的行为更有意义——只是没那么有用。
那么有没有另一种方法可以达到相同的结果?(我关于为什么会发生这种情况的假设是否正确?)