AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-210810

Binarus's questions

Martin Hope
Binarus
Asked: 2025-03-21 16:44:14 +0800 CST

为什么 Windows 11 可以在 CPU 类型为 qemu64 的 Qemu 中运行?

  • 6

我不确定这个问题是与 Linux 还是 Windows 相关。不过,我们可以继续:

在具有两台 Xeon E5-2690v3 的服务器上使用qemu-system-x86_64 7.2.15带有内核的 D​​ebian bookworm ,我创建了第一个运行 Windows 11 的虚拟机。安装介质包含 Windows 11 Pro 21H2。6.1.0 / amd64

这次安装最初失败是因为虚拟机硬件中缺少 TPM 2.0 模块。感谢这个网站和其他人的帮助,这个问题并不难解决(安装swtpm相关组件,并稍微扩展一下 Qemu 命令行)。按照这些步骤操作后,Windows 11 安装顺利。如上所述,这是 21H2 版本。

在安装过程中,Qemu 已经-cpu host。也就是说,Windows 11 使用 Xeon E5-2690v3 CPU 自行安装。

然后,虚拟机开始安装更新。当我尝试将 Windows 11 功能升级到 23H2 版本时,它提示升级失败,原因是 CPU 与 Windows 11 不兼容。没错,确实如此:首先,它在该 CPU 上顺利安装,然后由于 CPU 不兼容,更新失败了。

由于我需要该虚拟机的最新版本,我在 Qemu 中对各种 CPU 类型进行了多次测试。除了一个例外,其他所有测试都失败了:如果我设置了-cpu qemu64,更新就会成功。

虽然我很高兴(当然),但我真的很想知道它为什么有效。我多次研究过与 Windows 11 兼容的英特尔 CPU 列表,但没有看到类似的条目。AMD CPU 列表qemu64也是如此。

因此问题是:为什么-cpu qemu64即使此 CPU 不在受支持的 CPU 列表中,Windows 11 也可以运行?

windows
  • 1 个回答
  • 81 Views
Martin Hope
Binarus
Asked: 2024-11-17 19:19:45 +0800 CST

如何自动旋转矩形图像区域几度,使其左边框垂直(使用命令行工具,如 imagemagick)

  • 7

我有几千张图像,其主要特征如附图所示:所有图像都在(几乎)黑色的框架中,而实际图像内容几乎总是在白色背景上。

现在我想旋转实际图像内容,使该内容的左边框垂直。然后我想裁剪(修剪)图像,以便丢弃黑色边框,但完全保留实际内容。也就是说,即使包含实际内容的区域不是完美的矩形,也必须保留该区域的所有内容,这意味着之后黑色边框的剩余部分仍然可见。

考虑到我想要以这种方式处理的图像数量,我想我必须使用命令行工具来完成。过去,我曾使用 ImageMagick 完成此类工作(进行更简单的转换),但我真的不介意结合使用几种不同的工具来完成这项任务。

我已经尝试过的:

我研究过如何对图像进行倾斜校正,这种方法大多数时候都有效。但是,我发现的倾斜校正方法是将文本行设为水平。这很好,因为它使阅读更容易,但当然在大多数情况下,保存文本的区域的边框之后不会分别垂直或水平。这不是我想要的。

为了更详细地解释,我想:

  1. 检测黑框和包含实际图像内容的区域之间的左边缘。
  2. 沿着该边缘画一条(不可见的)直线。
  3. 确定该线与垂直线之间的角度。
  4. 将整个图像旋转该角度(负数),使得步骤 1 中的边缘变为垂直。
  5. 修剪图像,丢弃尽可能多的黑色框架,但保留包含实际内容的完整区域(因此,如果该区域不是完美的矩形,则接受保留黑色框架的其余部分)。

有人可以解释一下如何做到这一点吗,最好使用命令行工具?

在此处输入图片描述

imagemagick
  • 3 个回答
  • 44 Views
Martin Hope
Binarus
Asked: 2023-08-03 06:13:13 +0800 CST

这两个 blockdev 声明有什么区别?

  • 5

在 Debian bullseye 中,我通过命令行使用 QEMU / KVM 启动虚拟机(即,没有virsh或其他帮助器 / 包装器)。其中一个虚拟机从声明如下的块设备启动:

-blockdev driver=file,node-name=q1,filename=/dev/loop0 \

就在今天,我无意中注意到 QEMU 在启动该 VM 时发出以下警告:

Opening a block device as a file using the 'file' driver is deprecated

一些研究表明这个警告是已知的,并且有解决方案,例如@Stephen Kitt在这里接受的答案提出了以下blockdev声明:

-blockdev node-name=q1,driver=raw,file.driver=host_device,file.filename=/dev/loop0 \

这个解决方案无疑是有效的,但我找不到任何有关file.driver=host_device. 因此,我测试了一些其他选项,并得出了以下似乎也有效的解决方案:

-blockdev driver=host_device,node-name=q1,filename=/dev/loop0 \

有人可以简单解释一下这两个声明之间的区别吗?值得注意的是,其中一个在延迟或吞吐量方面是否会优于另一个?

作为一个额外的问题,有人知道文档在哪里吗host_device?在上面链接的其他问题/答案中,有一个指向可能实现该驱动程序的提交的链接。但是,我也找不到该链接背后的任何文档。

qemu
  • 1 个回答
  • 21 Views
Martin Hope
Binarus
Asked: 2023-04-06 00:05:32 +0800 CST

