1. 程式人生 > >MongoDB shell指令碼 自動新增許可權與賬號密碼

MongoDB shell指令碼 自動新增許可權與賬號密碼

需求

將無需賬號密碼訪問的MongoDB資料庫,新增上賬號密碼,並且適配相容舊的無許可權訪問的環境,即自動判斷有無許可權,無則自動加上。

分析

MongoDB開啟許可權訪問需要兩步:

  1. 為資料庫新增賬號密碼,即新增使用者,預設是無使用者的。
  2. 將mongod服務開啟時,加上auth引數,即開啟許可權認證。(或者修改MongoDB的mongod.conf配置檔案,將#auth = true的註釋去掉即可)

實現

話不多說,直接看指令碼:
fit_mongo.sh

#!bin/bash

#以無許可權控制的方式啟動服務(--fork -f並不是必須的,是我自己的需求在用,有需要自行查詢其他引數,)
mongod --fork -f /path/to/mongod.conf #使用mongo [options] [db address] [file names (ending in .js)]命令執行js指令碼操作資料庫,並寫入日誌 mongo --host 127.0.0.1:27017 testdb fit_mongo.js >> fit_mongo.log #安全地殺掉mongod程序 pkill mongod #開啟許可權控制 mongo --auth --fork -f /path/to/mongod.conf

然後就是fit_mongo.js

try{
    var db = connect('testdb'
); if(db.system.users.find({'user':'username'}).count() == 0){ print('Ready to addUser...'); db.addUser('username','pwd'); }else{ print('Already exist user.') } }catch(err){ print('Error occured:' + err); }

最後就是選擇在合適的地方和時間執行這個指令碼了,可以在整個系統服務跑起來的時候執行。
在實現這個功能的過程中遇到了幾個問題:

  1. 一開始為了修改MongoDB以需要許可權訪問的時候,老想著去用命令改mongod.conf檔案,要用正則啊各種語句找到auth還要取消掉註釋,殊不知MongoDB已經提供了auth這個引數,浪費了許多功夫和時間,所以還是要好好了解清楚官方提供了什麼再動手。
  2. 在fit_mongo.js中,由於mongo shell的原因,在shell中執行js程式碼,比如:

    db.system.users.find({user: 'UserName'})

    返回的是json物件,但是在shell上確取不到這個json裡面的值,後來發現多此一舉,直接用count()判斷是否為0就可以了。

  3. 其中還有一些零零碎碎的小問題也記不太清除了,但是過程中卻學到了不少,獲益良多!

如果對以上有什麼問題,歡迎提出~