如何在Bash脚本中补全Samba用户信息的JSON外层结构
问题
我是脚本编写新手,在VirtualBox中基于Ubuntu 22.04 Samba ADDC搭建了测试域universum.local。我希望通过Bash脚本查询域控制器获取10个域用户的信息并保存为JSON文件,目前已成功将用户信息导出为TXT并转换为单个用户的JSON对象,但生成的JSON文件缺少外层的{"users": []}结构,无法被本地PowerShell脚本正常读取。
现有Bash脚本代码
#!/bin/bash clear ldapuserslistfilename="ldapuserslist.txt" ldapuserslistfile="$tmp/$ldapuserslistfilename" ldapusersinfofilename="ldapusersinfo.txt" ldapusersinfofile="$tmp/$ldapusersinfofilename" # main code touch $ldapuserslistfile touch $ldapusersinfofile samba-tool user list > $ldapuserslistfile while read -r line ; do for user in $line ; do samba-tool user show $user >> $ldapusersinfofile done done < $ldapuserslistfile # conversion fron txt to json jsonfilename="jsontestfile.json" json="./$jsonfilename" touch $json ed -s $ldapusersinfofile << 'EOF' > $json v/^cn:\|^sn:\|^givenName:\|^displayName:\|^name:\|^whenCreated:/d ,s/^\(.*[^:]*\): \(.*\)/"\1": "\2"/ g/cn\|sn\|givenName\|displayName\|name\|whenCreated/s/$/,/ ,s/^/ / g/lastLogon/t. \ s/.*/},/g 1,$-1g/}/t. \ s/.*/{/g 0a { . $s/,// ,p Q EOF # copying txt files for tests cp $ldapuserslistfile /mnt cp $ldapusersinfofile /mnt # deleting files if [ -f $ldapuserslistfile ] ; then rm -f $ldapuserslisfile ; fi if [ -f $ldapusersinfofile ] ; then rm -f $ldapusersinfofile ; fi
当前JSON输出
{ "cn": "James Rhodes", "sn": "Rhodes", "givenName": "James", "whenCreated": "20220926075852.0Z", "displayName": "James Rhodes", "name": "James Rhodes", "lastLogon": "0" }, { "cn": "T'Chala", "givenName": "T'Chala", "whenCreated": "20220926081521.0Z", "displayName": "T'Chala", "name": "T'Chala", "lastLogon": "0" }, { "cn": "Stephen Strange", "sn": "Strange", "givenName": "Stephen", "whenCreated": "20220926080942.0Z", "displayName": "Stephen Strange", "name": "Stephen Strange", "lastLogon": "0" }
期望的JSON格式
{ "users": [ { "cn": "James Rhodes", "sn": "Rhodes", "givenName": "James", "whenCreated": "20220926075852.0Z", "displayName": "James Rhodes", "name": "James Rhodes", "lastLogon": "0" }, { "cn": "T'Chala", "givenName": "T'Chala", "whenCreated": "20220926081521.0Z", "displayName": "T'Chala", "name": "T'Chala", "lastLogon": "0" }, { "cn": "Stephen Strange", "sn": "Strange", "givenName": "Stephen", "whenCreated": "20220926080942.0Z", "displayName": "Stephen Strange", "name": "Stephen Strange", "lastLogon": "0" } ] }
用于读取的PowerShell脚本
Clear $json = Get-Content <pathToFile>\jsontestfile.json -Raw | ConvertFrom-Json foreach ($user in $json.users){ echo $user.cn echo $user.sn echo $user.givenName echo "----------" }
解决方案
你可以通过拆分转换步骤,先生成用户对象的内容,再手动包裹外层的{"users": []}结构,具体修改如下:
修改后的转换代码
将原脚本中从# conversion fron txt to json开始的代码替换为以下内容:
# conversion from txt to json jsonfilename="jsontestfile.json" json="./$jsonfilename" temp_json="./temp_users.json" touch $temp_json $json # 先把用户对象转换为临时文件,保留原有ed逻辑 ed -s $ldapusersinfofile << 'EOF' > $temp_json v/^cn:\|^sn:\|^givenName:\|^displayName:\|^name:\|^whenCreated:/d ,s/^\(.*[^:]*\): \(.*\)/"\1": "\2"/ g/cn\|sn\|givenName\|displayName\|name\|whenCreated/s/$/,/ ,s/^/ / g/lastLogon/t. \ s/.*/},/g 1,$-1g/}/t. \ s/.*/{/g 0a { . $s/,// ,p Q EOF # 给用户对象添加缩进并包裹外层结构到最终JSON cat > $json << EOF { "users": [ $(sed 's/^/ /' $temp_json) ] } EOF # 删除临时文件 rm -f $temp_json
额外修正
原脚本中有个拼写错误:rm -f $ldapuserslisfile应该改为rm -f $ldapuserslistfile,否则清理文件时会执行失败。
内容的提问来源于stack exchange,提问作者Kubix
相关产品推荐
相关产品推荐