在 >&N 中,为什么 N 被视为文件描述符而不是文件名(正如手册中所说的那样)?

  • 10

我正在努力理解 bash 中的 IO 重定向。我见过很多像下面这样的例子(从字面上取自这里接受的答案):

exec 3<> /tmp/foo  #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.

第二行没看懂 准确地说,我不明白它的行为如何符合 bash 手册。

显然,在第二行中,>&3应该重定向stdout(可能stderr——我不知道)到文件描述符 3;其他一切都没有任何意义。

但是从当前的 bash 手册(在撰写本文时),第 3.6.4 节(格式化我的):

此构造允许将标准输出(文件描述符 1)和标准错误输出(文件描述符 2)重定向到名称为 word 扩展的文件。 重定向标准输出和标准错误有两种格式:
&>word和>&word

[ 然后它解释了第一种格式和第二种格式之间的细微差别,但让我们暂时搁置一下,因为它对问题并不重要。]

据我了解,这表示>&3重定向stderrandstdout到名称为 的文件3,这与重定向stdout(并且可能stderr)到文件描述符完全不同3。

有人能解释一下我错过了什么吗?

bash
  • 1 个回答
  • 726 Views
Martin Hope
Binarus
Asked: 2023-03-31 16:06:03 +0800 CST

OpenSSH 日志记录中“关键选项:代理转发”的含义

  • 5

首先,我想指出,我知道还有很多关于 SSH 代理转发的其他问题。那里的人想知道如何使代理转发工作或如何安全地配置它。但我有相反的问题:似乎我无法可靠地禁用它。所以我们开始:

我正在运行一个 Debian bullseye 系统,在撰写本文时是最新的,基本上是 vanilla。在该系统上,SSH 守护进程正在运行,其中配置如下/etc/ssh/sshd_config:

AcceptEnv LANG LC_*
AllowAgentForwarding no
AllowTcpForwarding no
AllowStreamLocalForwarding no
ChallengeResponseAuthentication no
Ciphers [email protected],[email protected]
Compression no
DebianBanner no
HostKeyAlgorithms rsa-sha2-512,ssh-ed25519
KbdInteractiveAuthentication no
KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group-exchange-sha256
ListenAddress aaa.bbb.ccc.ddd
LoginGraceTime 20
MACs [email protected],[email protected]
PasswordAuthentication no
PermitUserRC no
Protocol 2
# The first of the following version is the right one.
# However, for brain-dead WinSCP, we need the second version.
#PubkeyAcceptedKeyTypes rsa-sha2-512,rsa-sha2-256,ssh-ed25519
PubkeyAcceptedKeyTypes rsa-sha2-512,rsa-sha2-256,ssh-ed25519,ssh-rsa
RekeyLimit 100M 20m
Subsystem sftp /usr/lib/openssh/sftp-server

Match user copyremote
  ChrootDirectory /backup
  ForceCommand /usr/lib/openssh/sftp-server

这是完整的配置文件;除了它侦听的 IP 地址外,没有任何内容被删除或混淆。此外,没有其他地方包含 SSH 守护进程的额外配置片段。

基本上,该配置试图关闭我不需要的所有功能,例如代理转发功能(注意:在该配置文件中,我没有为默认关闭的大多数功能添加行(根据手册))。我们还看到身份验证完全基于公钥。

前几天,我正在调查用户copyremote和 sftp 子系统的问题,因此将-v其作为参数提供给sftp客户端计算机。这导致以下输出(仅显示相关部分):

root@morn ~/scripts # sftp -v -i ~/.ssh/id_rsa_backup_user [email protected]:/backup/achilles.bsdtar.gz .
OpenSSH_8.4p1 Debian-5+deb11u1, OpenSSL 1.1.1n  15 Mar 2022
[...]
debug1: Remote: /home/usr/copyremote/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: Remote: /home/usr/copyremote/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
[...]

现在这很可怕。我以为我在服务器上的系统范围配置文件中全局关闭了代理转发。但是,据我了解该输出,它提供了它。

谁能解释一下我如何在全球范围内关闭代理转发(以及我不希望服务器提供的其他功能) ?

这些功能可以在文件中明确禁用authorized_keys,但如果有多个用户并且每个用户都接受多个公钥,那将非常容易出错并且需要大量工作,所以我真的更希望能够一次将其关闭地方。

这是服务器上authorized_keys用户的文件:copyremote

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDs6ku+LXaUBs....JFchhaoQ== me@client

里面没有什么特别的。值得注意的是,代理转发是不允许明确的。为什么它不应用系统范围配置中的设置呢?

PS 我知道 SSH / SFTP chroot 不提供我们期望的安全性。我已经在服务器上实施了进一步的措施来缓解这个问题,所以这里不需要讨论 :-)

openssh
  • 1 个回答
  • 55 Views
Martin Hope
Binarus
Asked: 2022-10-02 01:38:16 +0800 CST

如何让 Linux 为不同 PC 上的不同桥接设备生成不同的 MAC 地址?

  • 5

我刚刚将两台服务器从Debian 10 (Buster) 升级到Debian 11 (Bullseye)。之后,我再也无法通过网络联系到他们中的任何一个。经过一番调查,发现了以下问题:

两台机器都配置了桥接设备。显然,Debian 为桥接设备分配 MAC 地址的算法已经从 10 版本更改为 11 版本。升级后,第一台服务器上的桥接设备与第二台服务器上的桥接设备具有相同的 MAC 地址,这可以肯定以前不是这样。

