我遇到的问题是,当我通过child_process.exec在nodejs中运行终端命令时,我获得的另一个输出比在真实终端中运行命令时更多。
我的代码如下所示:
function checkLocalIP() {
logger.debug("Checking the local IP");
execute("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'", function(localIP) {
if(isIp.v4(localIP)) {
logger.debug("Local IP found",{localIP:localIP});
return true;
} else {
logger.error("Local IP not found",{localIP:localIP});
return false;
}
});
}
function execute(command, callback){
logger.debug("Executing command: "+command,{command:command});
exec(command, function(error, stdout, stderr){
callback(stdout);
});
}
如果我在真正的终端中运行此命令,我只能得到这样的IP:
$ ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
$ 192.168.178.222
但在nodejs中,我将此字符串作为stdout:
"ine\nt 127.0\n.0.1\nine\nt 192.168\n.178.222"
我想知道为什么输出不相似以及为什么nodejs调用也输出127.0.0.1 IP,因为它在命令中被排除。
答案 0 :(得分:1)
请记住逃避\
。请记住,在js中,例如在C或类似语言中,\
在字符串中具有特殊含义:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Escape_notation
所以你的字符串:
"ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'"
被解释为:
ifconfig | grep -Eo 'inet (addr:)?([0-9]*.){3}[0-9]*' | grep -Eo '([0-9]*.){3}[0-9]*' | grep -v '127.0.0.1'
请注意丢失的\
。这显然会导致使用错误的正则表达式。
要修复它,请转义\
:
"ifconfig | grep -Eo 'inet (addr:)?([0-9]*\\.){3}[0-9]*' | grep -Eo '([0-9]*\\.){3}[0-9]*' | grep -v '127.0.0.1'"
答案 1 :(得分:0)