- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 jq 来尝试将 bash 命令输出转换为 json。但是,转换失败了。
使用这一行:
hostname && getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1 | sudo xargs -I % sh -c 'echo %; chage -l %; echo' | jq --raw-input . | jq --slurp .
是这样的: JSON
不使用 jq 的上述命令的输出结果为: Command Output
有人试过将 bash 输出正确地转换为 json 吗?谢谢
最佳答案
I'm using jq...
我知道 jq
在这里很流行,但我要推荐 Xidel为了这个任务。
虽然主要是一个 HTML/XML/JSON 解析器(使用 CSS、XPath、XQuery、JSONiq 和模式模板),但 Xidel 也可以处理基本文本。
你说你想要一个像这样的 json:
{
"hostname": "example",
"users": [
{
"username": "example1",
"details": {
"LastPasswordChange": "Nov 12, 2018",
"PasswordExpires": "never",
"PasswordInactive": "never",
"AccountExpires": "never",
"MinDaysBetweenPasswordChange": "0",
"MaxDaysBetweenPasswordChange": "99999",
"NumOfDaysOfWarningBeforePasswordExpires": "7"
}
},
{
"username": "example2",
"details": {
"LastPasswordChange": "Nov 13, 2018",
"PasswordExpires": "never",
"PasswordInactive": "never",
"AccountExpires": "never",
"MinDaysBetweenPasswordChange": "0",
"MaxDaysBetweenPasswordChange": "99999",
"NumOfDaysOfWarningBeforePasswordExpires": "7"
}
}
]
}
这意味着 users
数组需要为每个用户分别填充对象(根据此 chage
程序的输出创建)。这就是为什么我会选择另一种方法。
假设getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1
返回:
root
user1
user2
我们将通过管道传输到 Xidel 以首先创建一个基本的 json:
getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1 | xidel -s - --xquery '
{
"hostname":"'$(hostname)'",
"users":x:lines($raw) ! {
"username":.
}
}
'
hostname &&
,因为您只需从 Xidel 中调用它(这也使查询更容易)。x:lines($raw)
,您可以从 Xidel 的输入(在本例中为标准输入)创建一个包含每一行的序列。要使用的替代函数是 tokenize($raw,"\n")
。查询输出:
{
"hostname": "user",
"users": [
{
"username": "root"
},
{
"username": "user1"
},
{
"username": "user2"
}
]
}
接下来我们将从 Xidel 中调用 chage
来创建 details
对象:
getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1 | xidel -s - --xquery '
{
"hostname":"'$(hostname)'",
"users":x:lines($raw) ! {
"username":.,
"details":{|
for $x in x:lines(
system(x"chage -l {.}")
)
let $a:=tokenize(
$x,
":"
)
return {
normalize-space($a[1]):normalize-space($a[2])
}
|}
}
}
'
system(x"chage -l {.}")
返回 chage -l root
、chage -l user1
和chage -l user2
.x:lines()
围绕它,您再次创建了每个新行的序列。例如,user2
输出的第一行:Last password change : Oct 23, 2018
$a
被创建,它保存这个项目一分为二的序列,以 :
作为分隔符. $a
因此对于第一项:Last password change # white-space up untill this point!
Oct 23, 2018
{
"Last password change": "Oct 23, 2018"
}
查询输出:
{
"hostname": "user",
"users": [
{
"username": "root",
"details": {
"Last password change": "never",
"Password expires": "never",
"Password inactive": "never",
"Account expires": "never",
"Minimum number of days between password change": "0",
"Maximum number of days between password change": "99999",
"Number of days of warning before password expires": "7"
}
},
{
"username": "user1",
"details": {
"Last password change": "never",
"Password expires": "never",
"Password inactive": "never",
"Account expires": "never",
"Minimum number of days between password change": "0",
"Maximum number of days between password change": "99999",
"Number of days of warning before password expires": "7"
}
},
{
"username": "user2",
"details": {
"Last password change": "Oct 23, 2018",
"Password expires": "never",
"Password inactive": "never",
"Account expires": "never",
"Minimum number of days between password change": "0",
"Maximum number of days between password change": "99999",
"Number of days of warning before password expires": "7"
}
}
]
}
您可以更进一步:
getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1 | xidel -s - --xquery '
{
"hostname":"'$(hostname)'",
"users":x:lines($raw) ! {
"username":.,
"details":{|
for $x in x:lines(
system(x"chage -l {.}")
)
let $a:=tokenize(
$x,
":"
)
return {
string-join(
for $x in tokenize(
normalize-space($a[1]),
" "
)
return
upper-case(
substring(
$x,
1,
1
)
)||substring(
$x,
2
)
):normalize-space($a[2]) ! (
if (. castable as decimal) then
number(.)
else
.
)
}
|}
}
}
'
Last password change
,使用...string-join(for $x in tokenize(normalize-space($a[1])," ") return upper-case(substring($x,1,1))||substring($x,2))
...它返回:LastPasswordChange
。
"99999"
(一个字符串),用...normalize-space($a[2]) ! (if (. castable as decimal) then number(.) else .)
...它返回:99999
作为 xs:decimal 原子类型。
查询输出:
{
"hostname": "user",
"users": [
{
"username": "root",
"details": {
"LastPasswordChange": "never",
"PasswordExpires": "never",
"PasswordInactive": "never",
"AccountExpires": "never",
"MinimumNumberOfDaysBetweenPasswordChange": 0,
"MaximumNumberOfDaysBetweenPasswordChange": 99999,
"NumberOfDaysOfWarningBeforePasswordExpires": 7
}
},
{
"username": "user1",
"details": {
"LastPasswordChange": "never",
"PasswordExpires": "never",
"PasswordInactive": "never",
"AccountExpires": "never",
"MinimumNumberOfDaysBetweenPasswordChange": 0,
"MaximumNumberOfDaysBetweenPasswordChange": 99999,
"NumberOfDaysOfWarningBeforePasswordExpires": 7
}
},
{
"username": "user2",
"details": {
"LastPasswordChange": "Oct 23, 2018",
"PasswordExpires": "never",
"PasswordInactive": "never",
"AccountExpires": "never",
"MinimumNumberOfDaysBetweenPasswordChange": 0,
"MaximumNumberOfDaysBetweenPasswordChange": 99999,
"NumberOfDaysOfWarningBeforePasswordExpires": 7
}
}
]
}
“美化”查询更容易阅读,但如果您更喜欢“缩小”版本:
getent passwd | egrep -v '/s?bin/(nologin|shutdown|sync|halt)' | cut -d: -f1 | xidel -s - --xquery '{"hostname":"'$(hostname)'","users":x:lines($raw) ! {"username":.,"details":{|for $x in x:lines(system(x"chage -l {.}")) let $a:=tokenize($x,":") return {string-join(for $x in tokenize(normalize-space($a[1])," ") return upper-case(substring($x,1,1))||substring($x,2)):normalize-space($a[2]) ! (if (. castable as decimal) then number(.) else .)}|}}}'
关于json - getent passwd 以正确格式输出为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54254819/
在我的 CentOS 7 系统(和其他 Linux 版本)中,我注意到有两个 passwd 文件,/etc/passwd 和/usr/bin/passwd。前者包含有关用户、组、默认 shell 等的
我想通过我的 api 更改用户密码,但我当前的代码不起作用。 也许有人可以帮助我。 $cmd1 = "passwd ".$info['instanceFtpUser']; $ssh->exec($cm
我需要验证/etc/passwd 文件是否有效,并且认为正则表达式是验证非注释行的好主意。我如何验证这样的行: root:*:0:0:System Administrator:/var/root:/b
我有一个问题,我已经尽可能地缩小了范围。我想将 /etc/passwd 中的行计数两次。一次作为引用,一次检测任何变化。 我初始化一个passwd 结构并计算其中的条目数。然后调用 setpwent(
这是我的脚本: #!/bin/bash for i in $(cat usernames.txt) do echo $i useradd $i -m -s /bin/bash $i -
如何使用 echo 将一些输入通过管道传输到需要用户输入两次内容的程序中? 例如 echo "somepassword"|passwd someuser 创建此错误消息 Enter new UNIX
1.命令简介 passwd 令用于设置用户的认证信息,包括用户密码、账户锁定、密码失效等。 系统管理员能用它管理系统用户的密码,只有管理员可以指定用户名称,一般用户只能变更自己的密码。 2.命
passwd命令 passwd 命令用来修改您的密码。 语法: 语法是 passwd [命令开关] 命令开关: -a 显示密码属性的所有项目。
我正在尝试使用 OpenSSL passwd 命令对输入的密码进行散列并将其与存储的散列进行比较,但散列函数不一致。第一次生成的散列与我去比较输入时生成的散列不同。每次执行哈希时,请注意 3 个不同的
我想过滤/etc/passwd的内容, 仅显示第三列中的值大于 999 的行. 有没有一种简单的方法可以用一个衬垫来做到这一点?我想在不写无聊的情况下做到这一点 for-loop . 最佳答案 这是一
我有一个系统构建器项目来制作需要完成的 QNX 操作系统镜像。问题是它目前不支持 passwd 命令。我的意思是当我写图像并尝试使用 passwd root 命令时,我得到了这个输出: /bin/pa
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我想逐字节读取/etc/passwd 文件,并想在std o/p 上显示它。这是我的代码 void main(int argc, char *argv[]) { int fd, ch; int
我知道,passwd 设置了 setuid 位,因此它可以修改 root 拥有的 /etc/shadow 文件。 [~]$ ls -l `which passwd` -rwsr-xr-x. 1 roo
我写了一个脚本作为 Ubuntu 启动服务(位于/etc/init.d 并在启动时运行)有一条线 HOMEDIR=`getent passwd username1 | cut -d: -f6` 问题是
我一直在尝试使用 ecryptfs 通过 ecryptfs-mount-private 和 ecryptfs-umount-private 手动挂载/卸载私有(private)存储>。当我以配置了 e
我试图在这个 perl 脚本上返回 Unix 用户列表。我正在使用带有 Passwd::Unix 的 Mojolicious 框架。 引用: Mojolicious (http://metacpan.
在具有 sudo 权限的 shell 脚本中,我正在尝试更改另一个用户的密码。 我试过sudo passwd username但没有得到任何地方。 最佳答案 您需要使用 chpasswd命令。你可以尝
我目前正在尝试在 OSX Yosemite 上从单用户模式创建一个 root 帐户 /sbin/mount -uw / launchctl load /System/Library/LaunchDae
我想检查某个用户是否存在于特定组中。 getent passwd user_name &> /dev/null 上面的命令检查用户是否在那里。但我还想看看它是否属于一个名为 example suppo
我是一名优秀的程序员,十分优秀!