那里的答案之一声称网桥是纯粹的内部设备,因此网桥的 MAC 地址无关紧要。然而,这显然是错误的。至少在我的情况下,来自两台机器的数据包都是以硬件源地址作为网桥的 MAC 地址发出的,并且两台机器上的网络端口只有在它们以网桥的 MAC 地址为目的地时才处理传入的数据包。

由于两台机器上的 MAC 地址相同,因此网络变得无法使用,这是完全合乎逻辑且可以理解的。

如何让 Debian 为不同机器上的网桥设备生成不同的 MAC 地址(甚至在同一台机器上,但这不是我的问题)?

debian bridge
  • 3 个回答
  • 484 Views
Martin Hope
Binarus
Asked: 2022-09-12 08:13:16 +0800 CST

在 nftables 中,如果相应的接口分配了多个 IP 地址,我们如何获取数据包进入的 IP 地址?

  • 1

2022 年 9 月 15 日更新:

事实证明,我试图实现的目标没有多大意义。因此,实际上这个问题应该被删除。但是,有一些非常有启发性的评论;因此,我暂时将其保留原样,并将有关其命运的决定留给社区。

原始问题:

我目前正在努力学习nftables并取得了一些进展。现在我有以下问题(如果问题很愚蠢,请多多包涵,但所有引用都链接到 wiki.netfilter.org,目前已关闭(我通常的运气:-)):

我有一个 IPv4 网络,其中包含一些客户端 PC 和正在运行的路由器/防火墙 PC nftables。路由器有两个IP地址,192.168.20.253和192.168.20.254。前者仅用于管理路由器(例如,SSH 守护程序正在该地址上侦听路由器),而后者是客户端应使用的网关地址。

在路由器的nftables规则集中,我希望能够区分传入的数据包(对于此类数据包,当(目标地址)实际上是.253时,我将只允许 SSH )和传入的数据包(对于此类数据包,我如果在本地网络之外,则只允许它们)。daddr.253.254daddr

.253如果和.254被分配给两个不同的接口,我知道如何实现这一点。但这种情况并非如此; 两个路由器 IP 地址都分配给同一个接口。

有人可以给我小费吗?我没有找到提示man nft。ip它提到了or之类的路由表达式nexthop,但这显然没有帮助。我是否需要创建两个接口(在同一个 NIC 上)并分配.253给其中一个和.254另一个?

nftables
  • 1 个回答
  • 104 Views
Martin Hope
Binarus
Asked: 2022-06-22 22:32:01 +0800 CST

如何防止内核访问 ext4 分区上的日志?

  • 2

我希望这不是一个重复的问题。我见过几个类似的问题,答案是将相应的设备或分区列入黑名单。但就我而言,我不能这样做(见下文)。说了这么多:

在 debian buster x64 主机上,我创建了一个 VM(基于 QEMU)。VM 在块设备分区上运行,比如说/dev/sdc1. 我已经在那个分区上安装了 debian 系统,基本上是这样的(省略了一些步骤):

#> mkfs.ext4 -j /dev/sdc1
#> mount /dev/sdc1 /mnt/target
#> debootstrap ... bullseye /mnt/target

然后我绑定挂载了必要的目录(/dev等/sys),chroot 到/mnt/target,完成了客户操作系统的安装并启动了虚拟机。

VM 首次启动时没有问题。但是随着每次 VM 重新启动,VM 都会出现更多问题,我在GRUB和initramfs提示下进行修复,直到无法再修复,因为显然ext4文件系统已损坏。

因为我最初认为我做错了什么,例如ext4在启动 VM 之前忘记卸载分区,所以我多次从头开始重复整个安装。结果在每种情况下都是一样的:几次重新启动后,ext4文件系统被严重损坏,我无法修复它。

偶然发现了这个问题的原因,但不知道如何解决这个问题。我注意到e2fsck拒绝在该分区上操作,声称它正在使用中,尽管它没有安装并且 VM 没有运行。进一步调查表明存在内核线程jbd2/sdc。

这意味着主机内核访问该分区/文件系统上的日志。当我启动 VM 时,来宾内核当然也会这样做。我几乎可以肯定文件系统的损坏是由于两个内核同时访问文件系统,特别是日志。

我该如何解决这个问题?

我无法将主机上的相应磁盘或相应分区列入黑名单,因为我需要将它们挂载到那里以准备或完成在 chroot 中的来宾操作系统安装。另一方面,似乎不可能在 VM 启动时告诉主机内核释放日志。

ext4在过去的几年里,我安装了很多虚拟机,完全相同的方式,但是在创建他们的文件系统时没有打开日志。因此,我对这些虚拟机没有这个问题。

编辑 1

如果相关,在挂载分区并 chroot 到其中以完成来宾操作系统安装时,我使用以下命令:

cd /mnt
mkdir target

mount /dev/sdc1 target

mount --rbind /dev target/dev
mount --make-rslave target/dev
mount --rbind /proc target/proc
mount --make-rslave target/proc
mount --rbind /sys target/sys
mount --make-rslave target/sys

LANG=C.UTF-8 chroot target /bin/bash --login

卸载时,我只是这样做

umount -R target

该umount命令不报告任何错误。

linux-kernel virtual-machine
  • 1 个回答
  • 57 Views
