MongoDB shell指令碼 自動新增許可權與賬號密碼
阿新 • • 發佈:2018-12-24
需求
將無需賬號密碼訪問的MongoDB資料庫,新增上賬號密碼,並且適配相容舊的無許可權訪問的環境,即自動判斷有無許可權,無則自動加上。
分析
MongoDB開啟許可權訪問需要兩步:
- 為資料庫新增賬號密碼,即新增使用者,預設是無使用者的。
- 將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);
}
最後就是選擇在合適的地方和時間執行這個指令碼了,可以在整個系統服務跑起來的時候執行。
在實現這個功能的過程中遇到了幾個問題:
- 一開始為了修改MongoDB以需要許可權訪問的時候,老想著去用命令改mongod.conf檔案,要用正則啊各種語句找到auth還要取消掉註釋,殊不知MongoDB已經提供了auth這個引數,浪費了許多功夫和時間,所以還是要好好了解清楚官方提供了什麼再動手。
在fit_mongo.js中,由於mongo shell的原因,在shell中執行js程式碼,比如:
db.system.users.find({user: 'UserName'})
返回的是json物件,但是在shell上確取不到這個json裡面的值,後來發現多此一舉,直接用count()判斷是否為0就可以了。
其中還有一些零零碎碎的小問題也記不太清除了,但是過程中卻學到了不少,獲益良多!
如果對以上有什麼問題,歡迎提出~