You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:30:29