Martin Hope
Binarus
Asked: 2022-05-10 12:55:09 +0800 CST

参数扩展`${parameter#word}`没有按预期工作

  • 0

我目前正在尝试了解参数扩展,尤其是可以通过模式匹配删除部分参数值的不同形式。为了这个问题,让我们关注${parameter#word}扩展。

手册中的两个相关部分(man bash)(强调我的):

${parameter#word}
${parameter##word}
移除匹配的前缀模式。单词被扩展以产生一个模式,就像在路径名扩展中一样,并使用下面的模式匹配中描述的规则与参数的扩展值匹配。如果模式匹配参数值的开头,则扩展的结果是 删除了最短匹配模式('#'案例)或最长匹配模式(案例)的参数扩展值。'##'[...]

路径名扩展
分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符之一,则该单词被视为一个模式,并替换为按字母顺序排列的与该模式匹配的文件名列表(请参阅下面的模式匹配)。[...]

但是,请考虑终端会话的以下部分:

root@cerberus ~/scripts # mkdir test
root@cerberus ~/scripts # cd test
root@cerberus ~/scripts/test # touch foo
root@cerberus ~/scripts/test # String=foobar
root@cerberus ~/scripts/test # printf '%s\n' ${String#foo}
bar
root@cerberus ~/scripts/test # printf '%s\n' ${String#*}
foobar
root@cerberus ~/scripts/test #

我无法理解最后一个命令之后的输出。根据手册,*应该扩展为foo,因为foo是当前目录中的唯一文件;至少,这是我的“像路径名扩展一样产生模式”的概念。

因此,在这种情况下,printf '%s\n' ${String#*}应该给出与 相同的输出printf '%s\n' ${String#foo}。

显然,事实并非如此。我的误解在哪里?

bash
  • 2 个回答
  • 136 Views
Martin Hope
Binarus
Asked: 2022-04-23 01:43:20 +0800 CST

xargs -I# 显示意外行为 - 为什么?

  • -1

我想压缩某个目录中的一大堆文件夹,每个文件夹创建一个 zip 文件。为此,我使用以下命令:

$ find -maxdepth 1 -mindepth 1 -type d | xargs -I@ zip -r @.zip @

这按预期工作。

但是,偶然地,我注意到当我用作#替换字符串而不是@:

$ find -maxdepth 1 -mindepth 1 -type d | xargs -I# zip -r #.zip #

zip error: Invalid command arguments (cannot write zip file to terminal)

zip error: Invalid command arguments (cannot write zip file to terminal)

... and so on (the same message repeated for every folder)

#通常会打开评论,所以很明显这里出了问题。但我原以为命令行实际上会变成find -maxdepth 1 -mindepth 1 -type d | xargs -I,因为第一个(包括)第一个的所有内容#都是注释并且被剥离。

但是,它显然执行了zip命令。为什么?

bash find
  • 1 个回答
  • 27 Views
Martin Hope
Binarus
Asked: 2022-01-25 09:50:39 +0800 CST

使用 sudo,是否可以使用目标用户不在的目标组执行程序?

  • 7

请考虑使用标准安装和配置的 Linux 系统sudo;即root可以执行所有命令,以其他用户的身份,请考虑以下命令:

sudo -u user1 -g group1 some_program

当然,我希望some_program使用 EUIDuser1 和EGID执行group1。但是,我已经了解到只有当user1它实际上是group1;的成员时才有效。我真的应该man sudo更彻底地学习。-g从命令行选项的解释:

[...] 只要不使用 -P 选项,sudoers 策略就允许通过 -g 选项指定任何目标用户组。

这是非常不方便的。我经常将sudo其用于测试目的,尤其是当服务或程序在任意 UID 和 GID 下运行时,相应的用户不是相应组的成员。在这种情况下,在我可以使用 进行测试之前sudo,我必须让相应的用户成为相应组的成员,并且一定不要忘记在测试完成后恢复该操作。

因此问题是:是否有允许使用不匹配的任意 UID 和 GID 执行程序的root设置或sudo配置?我只对为所有程序、UID 和 GID提供通用机制的解决方案感兴趣。也就是说,将特定程序、UID 或 GID 的列表放入其中不是一种选择。/etc/sudoers

一种可能的解决方案可能是sudo允许这样做的替代策略提供者。但是,学习如何安装和配置它可能会非常困难,即使没有其他解决方案,我也不确定我是否会走这条路。此外,我目前还没有发现这样的东西。

更新 1 (2022-01-27)

有问题的系统运行 Debian buster,在撰写本文时已使用所有可用补丁进行了更新。未安装SELinux 。这是我的/etc/sudoers文件(只留下注释和空行):

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root    ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) ALL
ipupdate ALL = (root) NOPASSWD: /root/scripts/asterisk-external-ip

我目前认为最后一行与问题无关,我可能应该删除它以尽量减少分心。另一方面,我了解到,有时只是看似不重要的“为清楚起见而删除”的部分实际上导致了相应的错误。

sudo group
  • 1 个回答
  • 508 Views
Martin Hope
Binarus
Asked: 2022-01-25 01:31:32 +0800 CST

如果通过 sudo 执行 setuid 程序,有哪些有效权限?

  • 0

setuid我已经阅读了许多有关该位如何工作以及如何工作的问题和答案sudo,并且我想我已经理解了这些内容。

但是,如果该程序本身具有setuidbit set,我无法找出通过 sudo 执行程序时会发生什么。这个问题最好用一个例子来解释:

在有问题的系统上,有一个名为user1. 系统已sudo正确安装和配置,以便root用户可以按照他想要的任何不同用户执行程序。此外,有一个程序/usr/bin/exampleprog由root:wheeland 位拥有setuid并setgid设置:

root@morn ~ # dir /usr/bin/exampleprog
-rwsr-sr-x 1 root wheel 92K 2017-11-16 23:42 /usr/bin/exampleprog

现在我以 root身份登录并执行以下命令:

root@morn ~ # sudo -u user1 /usr/bin/exampleprog

那会发生什么?exampleprog是运行为user1(正如给定的选项所预期的那样sudo),还是以 root 运行(因为可执行文件归 root 所有并设置了它的位setuid)?

为了让事情变得更复杂,还有一个额外的程序/usr/bin/wrapper,也由 拥有,root:wheel但没有和位:setuidsetgid

root@morn ~ # dir /usr/bin/wrapper
-rwxr-xr-x 1 root wheel 15K 2017-11-16 23:42 /usr/bin/wrapper

程序在wrapper执行时,会在某个时候执行(生成)/usr/bin/exampleprog。

现在我执行:

root@morn ~ # sudo -u user1 /usr/bin/wrapper

wrapper生成时exampleprog,后者将作为user1还是作为root?

linux sudo
  • 1 个回答
  • 55 Views
Martin Hope
Binarus
Asked: 2022-01-24 02:11:35 +0800 CST

即使无法读取其配置文件,procmail 也会返回退出代码 0:如何防止?

  • 1

我是procmail第一次处理,所以如果以下问题很愚蠢,我深表歉意。在投入procmail生产之前,我正在做一些基本的测试。其中一个产生了一个完全出乎意料的结果,这使得它在我的场景中几乎毫无价值:

当procmail无法读取其配置文件时,它仍然会0在完成时将其退出代码设置为 (true)。这是灾难性的,因为在我的场景中,我使用procmail的是从内部执行的 MDA fetchmail。如果procmail无法读取其配置文件,则无法根据需要处理(传递)消息,而是0在完成时设置退出代码;fetchmail将此解释为成功传递并删除上游相应的消息。总之,这会导致这些消息丢失。

这种情况下的权限是相当复杂的(fetchmail++ over ,在自己的用户账户下运行,being and ,等等procmail),所以很可能有人在需要更改权限时犯了错误。由于上述问题,此类错误很可能导致消息丢失。cyrdeliverlmtpfetchmailprocmailsuidsetgid

因此,如果它无法读取其配置文件,我想知道如何以procmail失败退出(退出代码以外的代码)。0

要了解这是关于什么的,请考虑以下终端会话(删除了不相关的行)。请注意,配置目录中的所有权/权限是故意错误的,因为这是我的测试用例。

root@morn /etc/fetchmail # whoami
root

root@morn /etc/fetchmail # dir
total 52K
drwx------   2 fetchmail root 4.0K 2022-01-23 10:09 .
drwxr-xr-x 123 root      root  12K 2022-01-22 17:17 ..
-rw-------   1 fetchmail root 2.4K 2022-01-23 10:09 fetchmailrc
-rw-------   1 root      mail  282 2022-01-23 02:49 procmailrc
-rw-r--r--   1 root      root  110 2022-01-23 00:36 testmessage

root@morn /etc/fetchmail # dir `which procmail`
-rwsr-sr-x 1 root mail 92K 2017-11-16 23:42 /usr/bin/procmail
    
root@morn /etc/fetchmail # cat /etc/systemd/system/pp-fetchmail.service    
User=fetchmail
Group=mail
ExecStart=/usr/bin/fetchmail -f /etc/fetchmail/fetchmailrc --pidfile /run/fetchmail/fetchmail.pid --syslog

root@morn /etc/fetchmail # cat fetchmailrc
poll
pop3.example.com
proto pop3
bad-header accept
user "[email protected]"
ssl
pass "supersecret"
is "user1" here
no rewrite
mda "/usr/bin/procmail TARGET=user1 /etc/fetchmail/procmailrc"

root@morn /etc/fetchmail # cat testmessage
From: [email protected]
To: [email protected]
Subject: Test message

This is a test message.

root@morn /etc/fetchmail # sudo -u fetchmail -g mail /usr/bin/procmail /etc/fetchmail/procmailrc < testmessage && echo "procmail exited 0" 
procmail: Couldn't read "/etc/fetchmail/procmailrc"
procmail exited 0

当然,最后两行是问题所在。有谁知道如何规避它?当然,修复权限会使其正常工作,但这是我明确不要求的。我希望有一个更强大的解决方案,以防出现错误(我的或其他人的)。

linux debian
  • 2 个回答
  • 79 Views
Martin Hope
Binarus
Asked: 2021-10-12 03:56:10 +0800 CST

努力理解管道和子shell中的重定向:非常感谢代码解释

  • 2

请考虑来自终端会话(Debian Buster,Bash 5.0)的以下日志:

root@cerberus ~/scripts # rm -f result
root@cerberus ~/scripts # { { echo test; } | cat > result; }
root@cerberus ~/scripts # cat result
test
root@cerberus ~/scripts #

这里没什么特别的,这是预期的行为,我理解。

但我不理解以下情况下的行为:

root@cerberus ~/scripts # rm -f result
root@cerberus ~/scripts # { { echo test >&3; } | cat > result; } 3>&1
test
root@cerberus ~/scripts # cat result
root@cerberus ~/scripts #

准确地说,我相信我理解为什么在执行第二行时会输出“test”,但我不明白为什么结果文件中没有任何内容。我对发生的事情的理解如下:

  1. 首先,fd 3 被设置为stdout. 我确信这发生在管道执行之前,因为否则管道中的任何命令都无法访问 fd 3,这将导致“错误描述符”错误消息。

  2. 管道不是一个简单的命令,因此会产生一个子shell 来执行它。子shell 继承父shell 的执行环境,包括文件描述符和重定向。[1]

  3. 管道中的每个命令也在其自己的子 shell [2]中执行,再次继承执行环境和文件描述符。echo的输出被重定向到 fd 3,而 fd 3 又从之前被复制stdout,总之导致echo的输出出现在stdout(输出到 fd 3,它到 fd 1,这是标准输出)。

  4. 但我不明白为什么echo's 的输出没有进入结果文件。从bash 手册(强调我的):

管道中每个命令的输出通过管道连接到下一个命令的输入。也就是说,每个命令都读取前一个命令的输出。此连接在命令指定的任何重定向之前执行。

我理解这一点,即在设置或应用重定向之前echo,应该将 ' 的输出连接到cat' 的输入。但如果这是真的,那么在命令执行后结果文件将存在(并包含“测试”)。所以我的理解显然是错误的。>&3

有人可以解释我错过了什么吗?

更新,基于 AB 和 Gilles 在下面的出色回答,并提供进一步的解释

我担心的根源是我在上面第 3 项中所写的。它只是不那样工作。另见吉尔斯的回答。

AB 是第一个提供答案的人(见下文)。但是,我需要一些时间来理解它。因此,我将解释一些段落,以便更容易理解。

  1. 该行的最后一部分:3>&1首先完成:指向终端输出的 fd 1 被复制到 fd 3。这意味着 fd 1 和 fd 3 现在都指向终端输出。它们是相同的,可以互换使用。

  2. 在 fork 之前,通常使用系统调用在下一个可用的 fd 上创建一个管道pipe(2):假设 fd 4 和 fd 5。然后准备过程分叉为 future echo 和 future cat,执行以下步骤

    : echo 像这样工作:

    fd 5 被复制到 fd 1 (覆盖 fd 1 指向的位置:终端输出)。这意味着 fd 1 现在与 fd 5 相同,并且它们可以互换使用。具体来说,fd 1 不再指向终端输出,而是指向管道的写入端。

    在这个阶段(但见下文), 的输出echo将转到管道的写入端,因为echo写入指向该写入端的 fd 1。

    因为我们不需要两个文件描述符来处理同一件事,而且因为echo无论如何都要写入 fd 1,所以 fd 5 现在被关闭了。

    然后echo执行,但在设置了后面提到的附加重定向之后(参见 3.)。

    b) 同样地,fd 4 到 fd 0 的准备过程cat,即 fd 0 不再指向终端输入,而是指向管道的接收端。在这个阶段,for 的输入cat将来自管道的接收端,因为cat从 fd 0 读取,并且 fd 0 连接到接收端。因为我们不需要两个文件描述符来处理同一件事,而且因为cat无论如何都是从 fd 0 读取的,所以 fd 4 现在被关闭了。然后cat被执行。

    虽然这一切都发生了,但 fd 3 到处都是继承的。

  3. >&3与第 1 条相反:它将 fd 3 复制到 fd 1。已创建 fd 3 以使其指向终端输出,并由执行管道的子shell和执行各个管道命令的其他子shell继承。

    在步骤 2a) 中,fd 1 已指向管道的写入侧。但是现在,重定向>&3再次覆盖 fd 1 并使其等于 fd 3,而 fd 3 又(仍然)指向终端输出。这意味着 fd 1 不再指向管道的写入端,而是指向终端输出。这就是执行管道时终端上出现“test”的原因(请记住,echo始终写入 fd 1,无论 fd 1 指向何处)。

    另外,当 fd 1 被重定向“覆盖”时,它的旧版本会被关闭(因为底层系统调用dup2(2)会这样做)。由于其旧版本指向管道的写入端,因此该写入端现在已关闭。

    因此,接收端,因此,cat不会接收任何数据。相反,他们会立即收到 EOF 通知。这就是为什么cat不接收任何内容以及结果文件因此保持为空或被截断的原因。

    [ 旁注:我应该在重定向后关闭 fd 3 (也就是说,我们应该写>&3 3>&-而不是>&3),因为echo- 如上所述 - 写入 fd 1 并且对 fd 3 一无所知。但是,我的示例中缺少该部分,我想保留它以免分散实际问题的注意力)。]

