我正在使用以下代码使用nodejs和ssh2模块在Linux机器上重置密码:
// FILE * ./workflow/ssh.js
var Client = require('ssh2').Client;
var conn = new Client();
// var opts = require('optimist')
// .options({
// user: {
// demand: true,
// alias: 'u'
// },
// }).boolean('allow_discovery').argv;
// Definition of reset password;
var resetPassword = function(user, host, loginUser, loginPassword){
var command = 'echo -e "linuxpassword\nlinuxpassword" | passwd '+ user;
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec(command, function(err, stream) {
if (err) throw err;
stream.on('close', function(code, signal) {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
return(code);
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDLOG: ' + data);
});
});
}).connect({
host: host,
port: 22,
username: loginUser,
password: loginPassword
});
};
exports.resetPassword = resetPassword;
我正在从另一个模块(如下所示的test.js)调用resetPassword密码功能。
var ssh = require('./workflow/ssh.js');
result = ssh.resetPassword('test122', '192.168.0.101', 'root' , 'password');
console.log(result)
但是console.log说“未定义”。尝试使用process.nextTick,但没有运气。请帮忙。
欢迎来到node.js中使用异步操作进行开发的世界。最初学习node.js时,这是一个非常常见的错误(也是此处StackOverflow的常见问题)。异步操作将在将来完成一些不确定的时间,与此同时,其余代码将继续运行。实际上,您的resetPassword()
函数可能在流完成之前且在resetPassword结果可用之前返回。
因此,您不能直接从resetPassword函数返回结果,因为该函数在结果准备好之前就返回了。相反,您将必须传递回调并在调用回调时获取结果,并且此函数的调用者将必须使用回调而不是直接返回的结果。您可以这样实现:
// FILE * ./workflow/ssh.js
var Client = require('ssh2').Client;
var conn = new Client();
// var opts = require('optimist')
// .options({
// user: {
// demand: true,
// alias: 'u'
// },
// }).boolean('allow_discovery').argv;
// Definition of reset password;
var resetPassword = function(user, host, loginUser, loginPassword, callback){
var command = 'echo -e "linuxpassword\nlinuxpassword" | passwd '+ user;
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec(command, function(err, stream) {
if (err) {
callback(err);
return;
}
stream.on('close', function(code, signal) {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
callback(null, code);
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDLOG: ' + data);
});
});
}).connect({
host: host,
port: 22,
username: loginUser,
password: loginPassword
});
};
exports.resetPassword = resetPassword;
然后,您可以像这样使用它:
var ssh = require('./workflow/ssh.js');
ssh.resetPassword('test122', '192.168.0.101', 'root' , 'password', function(err, code) {
if (!err) {
console.log(code);
}
});
PS从您的原始代码来看,它也并没有真正帮助您从异步回调中抛出。该异常仅发生在任何触发异步回调的node.js基础结构中,而不会返回到原始代码。这就是为什么您的代码也已更改为通过回调传达错误的原因。
根据node.js约定,回调函数至少包含两个参数。第一个参数是一个错误代码,null
如果没有错误,则应为错误代码;如果有错误,则为适当的错误代码或错误对象。然后,第二个参数(以及您想要的其他任何参数)传达了一个成功的结果。遵循该约定非常有用,因为它既与node.js在其他地方的处理方式一致,又与某些机械错误处理(例如,将接口修改为使用promises时所做的处理)兼容。
问题内容: 我正在生成大量的XML,当用户单击表单按钮时,这些XML将作为发布变量传递到API。我还希望能够事先向用户显示XML。 该代码有点像以下结构: 我的XML正在生成一些while循环和其他内容。然后需要在两个位置(预览和表单值)中显示它。 我的问题是。我如何在变量中捕获生成的XML或其他内容,所以我只需要生成一次,然后将其打印出来就可以在预览中生成,然后在表单值中生成? 问题答案:
问题内容: 我想卷曲一个URL并将响应捕获到一个变量中。 当我卷曲命令并回显其输出时,我得到如下正确的响应 我想将相同的响应捕获到变量中,并将该响应用于进一步的操作 以下是我的Jenkinsfile 能否请您告诉我我需要在Jenkinsfile中进行哪些更改 问题答案: 如果要从step 返回输出并将其捕获到变量中,则必须更改: 至: 参考: https : //jenkins.io/doc/pi
问题内容: 如何将值从javascript变量传递到razor变量,asp.net mvc razor视图引擎是否可能? 问题答案: 你不能 原因是他们不在同一时间“生活”。Razor变量是“服务器端变量”,在将页面发送到“客户端”后,它们不再存在。 当服务器收到视图请求时,它仅使用HTML,CSS和Javascript代码创建视图。没有C#代码,所有这些都被“翻译”为客户端语言。 当视图仍在服务
这将base64打印到控制台: 来源:https://stackoverflow.com/A/36281449/1063287 我希望能够将base64赋值给一个变量,所以我尝试了以下操作,基于这个答案: 它目前没有向控制台打印任何内容。 问题: 我正在提交一个表单在谷歌应用程序脚本环境。 我以前已经这样做了,并将一个表单对象(包括一个文件)传递给Google Apps脚本函数。 但是,这种方法的
问题 你用lambda定义了一个匿名函数,并想在定义时捕获到某些变量的值。 解决方案 先看下下面代码的效果: >>> x = 10 >>> a = lambda y: x + y >>> x = 20 >>> b = lambda y: x + y >>> 现在我问你,a(10)和b(10)返回的结果是什么?如果你认为结果是20和30,那么你就错了: >>> a(10) 30 >>> b(10)
问题内容: 我有一个程序,在运行过程中有时需要调用python才能执行某些任务。我需要一个调用python并 捕获pythons stdout 并将其放入某个文件的函数。这是函数的声明 我的问题是捕获 给定命令 (pythonInput)的 所有python输出 。我没有使用python API的经验,我不知道执行此操作的正确方法是什么。我尝试过的第一件事是使用Py_run_SimpleStrin