在上一篇總結中,在進程列表中隱藏密碼是經過在main函數中作處理來隱藏的.linux
以下:服務器
1 int _main(int argc, char* argv[], char** envp) { 2 3 省略中間一些代碼內容 4 5 // hide password from ps output 6 7 for (int i = 0; i < (argc - 1); ++i) { 8 9 if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--password")) { 10 11 char* arg = argv[i + 1]; 12 13 while (*arg) { 14 15 *arg++ = 'x'; 16 17 } 18 19 } 20 21 }
但是,上面的代碼並非總能管用.爲啥呢?由於main函數一進去,mongo並無立刻在進程列表裏面把密碼掩蓋,而是先作了一些初始化操做,就是我在上面省略的代碼部分.併發
由於中間省略的那部分代碼也是要花費必定時間的,因此在比較極端的場景下,同時大併發執行mongo ip/db -u account -p password jsfile時候,是有可能被進程監控程序監控到帶有明文密碼的mongo進程的.ide
這個時候怎麼解決呢?函數
mongo接受的服務器端js腳本中,也是能夠執行登陸操做的,把登陸操做放到js中,這樣,就能夠用mongo ip jsfile方式來執行服務器端js了.spa
js的內容中須要添加:code
db = db.getSiblingDB('dbname') var login_ret = db.auth('user','password') if (1 == login_ret){ //do something }else{ //print login failed message }
若是帳號和密碼是可變的,到時候能夠經過將js腳本中user,password部份內容替換掉,就能夠正常工做了.blog
總結:本篇講的在進程列表中隱藏密碼關鍵信息的方式是linux here document.進程
最後須要留意的是,若是直接執行mongo ip jsfile,else和if語句塊的右花括號能夠換一行,但若是jsfile是經過linux here document方式傳入,則else和if語句塊的右花括號必須是在同一行的.ip