shell pipe
  • 2 个回答
  • 185 Views
Martin Hope
Binarus
Asked: 2021-10-08 09:29:33 +0800 CST

我们可以在 tee(或 pee)命令中使用 $PIPESTATUS 吗?

  • 2

在我的 bash 脚本中,我经常使用管道,并且想知道管道的哪个阶段导致出现错误时出现问题。这些片段的基本结构是:

#!/bin/bash

ProduceCommand 2>/dev/null | ConsumeCommand >/dev/null 2>&1
PipeErrors=("${PIPESTATUS[@]}")
[[ "${PipeErrors[0]}" -eq '0' ]] || { HandleErrorInProduceCommand; }
[[ "${PipeErrors[1]}" -eq '0' ]] || { HandleErrorInConsumeCommand; }

tee现在(第一次很有趣)我处于这样一种情况,如果我可以使用or ,那就太好了pee。但是$PIPESTATUS在使用这些命令时会发生什么?例如:

#!/bin/bash

ProduceCommand 2>/dev/null | tee >(ConsumeCommand1) >(ConsumeCommand2) >/dev/null 2>&1
PipeErrors=("${PIPESTATUS[@]}")

或者

#!/bin/bash

ProduceCommand 2>/dev/null | pee ConsumeCommand1 ConsumeCommand2 2>/dev/null
PipeErrors=("${PIPESTATUS[@]}")

