2014-05-22 34 views
4

我在用mongo作为数据库编写一个应用程序。我想打印连接到数据库的客户端,例如,打印他们的IP。我怎样才能得到这些信息?如何在MongoDB中获取连接的客户端

我尝试使用

db.serverStatus().connections 

但它给我的计算机数量可以访问我的分贝。

回答

5

您可以使用db.currentOp(true)并使用client字段遍历结果集的inprog数组。

4

您应该能够运行这个命令并获取连接的IP地址的列表:

db.currentOp(true).inprog.forEach(function(d){if (d.client)printjson(d.client)}) 

db.currentOp实际上是建立在专门收集$ cmd.sys.inprog的顶部,这样你也可以直接查询。你可以得到的一个想法如何通过不使用括号中输入db.currentOp进入蒙戈外壳做到这一点,它会打印出源的功能:

> db.currentOp 
function (arg){ 
    var q = {} 
    if (arg) { 
     if (typeof(arg) == "object") 
      Object.extend(q , arg); 
     else if (arg) 
      q["$all"] = true; 
    } 
    return this.$cmd.sys.inprog.findOne(q); 
} 
0

这是一个有点哈克,但你实际上可以通过netstat得到这个,即使没有连接到数据库。这将在数​​据库服务器上的(bash)shell脚本中完成。实际上,在我的登录脚本(〜/ .bash_profile)中有这个,这样我就可以很容易地找到到MongoDB和运行在TCP上的任何其他服务的网络连接。

首先,你会在shell中运行它,它定义了一个函数。

function whoIsConnectedToPort() { 
    PORT=$1 
    netstat -an | grep ":${PORT}.*ESTAB" | awk '{print $4":"$5}' | cut -d: -f2- | grep "^${PORT}:" | cut -d: -f2 | grep -v '^127' | sort | uniq | xargs -n1 nslookup | grep 'name =' | awk {'print $NF'} | sed 's/.$//' | sort | uniq 
} 

然后调用函数。

whoIsConnectedToPort 27017 

这应该返回连接到给定端口的主机列表。

您可以将其重用到其他熟悉的端口。试试例如:

whoIsConnectedToPort 22 
whoIsConnectedToPort 3306 
whoIsConnectedToPort 1521 
相关问题