通过远程 ssh 命令获取输出时,如何使 yum list 输出保持在一行上?

通过远程 ssh 命令获取输出时,如何使 yum list 输出保持在一行上?

当我通过 SSH 连接到一台机器ssh machine并运行它时yum list,它会输出按预期安装的所有内容,重要的是每个项目都在一行上,如下所示:

xz-devel.i386                                                                                                        4.999.9-0.3.beta.20091007git.el5                                                                  base            
xz-devel.x86_64                                                                                                      4.999.9-0.3.beta.20091007git.el5                                                                  base            
xz-libs.i386                                                                                                         4.999.9-0.3.beta.20091007git.el5                                                                  base            
xz-lzma-compat.x86_64                                                                                                4.999.9-0.3.beta.20091007git.el5                                                                  base            

但是,在远程执行此操作时ssh machine 'yum list',甚至在服务器上将其通过yum list | grep xz -C 3管道传输到 grep 时,输出行会被“截断”并变得更短,如下所示:

xz-devel.i386                              4.999.9-0.3.beta.20091007git.el5
                                                                       base     
xz-devel.x86_64                            4.999.9-0.3.beta.20091007git.el5
                                                                       base     
xz-libs.i386                               4.999.9-0.3.beta.20091007git.el5
                                                                       base     
xz-lzma-compat.x86_64                      4.999.9-0.3.beta.20091007git.el5
                                                                       base     

怎样才能让线条的尺寸不这样缩小呢?我的最终愿望是将其通过管道传输tee,然后通过 ansible 对所有主机的输出文件进行一些处理。

似乎这是由于某种“虚拟终端”作为 SSH/管道的一部分而发生的,因为如果我缩小运行时断线的终端大小,我可以得到相同的行为yum list。因此我假设管道的添加以某种方式告诉yum list终端的宽度只有 X 列

答案1

这个答案@thrig 在评论中提供,我能够通过执行以下操作使其正确输出

yum list installed | xargs -n3 | column -t 

答案2

安装 unbuffer(1) 附带的expect,然后运行:

# unbuffer yum repolist

答案3

我今天(在手术期间)与此斗争yum check-update,并在找到一个“CLOSED NOTABUG”bugzilla 报告和各种Python 技巧,我想出了另一个解决方法:

script -q -c "stty cols 150; yum check-update" /dev/null > /path/to/output.txt 2>&1

或者:

script -q -c "stty cols 150; yum check-update" /path/to/output.txt > /dev/null

150 是一个任意大的数字,足以防止包装;如果需要,向上调整。-q如果您使用非空输出文件名,该选项将禁止初始“脚本于 $(date) 开始”行。

对于原来的问题,该行将是:

script -q -c "stty cols 150; yum list" /dev/null

答案4

您可以使用该repoquery命令生成可解析的输出。例如:

repoquery '*' --queryformat='%{name} %{evr} %{from_repo}' | column -t

给出:

0ad                0.0.23b-13.fc32  fedora
0ad                0.0.23b-17.fc32  updates
0ad-data           0.0.23b-4.fc32   fedora
0xFFFF             0.8-3.fc32       fedora
2048-cli           0.9.1-9.fc32     fedora
2048-cli-nocurses  0.9.1-9.fc32     fedora
2048-cli-sdl       0.9.1-9.fc32     fedora
2ping              4.3-6.fc32       fedora
2ping              4.5-1.fc32       updates
389-ds-base        1.4.3.18-1.fc32  updates

... 等等。

(与dnf/不同yum,repoquery 不会消除其输出中的重复包)

相关内容