我相信在这两种情况下都${PipeErrors[0]}反映了ProduceCommand. 此外,假设它分别${PipeErrors[1]}反映了tee或pee本身的错误状态是合乎逻辑的。

但这导致我至少遇到两个理解问题:

  1. teeor的错误状态(返回值)是pee什么?我在手册页中没有找到关于这一点的准确陈述。如果其中一个消费命令失败,它们是否会返回硬编码的错误状态,或者它们是否会以某种方式传递消费命令的错误状态(ssh例如)?如果是前者,我们如何找出哪些消耗命令是罪魁祸首?如果是后者,中继哪个错误状态?仅仅是首先失败的命令吗?

  2. AFAIK、bash 或teeorpee命令本身分别在内部使用管道(fifos)来获取ProduceCommand消耗命令的输出。这意味着我们有一个管道,其(第一个,在这种情况下,唯一的)接收端是一个管道本身。这不应该影响$PipeErrors上面的示例代码,但我真的不确定。

有人可以对此有所了解吗?

bash pipe
  • 2 个回答
  • 432 Views
Martin Hope
Binarus
Asked: 2021-10-05 07:33:35 +0800 CST

ZFS 快照名称可以包含换行符吗?如果是,如何解析 zfs list -t snapshot 的输出?

  • 1

