小编iga*_*gal的帖子

如何以编程方式检测 awk 风味(例如 gawk 与 nawk)

我正在使用一个命令行应用程序,它本质上是一个 bash shell 脚本的集合。该应用程序被编写为在 BSD/OSX 和 Linux 上运行。其中一个脚本依赖于 awk。它包含两个 awk 命令:一个是为 nawk(标准 BSD awk 实现)编写的,另一个是为 gawk(GNU awk 实现)编写的。

有问题的两个 awk 命令不能与不同的环境交叉兼容;特别是当使用 gawk 运行时,nawk 命令会失败。该脚本检查内核名称(即uname -s)以确定主机环境,然后运行适当的 awk 命令。但是,我更喜欢在安装了 GNU 核心实用程序的 Mac OS X 上工作,因此脚本无法正确运行。

在考虑如何最好地修复这个错误的过程中,我想到知道如何以编程方式区分不同风格的常见命令行实用程序会很好,最好以相对健壮和可移植的方式。

我注意到 nawk 不接受 '-V' 标志来打印版本信息,所以我想像下面这样的东西应该可以工作:

awk -V &>/dev/null && echo gawk || echo nawk
Run Code Online (Sandbox Code Playgroud)

另一种变化可能是:

awk -Wversion &>/dev/null && echo gawk || echo nawk
Run Code Online (Sandbox Code Playgroud)

这似乎适用于我的两个测试环境(OS X 和 CentOS)。以下是我的问题:

  • 这是最好的方法吗?
  • 有没有办法扩展它来处理 awk 的其他变体(例如 mawk、jawk 等)?
  • 是否值得担心其他版本的 awk?

我还应该提到我对 awk 知之甚少。

awk shell-script portability

10
推荐指数
2
解决办法
2809
查看次数

恢复 '。' 或“来源”

我不小心从脚本中获取了错误的环境。有什么方法可以“取消”它,或者换句话说,可以恢复它并恢复以前的环境?

当然,显而易见的答案是从干净的 shell 会话开始,但我很好奇是否有其他解决方案。

更新:我指的只是一个设置一些变量的脚本。

shell bash zsh shell-script

7
推荐指数
1
解决办法
2052
查看次数

通过 veth 接口对连接两个网络命名空间,其中每个端点都具有相同的名称

是否有一个(简单的)命令可以创建一个 veth 接口对并将每个接口分配给不同的网络命名空间?

例如,假设我有两个命名空间:mynamespace-1mynamespace-2. 是否有一个(简单的)命令可以通过一个接口的每个端点都被命名的 veth 对来连接这两个命名空间eth0

目前我要做的是创建 veth 对,将每个接口移动到相应的命名空间,然后从该命名空间内重命名接口。我想知道这三个命令是否可以压缩成一个命令。

对于上下文,以下是我当前如何连接一对命名空间并测试连接的示例:

# Create two network namespaces
sudo ip netns add 'mynamespace-1'
sudo ip netns add 'mynamespace-2'

# Create a veth virtual-interface pair
sudo ip link add 'myns-1-eth0' type veth peer name 'myns-2-eth0'

# Assign the interfaces to the namespaces
sudo ip link set 'myns-1-eth0' netns 'mynamespace-1'
sudo ip link set 'myns-2-eth0' netns 'mynamespace-2'

# Change the names of the interfaces (I prefer to use …
Run Code Online (Sandbox Code Playgroud)

networking iproute network-namespaces

6
推荐指数
1
解决办法
6876
查看次数

如何对日期范围内的所有日志文件进行分类

我有按以下方式命名的日志文件:

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt
Run Code Online (Sandbox Code Playgroud)

换句话说,每个日志文件都具有以下形式:

localhost_log_file.YYYY-MM-DD.txt
Run Code Online (Sandbox Code Playgroud)

我想猫的所有的2017年9月3日和2017年10月8日的日期之间所采取的日志文件,即从开始的每个日志文件localhost_log_file.2017-09-03.txt通过localhost_log_file.2017-10-08.txt

目前我所做的是通过分别执行以下每个命令来生成三个中间文件:

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt
Run Code Online (Sandbox Code Playgroud)

然后我将中间文件组合如下:

localhost_log_file.YYYY-MM-DD.txt
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

linux csv cat

5
推荐指数
2
解决办法
7044
查看次数

iptables NAT 规则的隐式逆向

iptables 是否隐式自动为每个显式添加的 NAT 规则添加反向/反向规则?

通常,假设采用 DROP 策略,对于过滤器表中的每个 INPUT 规则,都有一个相应的 OUTPUT 规则,该规则接受相关或已建立的流量(反之亦然)。例如,要使入站 SSH 能够通过 iptables 防火墙,需要有一条 INPUT 规则来允许建立传入连接:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

但也会有相应的 OUTPUT 规则允许返回流量:

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

