0

我无法弄清楚这一点,因为我的 bash 技能不是那么强,而且经过大量谷歌搜索后,我无法找到现有的脚本来执行此操作。

我用来从多个服务器pslurp中获取文件。/etc/passwd这将放在/etc/passwd一个目录结构中/servername/password

pslurp -h serverlist -L localdir /etc/passwd password

然后我需要获取我刚刚抓取的每个密码文件并调整它们以仅显示具有交互登录能力的用户的用户名。我通过排除/sbin/nologin每个/servername/password文件的外壳并输出到新文件的任何用户来做到这一点

grep -v "/sbin/nologin$" password | cut -d: -f1 > /servername/newfile

完成后,我需要将所有/servername/newfile内容放入 1 个组合文件中,格式为

服务器名称

列出/servername/newfile每个服务器名下的内容

服务器名称

列出/servername/newfile每个服务器名下的内容

等等 ...

我已经为此工作了几天,但无法实现。请帮忙!

4

2 回答 2

0

只要您设置了无密码登录ssh到要从中收集的服务器/etc/passwd(或只想在提示时输入每个密码),您就不需要pslurp或任何其他罐装实用程序,您只需要sshawk. 例如,/etc/passwd从服务器列表中检索和组合所有文件,删除所有包含nologinor false(for /bin/false) 的条目,并将它们以以下格式写出:

server1
list of login users

server2
list of login users

...

您只需要一个包含服务器名称和以下内容的简单数组,例如

#!/bin/bash

servers=(server1 server2 server3)   # list of servers to get /etc/passwd from

{ # brace enclosed operation
for i in "${servers[@]}"; do        # loop over each server
    # ssh in and on success outut server name and contents without nologin or false
    ssh "$i" "printf '\n%s\n' '$i'; awk '/nologin/||/false/{next}1' /etc/passwd"
done
} > newfile                         # redirect output to new file

这将newfile使用您描述的格式和内容创建,而无需在本地使用任何临时文件。

如果您希望灵活地将输出重定向到stdout您选择的任何文件,只需在脚本中删除括号括起来的重定向分组并在运行脚本时重定向输出(或让它打印到stdout)。

有无数种方法可以解决这个问题,但这是一种相对简单的方法。例如,如果您在服务器上没有 bash,但仅限于 POSIX shell,您可以使用简单的服务器列表而不是数组,其余的将按原样工作。

于 2020-07-30T19:46:34.207 回答
0

给定一些像这样的假密码文件:

$ tree
.
├── svrA
│   └── passwd
├── svrB
│   └── passwd
└── svrC
    └── passwd

一个 awk 命令就足够了:

awk -F: '
    FNR==1 {
        split(FILENAME, f, "/")
        printf "\n%s\n\n", f[1]
    }
    $NF !~ /\/(nologin|false)$/
' */*

输出这个,你可以重定向到一个文件


svrA

root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000:Parallels:/home/user1:/bin/bash

svrB

root:x:0:0:root:/root:/bin/bash
user2:x:1000:1000:user2:/home/user2:/bin/bash

svrC

root:x:0:0:root:/root:/bin/bash
user3:x:1000:1000:user3:/home/user3:/bin/bash

您是否也想忽略/bin/false/usr/bin/false作为登录 shell?

于 2020-07-30T20:42:51.303 回答