外部过滤器,程序和命令--混杂命令

本文介绍了一系列实用的Linux命令,如seq、yes、run-parts等,涵盖了文件生成、数据重定向、环境变量显示等方面,深入解析了命令的语法、选项及实际应用场景。

这个不大引人注意的命令可以创建一个命名管道,一些不好归类的命令.

jot, seq

  这些工具用来生成一系列整数, 用户可以指定生成范围.

seq

  seq命令用于产生从某个数到另外一个数之间的所有整数.
语法

seq [选项]... 尾数 
seq [选项]... 首数 尾数 
seq [选项]... 首数 增量 尾数

选项

-f, --format=格式 使用printf 样式的浮点格式 
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) 
-w, --equal-width 在列前添加0 使得宽度相同

实例
  -f 选项:指定格式

bash$ seq -f "%3g" 9 11
  9
 10
 11

  % 后面是数字的位数,默认是%g%3g 数字位数不足部分是空格.

bash$ seq -f "str%03g" 9 11
str009
str010
str011

  数字位数不足部分是0,%前面制定字符串.

  -w选项:指定输出数字同宽

bash$ seq -w 98 101
098
099
100
101

  不能和-f一起用,输出是同宽的.

  -s选项:指定分隔符(默认是回车)

bash$ seq -s "" -f "str%03g" 9 11
str009 str010 str011

  指定/t做为分隔符号:

bash$ seq -s "`echo -e "\t"`" 9 11
9   10  11



例:使用seq命令来产生循环参数.

#!/bin/bash
# use_seq.sh: 使用seq命令来产生循环参数

for a in `seq 100`      # or    for a in $( seq 100 ) 
do
    echo -n "$a "
done

echo; echo

limit=100

for a in `seq $limit`      # or    for a in $( seq $limit ) 
do
    echo -n "$a "
done

echo; echo

BEGIN=80
INTERVAL=5
END=100

for a in `seq $BEGIN $END`
do
    echo -n "$a "
done

echo; echo

for a in `seq $BEGIN $INTERVAL $END`
do
    echo -n "$a "
done

echo; echo

exit 0

一个简单的例子:

#!/bin/bash
# touch file: 产生10个连续扩展名的文件,名字分别是file.1,file.2...file.10  

COUNT=10
PREFIX=file

for filename in `seq $COUNT` 
do
    touch $PREFIX.$filename
done

exit 0

getopt

  getopt命令将会分析以破折号开头的命令行选项. 这个外部命令与Bash的内建命令getopts作用相同.

   通过使用 -l 标志, getopt可以处理超长(多个字符的)选项, 并且也允许参数重置.


run-parts

  run-parts命令将会执行目标目录中所有的脚本, 这些脚本会以ASCII码的循序进行排列.当然, 这些脚本都需要具有可执行权限.

  cron 幽灵进程会调用run-parts来运行 /etc/cron.* 下的所有脚本.

  格式用法

run-parts [OPTION]... DIRECTORY

  主要参数

      --test          显示可以运行的脚本名称
      --list          列出 符合 命名规范的文件名,注意可能不是可执行的命令或脚本
  -v, --verbose       详尽输出模式,包括错误信息
      --report        只打印输出.
      --reverse       字符逆序执行
      --exit-on-error 只要命令或脚本执行的返回结果不是0,(一般为错误),就终止run-parts的执行
      --lsbsysinit    validate filenames based on LSB sysinit specs.
      --new-session   命令或脚本以新的会话执行,使之不受当前会话结束或异常终止的影响
      --regex=PATTERN validate filenames based on POSIX ERE pattern PATTERN.
  -u, --umask=UMASK   设置 umask 值,默认是 022.
  -a, --arg=ARGUMENT  传递给脚本参数.
  -V, --version       显示版本信息
  -h, --help          显示帮助信息

yes

  yes命令在命令行中输出指定的字符串,直到yes进程被杀死。不带任何参数输入yes命令默认的字符串就是.

  语法