以下问题与Linux (ZoL) / OpenZFS 上的 ZFS相关,因为它在例如 Debian Buster 和 Debian Bullseye 中提供。

正如标题所说,我想知道 ZFS 快照名称理论上是否可以包含换行符(就像普通文件名一样),如果可以,我如何通过脚本中的快照名称列表安全地工作。

我曾尝试使用此类名称创建快照,但 zfs(幸运的是)拒绝这样做。但是,我想确定,因此,我在这里问。

一点背景知识:在这个站点和其他地方,经常存在这样一个问题:我们如何解析输出ls以逐个名称地处理文件名列表。答案大多是:不要这样做,因为可能会产生意想不到的副作用,例如文件名包含换行符;相反,使用 bash 的通配符。我明白这一点(事实上,我一直都是这样做的)。

但是,对于 ZFS 快照名称,没有通配符。例如,在我的盒子上,当我发出类似的东西时zfs list -H -r -o name -t snapshot rpool/vm-garak,我会得到一个快照名称列表,其中的条目由换行符分隔:

root@cerberus ~/scripts # zfs list -H -r -o name -t snapshot rpool/vm-garak
rpool/vm-garak@Q-2021-10-03-12-09-01
rpool/vm-garak@T-2021-10-03-12-14-01
rpool/vm-garak@T-2021-10-03-12-19-01
rpool/vm-garak@Q-2021-10-03-12-24-01
rpool/vm-garak@T-2021-10-03-12-29-01
rpool/vm-garak@T-2021-10-03-12-34-01
rpool/vm-garak@Q-2021-10-03-12-39-01
rpool/vm-garak@T-2021-10-03-12-44-01
rpool/vm-garak@T-2021-10-03-12-49-01
rpool/vm-garak@H-2021-10-03-12-54-01

我有一些脚本可以按名称通过此列表名称工作;也就是说,逐行,依赖于换行符可靠地指示新快照名称的事实。

只要我可以控制快照创建,这是安全的,因为我可以避免不合理的快照名称。但是快照是由其他人创建的,那么如果名称中有换行符怎么办?如上所述,我没有成功创建这样的快照名称,但我肯定不知道所有可以产生它们的奇怪方法。

最后一点:我知道,只要它涉及普通数据集(文件系统)快照,我最终可以摆脱通配,因为 ZFS 将它们放入隐藏目录并使其可以作为普通目录/文件访问。但是,在我的例子中,快照是来自 ZVOL 的快照,ZFS 无法通过这种方式访问​​这些快照。

bash zfs
  • 1 个回答
  • 41 Views
Martin Hope
Binarus
Asked: 2021-09-01 02:04:33 +0800 CST

nftables NETDEV 系列支持哪些链类型?

  • 1

来自nftables 快速参考:

family 是指以下表类型之一:ip、arp、ip6、bridge、inet、netdev。

和

type 是指要创建的链的种类。可能的类型有:

过滤器:由 arp、bridge、ip、ip6 和 inet 表族支持。
route:标记数据包(如输出钩子的 mangle,其他钩子使用类型过滤器代替),由 ip 和 ip6 支持。
nat:为了进行网络地址转换,由 ip 和 ip6 支持。

从另一个解释如何配置链的文档中:

可能的链类型有:

filter,用于过滤数据包。这由 arp、bridge、ip、ip6 和 inet 表系列支持。