虽然这种显式反向流量规则在过滤表中是必要的,但对于 NAT 表来说似乎并非如此。

请考虑以下各种非官方参考文献的摘录:

  1. 数字海洋:深入探讨 Iptables 和 Netfilter 架构

某些事件将导致处理期间跳过表的链。例如,只有连接中的第一个数据包才会根据 NAT 规则进行评估。对第一个数据包所做的任何 nat 决策都将应用于连接中的所有后续数据包,无需额外评估。对 NAT 连接的响应将自动应用反向 NAT 规则以正确路由。

  1. SuperUser:NAT 前向链中规则的内部工作

但netfilter(即作为iptables“引擎”的数据包过滤/修改框架)足够智能。每当收到传入的 [NAT] 数据包时,它都会与 netfilter 的 conntrack 表进行匹配。如果数据包是对现有传出连接的回复(ACK 标志设置、匹配 IP:端口、匹配 TCP …

networking iptables nat

5
推荐指数
1
解决办法
4026
查看次数

如果未指定公钥,`ssh-keygen -r`会做什么?

简短的问题

我假设ssh-keygen -r hostname使用默认公钥。我本以为它会默认为~/.ssh/id_rsa.pub,但事实似乎并非如此。那么它做什么呢?

长版

我使用 OpenSSH 命令行实用程序的经验是,它们要么提示用户输入任何缺少的参数,要么回退到标准默认值。但ssh-keygen -r事实似乎并非如此。当我运行ssh-keygen -r命令而不指定公钥(例如ssh-keygen -r hostname)时,我得到以下输出:

no keys found.
Run Code Online (Sandbox Code Playgroud)

我希望它默认为我的公钥,例如~/.ssh/id_rsa.pub. 然而,情况似乎并非如此,因为当我显式传递此公钥时(例如ssh-keygen -r hostname -f ~/.ssh/id_rsa.pub),我得到以下形式的输出:

hostname IN SSHFP 1 1 5d6c87ef4e8f4f59974f05723ff3dc0cffc9c4b4
hostname IN SSHFP 1 2 8fa151e7f3ba43fa89c240ab236f0313aea1fe9f9e9f4e5b8f084ca0008399ed
Run Code Online (Sandbox Code Playgroud)

此外,手册页ssh-keygen显示了该命令的以下语法ssh-keygen -r

ssh-keygen -r hostname [-f input_keyfile] [-g]
Run Code Online (Sandbox Code Playgroud)

由于该-f input_keyfile标志被表示为可选,因此我希望ssh-keygen做一些除了打印错误消息之外的事情。

那么,如果ssh-keygen -r hostname不用作~/.ssh/id_rsa.pub其默认公钥,并且它不提示用户指定公钥,那么它在做什么?是否默认为其他路径?如果有的话,那是什么路?

注意:我在 macOS High …

ssh openssh ssh-keygen

5
推荐指数
1
解决办法
3717
查看次数

sudo pgrep -f 匹配任意字符串并返回递增的 pids

在调试相关问题时,我注意到 pgrep 正在为看似任意的命令行模式返回一个 PID,例如:

$ sudo pgrep -f "asdf"
13017

$ sudo pgrep -f ";lkj"
13023

$ sudo pgrep -f "qwer"
13035

$ sudo pgrep -f "poiu"
13046

$ sudo pgrep -f "blahblahblah"
14038

$ sudo pgrep -f "$(pwgen 16 1)"
14219
Run Code Online (Sandbox Code Playgroud)

没有 sudo 的相同命令没有返回任何内容(如预期):

$ pgrep -f blahblahblah
Run Code Online (Sandbox Code Playgroud)

我试图通过管道将 PID 传递给 ps 以查看命令是什么,但这不起作用:

$ sudo pgrep -f blahblahblah | xargs ps -f -p
UID        PID  PPID  C STIME TTY          TIME CMD
Run Code Online (Sandbox Code Playgroud)

看起来进程终止得太快了。然后我尝试使用 ps 和 grep,但这也不起作用(即没有结果):

$ sudo ps -e …
Run Code Online (Sandbox Code Playgroud)

linux process ps proc

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

通过网络接口文件设置网关地址

这是我的问题的删节版本:为什么gateway在我的网络接口文件中设置参数对我的网络接口没有影响?

或者,为什么post-up命令在失败的地方起作用gateway以及设置gateway参数到底应该做什么?

这是我的问题的详细描述。

/etc/network/interfaces考虑运行 Debian 的 VirtualBox VM 上的以下网络接口配置文件 ( ):

# /etc/network/interfaces

# Original file

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface (NAT)
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

# Host-only interface (vboxnet0)
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 192.168.56.2
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255
gateway 192.168.56.1
Run Code Online (Sandbox Code Playgroud)

当我启动机器并运行时,route -n我得到以下输出:

Kernel IP routing table …
Run Code Online (Sandbox Code Playgroud)

networking debian virtualbox network-interface ifconfig

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

删除 unix .csv 文件中的所有类型的特殊字符

我正在处理来自包含特殊字符的源的大量 CSV 数据流,例如:

`÷ Þ Ÿ ³ Ù ÷`
Run Code Online (Sandbox Code Playgroud)

以下是包含这些字符的数据集中的示例行:

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'
Run Code Online (Sandbox Code Playgroud)

这是另一个取自不同数据集的示例:

WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,H??F0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,99??99
WCD42,2013-06-04 20:06:24,2013-06-04,DVDMINUSRW,MainICTest,PASS,USA,HF0SXV1,,??,N,9999
WCP09,2013-06-05 01:52:53,2013-06-05,CPU,SSE3Test,PASS,,?÷ÞQ»,,,N,9999
WCP10,2013-06-05 01:52:53,2013-06-05,CPU,SSE4_1Test,PASS,,?÷ÞQ»,,,N,9999
Run Code Online (Sandbox Code Playgroud)

如果我知道期望什么类型的字符,那么我可以在读取文件时在Informatica 中处理它。

但在我的情况下,我不确定在任何一天我会得到什么类型的数据,因此我的工作失败了。所以我需要一种方法来从数据中删除所有特殊字符。

special-characters escape-characters

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

iptables 无法阻止本地 ssh 连接

这是我的问题:为什么 iptables 无法阻止 SSH 连接到 localhost?

更详细的描述如下。

在 iptables 的实验过程中,我遇到了以下我想了解的好奇心。即使我将每个策略都设置为 DROP,我仍然可以通过 SSH 在本地访问机器。

这就是我正在做的事情。

首先,我使用iptables将所有 POLICY 值设置为 DROP:

cat <<HEREDOC | sudo iptables-restore

*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
COMMIT

*mangle
:PREROUTING DROP
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
:POSTROUTING DROP
COMMIT

*nat
:PREROUTING DROP
:POSTROUTING DROP
:OUTPUT DROP
:INPUT DROP
COMMIT

*raw
:PREROUTING DROP
:OUTPUT DROP
COMMIT
HEREDOC
Run Code Online (Sandbox Code Playgroud)

然后我尝试通过 SSH 连接:

ssh localhost
Run Code Online (Sandbox Code Playgroud)

而且,令我惊讶的是,这有效!我看到了一个新的 shell 会话,就好像没有防火墙一样。作为健全性检查,我然后尝试 ping localhost,这会导致以下错误消息:

ping: sendmsg: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

这似乎表明防火墙实际上是可操作的。最后我尝试使用 IP 地址进行 …

networking ssh iptables

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

提取特定 XML 元素类型的子元素

给定一个特定的 XML 元素(即特定的标记名称)和一段 XML 数据,我想从该元素的每次出现中提取子元素。更具体地说,我有以下(不太有效的)XML 数据片段:

<!-- data.xml -->

<instance ab=1 >
    <a1>aa</a1>
    <a2>aa</a2>
</instance>
<instance ab=2 >
    <b1>bb</b1>
    <b2>bb</b2>
</instance>
<instance ab=3 >
    <c1>cc</c1>
    <c2>cc</c2>
</instance>
Run Code Online (Sandbox Code Playgroud)

我想要一个脚本或命令,它将这些数据作为输入并产生以下输出:

<a1>aa</a1><a2>aa</a2>
<b1>bb</b1><b2>bb</b2>
<c1>cc</c1><c2>cc</c2>
Run Code Online (Sandbox Code Playgroud)

我希望解决方案使用标准文本处理工具,例如sedawk

我尝试使用以下sed命令,但没有奏效:

sed -n '/<Sample/,/<\/Sample/p' data.xml
Run Code Online (Sandbox Code Playgroud)

xml sed awk text-processing ctags

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

FHS 中 &lt;qual&gt; 代表什么?

Linux FHS(文件系统层次结构标准)是指以下形式的目录:

/lib<qual>
Run Code Online (Sandbox Code Playgroud)

它对此类目录的描述如下:

在支持多种需要单独库的二进制格式的系统上,/lib 目录可能有一种或多种变体。

同样,它指的是目录:

/usr/lib<qual>
Run Code Online (Sandbox Code Playgroud)

并将它们描述为:

对于备用二进制格式,/usr/lib 执行与 /usr/lib 相同的角色,但不需要符号链接 /usr/lib/sendmail 和 /usr/lib/X11。

FHS维基百科文章为这些目录提供了以下替代描述:

/lib<qual>

替代格式基本库。此类目录是可选的,但如果存在,则有一些要求。

/usr/lib<qual>

备用格式库,例如 64 位计算机上的 32 位库的 /usr/lib32(可选)。

我假设该字符串<qual>是某种东西的助记符。是吗?如果是的话,它代表什么?

linux fhs

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