yes(参数)

  参数
  字符串:指定要重复打印的字符串.
  实例

bash$ yes Hello World!
Hello World!
Hello World!
Hello World!
... 一直重复打印 testline,按Ctrl+C结束.

bash$ yes "Hello World!"
Hello World!
Hello World!
Hello World!
... 一直重复打印 testline,按Ctrl+C结束.

  将会把传递进来的参数字符串用一个ASCII字符(默认是’#’)给画出来(就是将多个’#’拼出一副字符的图形), 然后输出到 stdout .

figlet

  用大写方式把我们输入的字符串显示在标题栏,显示效果由ASCII字符组成。

toilet

  用大写方式把我们输入的字符串显示在标题栏,显示效果由ASCII字符组成。

这里写图片描述

类似有趣的linux命令,点我   点我


printenv

  显示某个特定用户所有的环境变量.

bash$ printenv | grep HOME
HOME=/home/liudezhi

lp

  lp和lpr命令将会把文件发送到打印队列中, 并且作为硬拷贝来打印. 这些命令会记录它们名字的起点, 直到行打印机的另一个阶段.

  语法

lp(选项)(参数)

  选项

-E:与打印服务器连接时强制使用加密; 
-U:指定连接打印服务器时使用的用户名; 
-d:指定接收打印任务的目标打印机; 
-i:指定一个存在的打印任务号; 
-m:打印完成时发送E-mail; 
-n:指定打印的份数; 
-t:指定打印任务的名称; 
-H:指定打印任务开始的时间; 
-P:指定需要打印的页码。

  参数
  文件:需打印的文件.

  退出状态
  0:所有输入文件成功处理。
  >0:没有输出设备可用,或者出现一个错误。

  还有一些相关的命令, 比如lpq, 可以用来查看打印队列, 而lprm, 可以从打印队列中删除作业.

详细信息


tee

  tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin. 简单的说就是把数据重定向到给定文件和屏幕上.
这里写图片描述

  语法

tee (选项)(参数)

  选项

-a:向文件中重定向时使用追加模式; 
-i:忽略中断(interrupt)信号.

  参数
  文件:指定输出重定向的文件.

例:在终端打印stdout同时重定向到文件中:

bash$ ls | tee out.txt
...
bash$ ls
... out.txt
bash$ ls | tee out.txt | cat -n
1 ...
2 ...
n ...
ls 
... out.txt

mkfifo

  创建一个命名管道, 并产生一个临时的先进先出的buffer, 用来在两个进程之间传递数据.
  典型的应用是一个进程向FIFO中写数据, 另一个进程读出来.


pathchk

  pathchk命令用来检查文件中不可移植的部分.
  用来检查文件名的有效性. 如果文件名超过了最大允许长度(255个字符), 或者它所在的一个或多个路径搜索不到, 那么就会产生一个错误结果

  语法

pathchk(选项)(参数)

  选项

-p:检查大多数的POSIX系统;
-P:检查空名字和“-”开头的文件; 
--portability:检查所有的POSIX系统,等同于“-P-p”选项; 
--help:显示帮助; 
--wersion:显示版本号。

  参数
   * 文件:带路经信息的文件
   * 后缀:可选参数,指定要去除的文件后缀字符串.


dd

  dd命令用于复制文件并对原文件的内容进行转换和格式化处理. dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果. 用的比较多的还是用dd来备份裸设备. 但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便.

  语法

dd(选项)

  选项

bs=<字节数>:将ibs(输入)与obs(输出)设成指定的字节数; 
cbs=<字节数>:转换时,每次只转换指定的字节数; 
conv=<关键字>:指定文件转换的方式; 
count=<区块数>:仅读取指定的区块数; 
ibs=<字节数>:每次读取的字节数; 
obs=<字节数>:每次输出的字节数; 
of=<文件>:输出到文件; 
seek=<区块数>:一开始输出时,跳过指定的区块数; 
skip=<区块数>:一开始读取时,跳过指定的区块数; 
--help:帮助; 
--version:显示版本信息
# 将一个文件转换为大写:
dd if=$filename conv=ucase > $filename.uppercase
#                    lcase      转换为小写.

例:一个拷贝自身的脚本.

#!/bin/bash
# self-copy.sh

file_subscript=copy

dd if=$0 of=$0.$file_subscript 2>/dev/null

exit $?

运行:

bash$ ls
self-copy.sh

bash$ ./self-copy.sh
bash$ ls
self-copy.sh self-copy.sh.copy

od

  od命令用于输出文件的八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符.

  语法

od (选项)(参数)

  选项

-a:此参数的效果和同时指定“-ta”参数相同; 
-A:<字码基数>:选择以何种基数计算字码; 
-b:此参数的效果和同时指定“-toC”参数相同; 
-c:此参数的效果和同时指定“-tC”参数相同; 
-d:此参数的效果和同时指定“-tu2”参数相同; 
-f:此参数的效果和同时指定“-tfF”参数相同; 
-h:此参数的效果和同时指定“-tx2”参数相同; 
-i:此参数的效果和同时指定“-td2”参数相同; 
-j<字符数目>或--skip-bytes=<字符数目>:略过设置的字符数目; 
-l:此参数的效果和同时指定“-td4”参数相同; 
-N<字符数目>或--read-bytes=<字符数目>:到设置的字符树目为止; 
-o:此参数的效果和同时指定“-to2”参数相同; 
-s<字符串字符数>或--strings=<字符串字符数>:只显示符合指定的字符数目的字符串; 
-t<输出格式>或--format=<输出格式>:设置输出格式; 
-v或--output-duplicates:输出时不省略重复的数据; 
-w<每列字符数>或--width=<每列字符数>:设置每列的最大字符数; 
-x:此参数的效果和同时指定“-h”参数相同; 
--help:在线帮助; 
--version:显示版本信息.

  参数
  文件:指定要显示的文件.

  实例

bash$ echo abcdef g > tmp
bash$ cat tmp
abcdef g

bash$ od -b tmp                # 使用单字节八进制解释进行输出.
0000000 141 142 143 144 145 146 040 147 012
0000011

bash$ od -c tmp                # 使用ASCII码进行输出,包括转义字符.
0000000   a   b   c   d   e   f       g  \n
0000011

bash$ od -t d1 tmp         # 使用单字节十进制进行解释.
0000000   97   98   99  100  101  102   32  103   10
0000011

bash$ od -A d -c tmp       # 设置地址格式为十进制.
0000000   a   b   c   d   e   f       g  \n
0000009

bash$ od -A x -c           # 设置地址格式为十六进制
000000   a   b   c   d   e   f       g  \n
000009

bash$ od -j 2 -c tmp       # 跳过开始的两个字节.
0000002   c   d   e   f       g  \n
0000011

bash$ od -N 2 -j 2 -c tmp  # 跳过开始的两个字节,并且仅输出两个字节.
0000002   c   d
0000004

bash$ od -w1 -c tmp            # 每次仅输出一个字节.
0000000   a
0000001   b
0000002   c
0000003   d
0000004   e
0000005   f
0000006    
0000007   g
0000010  \n
0000011

bash$ od -w2 -c tmp            # 每次输出两个字节.
0000000   a   b
0000002   c   d
0000004   e   f
0000006       g
0000010  \n
0000011

bash$ od -w3 -b tmp            # 每行输出3个字节,并使用八进制单字节进行解释.
0000000 141 142 143
          a   b   c
0000003 144 145 146
          d   e   f
0000006 040 147 012
              g  \n
0000011

hexdump

  对二进制文件进行 16进制, 8进制, 10进制, 或者ASCII码的查阅动作. 这个命令大体上与上边的od命令的作用相同, 但是远没有od命令有用.


objdump

  显示编译后的二进制文件或二进制可执行文件的信息, 以16进制的形式显示, 或者显示反汇编列表(使用 -d 选项).

bash$ objdump -d /bin/ls
...
Disassembly of section .fini:

0000000000413c8c <_fini@@Base>:
  413c8c:   48 83 ec 08             sub    $0x8,%rsp
  413c90:   48 83 c4 08             add    $0x8,%rsp
  413c94:   c3                      retq   

mcookie

  这个命令会产生一个”magic cookie”, 这是一个128-bit(32-字符)的伪随机16进制数字, 这个数字一般都用来作为X server的鉴权”签名”

  格式用法

mcookie[options]

  主要参数

-f, --file <file>   设定种子文件.
-v, --verbose       显示详细运行信息.
-V, --version       显示版本信息.
-h, --help          显示帮助信息.
random=$(mcookie)

units

  这个工具用来在不同的计量单位之间互相转换. 当你在交互模式下正常调用时, 会发现在脚本中units命令也是非常有用的.


m4

  m4是一个强大的宏处理过滤器,差不多可以说是一种语言了.

例:使用m4.

#!/bin/bash
# m4.sh: 使用m4宏处理器.

# 字符串操作.
string=abcdA01
echo "len($string)" | m4                       # 7
echo "substr($string,4)" | m4                  # A01
echo "regexp($string,[0-1][0-1],\&Z)" | m4     # 01Z

# 算术操作.
echo "incr(22)" | m4                            # 23
echo "eval(99 / 3)" | m4                        # 33

exit 0 

doexec

  doexec命令允许将一个随便的参数列表传递到一个 二进制可执行文件中.

  比较特殊的, 甚至可以传递 argv[0] (相当于脚本中的$0), 这样就可以使用不同的名字来调用这个可执行文件, 并且通过不同的调用名字, 还可以让这个可执行文件执行不同的动作. 这也可以说是一种将参数传递到可执行文件中的比较绕圈子的做法.


dialog

  dialog工具集提供了一种从脚本中调用交互对话框的方法. dialog更好的变种版本是 –gdialog, Xdialog, 和kdialog – 事实上是调用X-Windows的界面工具集.


sox

  sox命令, 也就是” sound e x change”命令, 可以进行声音文件的转换. 事实上, 可执行文件 /usr/bin/play (现在不建议使用)只不过是 sox 的一个shell包装器而已.

sox soundfile.wav soundfile.au
#将会把一个WAV文件转换成(Sun音频格式)AU声音文件.

<think>好的,我现在需要帮助用户解决在VPP中调试基于原始目的IP进行报文过滤的问题。首先,我得回忆一下VPP的相关知识,以及eBPF在其中的应用。用户提到了使用debug方法,可能需要检查配置、日志、或者使用特定的工具。 首先,VPP(Vector Packet Processing)是一个高性能的网络数据包处理框架,常用于路由和交换。报文过滤通常涉及ACL(访问控制列表)或者分类器(classifier)的设置。用户想根据原始目的IP来过滤报文,这可能是在ACL中配置了匹配目的IP的规则,但实际没有生效,需要调试。 接下来,我需要考虑VPP的调试方法。根据之前的引用内容,eBPF可以与VPP结合使用,比如在Tc-bpf或XDP中进行数据包处理。可能用户的应用场景涉及这些技术。例如,使用eBPF程序来过滤报文,并通过BPF工具进行调试。 用户的问题中提到“debug 原始目的IP过滤报文”,所以步骤可能包括检查配置是否正确、查看日志、使用trace工具、或者利用eBPF的调试功能。比如,使用bpf_trace_printk()输出调试信息,但根据引用[1],这个函数有三个限制,可能不够好,建议使用BPF_PERF_OUTPUT()。不过,VPP本身可能有自己的调试机制,比如CLI命令或者日志文件。 另外,引用[2]提到eBPF的应用场景包括网络数据面编程,比如XDP和Tc-bpf,这可能与VPP的报文处理相关。如果用户在使用eBPF程序进行过滤,可能需要检查eBPF代码是否正确,是否加载成功,以及是否有日志输出。 可能的步骤包括: 1. 确认ACL或分类器配置是否正确,是否应用到了正确的接口。 2. 使用VPP的CLI命令查看配置和统计信息,比如show acl-plugin acl,show interface等。 3. 启用VPP的调试日志,调整日志级别,查看是否有相关错误信息。 4. 如果使用eBPF,检查eBPF程序的编译和加载,使用bpftool等工具查看加载的程序和map。 5. 利用trace_pipe或perf工具查看eBPF程序的输出,但需要注意引用[1]提到的限制,可能需要改用BPF_PERF_OUTPUT()来获取更清晰的日志。 6. 抓包验证,使用tcpdump或VPP内置的抓包功能,确认报文是否被正确过滤。 此外,可能需要考虑VPP的版本以及对应的eBPF支持情况,不同的版本可能在配置方式或工具链上有所不同。比如,是否支持XDP或Tc-bpf,对应的CLI命令是否有变化。 用户可能遇到的常见问题包括配置错误(比如ACL规则未应用到接口)、eBPF程序逻辑错误、日志信息不足等。需要指导用户逐步排查这些可能性,使用VPP和Linux工具进行验证。 最后,生成相关问题时要围绕VPP调试、eBPF在VPP中的应用、报文过滤方法等,帮助用户深入理解相关技术。</think>### 如何在VPP中调试基于原始目的IP的报文过滤 #### 1. **确认ACL/分类器配置** - **检查规则语法**:确保ACL规则中目的IP字段的格式正确(例如IPv4/IPv6地址掩码)。例如,在VPP CLI中配置ACL规则: ``` acl-plugin add permit ip dst 192.168.1.0/24 ``` - **绑定到接口**:确认ACL已应用到正确的接口: ``` set acl-plugin acl <acl-index> intfc <interface-name> [in|out] ``` - **查看配置状态**:使用命令`show acl-plugin acl`和`show acl-plugin interfaces`验证规则和绑定关系[^2]。 #### 2. **启用VPP调试日志** - **调整日志级别**:通过VPP CLI动态修改日志级别以捕获过滤事件: ``` logging set debug acl-plugin ``` - **查看日志文件**:默认日志路径为`/var/log/vpp/vpp.log`,过滤关键字如`acl-plugin`或`drop`定位报文丢弃记录。 #### 3. **使用Packet Trace功能** - **开启报文追踪**:在VPP CLI中启用trace并发送测试报文: ``` trace add dpdk-input <n> # 捕获前n个报文 ``` - **触发过滤行为**:通过`ping`或其他工具生成目标IP的流量。 - **分析Trace结果**:执行`show trace`查看报文处理路径,检查是否命中ACL规则或被错误转发。 #### 4. **结合eBPF程序调试(如使用XDP/Tc)** - **编译eBPF程序**:确保过滤逻辑包含目的IP匹配,例如: ```c if (ipv4->daddr == target_ip) { bpf_trace_printk("Matched dest IP: %x\\n", ipv4->daddr); return XDP_DROP; } ``` - **加载并验证**:使用`ip link`或`bpftool`加载eBPF程序到指定接口: ``` ip link set dev <interface> xdp obj filter.o ``` - **查看eBPF调试输出**:通过`cat /sys/kernel/debug/tracing/trace_pipe`捕获`bpf_trace_printk`的输出(需注意共享buffer可能混杂其他日志)[^1]。 #### 5. **抓包验证** - **VPP内置抓包**:使用`pcap dispatch trace on`生成`.pcap`文件,通过Wireshark分析报文是否被正确过滤。 - **外部抓包工具**:在物理接口或虚拟接口(如veth pair)上运行`tcpdump -i <interface> host <target-ip>`,确认过滤行为是否符合预期。 #### 6. **性能与保序检查(高阶)** - 若需高性能日志记录,可替换`bpf_trace_printk`为`BPF_PERF_OUTPUT`,通过用户态程序接收事件(需编写对应解析逻辑)[^1]。 - 使用`ring buffer`(Linux 5.8+)替代传统buffer,避免多CPU场景下的日志乱序问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值