路由,如果任何相关的 IP 头字段或数据包标记被修改,则用于重新路由数据包。如果您熟悉 iptables,则此链类型提供与 mangle 表等效的语义,但仅用于输出挂钩(对于其他挂钩,请改用类型过滤器)。这由 ip、ip6 和 inet 表系列支持。

nat,用于执行网络地址转换 (NAT)。只有给定流的第一个数据包会到达这个链;随后的数据包绕过它。因此,切勿使用此链进行过滤。ip、ip6 和 inet 表族支持 nat 链类型。

因此,根据至少两个权威参考文献,该netdev家族不支持任何链类型。鉴于此,我们怎么能使用netdev家庭呢?

firewall netfilter
  • 1 个回答
  • 520 Views
Martin Hope
Binarus
Asked: 2020-01-04 03:23:20 +0800 CST

authorized_keys 中的选项和 sshd_config 中的选项之间的关系?

  • 2

我想在我的一台服务器上配置一个 SSH 守护程序,以便远程客户端上的某些用户可以在服务器上执行某些命令。每个由特定公钥标识的用户必须能够执行特定于他的命令。

一般来说,似乎有很多选择可以做到这一点,其中三个是:

  • ForceCommand ...in sshd_config:在我的情况下这不够灵活,因为每个用户(公钥)都应该触发另一个命令。

  • command="..."in authorized_keys:这非常适合我的情况,因为每个用户authorized_keys在该服务器上的主目录中都有一个单独的文件,因此每个用户都可以执行自己的单独命令。但是我对该方法有一个理解问题,这导致我提出下面详述的问题。

  • 方法:这个/usr/lib/restricted-ssh-commands方法对于我的用例来说有点过大,因为我的每个用户只需要执行一个命令;此外,与此方法一起使用的正则表达式必须非常仔细地制作,否则它们会带来安全风险。

如上所述,我想选择第二种方法。然而,在我读过的每个教程中(很多,例如这个),我们强调我们不仅应该command=...在文件中添加选项,还应该添加authorized_keys更多,如下所示:

command="/bin/foo bar baz",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa ...

现在我担心/etc/ssh/sshd_config(我已经配置了对我系统范围很重要的所有守护程序选项)和authorized_keys文件中的选项之间的关系。

我读过man authorized_keys它给我的印象是authorized_keys优先于sshd_config它们中的选项。但是,没有明确说明(除非我错过了)不在 中authorized_keys但在sshd_config;中的选项会发生什么。他们会被带走sshd_config吗?

举一个真实的例子:no-x11-forwarding是我们可以(并且应该,根据我读过的所有教程)在authorized_keys. 但我已经X11Forwarding no在sshd_config. 那么如果我离开会发生no-x11-forwarding什么authorized_keys?

恕我直言,必须在每个authorized_keys文件中包含所有相关选项有点愚蠢,但我遇到的每个教程再次强调我们应该这样做。

如果有人能对此有所了解,我将不胜感激。

sshd openssh
  • 1 个回答
  • 575 Views
Martin Hope
Binarus
Asked: 2019-02-21 23:02:05 +0800 CST

如何为某些 libc 功能安装手册页?

  • 0

过去,在开发 Linux 软件时,我不时注意到man我的系统上缺少一些处理开发人员文档的页面。

这主要发生在 Debian 系统上。例如,昨天我需要使用该fls()功能,但man fls没有通向任何地方,尽管研究和尝试了这个和那个,我仍然不知道我能做些什么来安装那些丢失的man页面。

我认为这个问题与一些最初可用的功能已经在其他平台上实现(例如,fls()似乎来自BSD. 但是,这个发现没有帮助;在 Debian中没有特殊POSIX或开发人员文档(BSD至少,我找不到它)。

到目前为止,我已经通过谷歌搜索解决了这个问题,每次都man xxx有效(即让我找到相应的页面)。man但这很粗糙,不满意,让我依赖在线服务,所以我认为是时候解决问题了。

如何在最近的 Debian 版本中安装所有此类文档(特别是不在软件包中的手册页glibc-doc)?

debian man
  • 2 个回答
  • 1295 Views
Martin Hope
Binarus
Asked: 2019-01-07 02:30:00 +0800 CST

find 如何防止无限循环(例如在查找文件时重命名文件)?[复制]

  • 3
这个问题在这里已经有了答案:
我们会“找到”名称被“find”更改的文件吗?为什么不? (1 个回答)
3年前关闭。

请考虑以下命令:

find . -type f -name '*.*' -exec mv '{}' '{}_foo' \;

在这种情况下如何find防止无限循环?

一方面,我相信 find不像 shell glob那样工作,即它不会获取所有*.jpg文件的列表,在内部存储该列表,然后处理列表条目。相反,它让文件从底层 O/S “增量”处理,并在它知道后立即处理每个文件(让我们忽略可能发生的一定数量的缓冲,因为这与问题无关)。毕竟,据我所知,这是find在目录中包含大量文件的全局全局的主要优势。

如果这是真的,我想了解 find 如何防止无限循环。在上面的示例中,1.jpg将重命名为1.jpg_foo. 从 StackOverflow 和其他地方的讨论中,我知道重命名可能会导致文件(名称)在目录文件列表中占据不同的位置,因此 find 很可能再次遇到该文件,再次将其重命名为(to 1.jpg_foo_foo),等等上。

显然,这不会发生。

linux bash
  • 1 个回答
  • 374 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve