使用Node.js实现SSH服务器登录遇到问题求助
问题分析
你用exec执行ssh命令后只显示空行,核心问题有两个:
exec是回调触发机制,只有当命令完全执行结束才会返回输出,但SSH登录是持续的交互式会话,不会自动终止,所以回调永远不会触发,自然看不到内容。- 子进程没关联当前终端的标准输入/输出/错误流,没法处理SSH的交互式操作(比如输入密码、在服务器端执行命令)。
解决方案
方法1:用spawn替代exec(推荐)
spawn是Node.js更适合处理交互式进程的API,支持流式输出,还能配置终端关联:
const { spawn } = require('child_process'); // 替换成你的服务器IP const sshProcess = spawn('ssh', ['<server-ip>'], { stdio: 'inherit', // 让子进程复用当前终端的输入输出流 shell: true }); sshProcess.on('error', (err) => { console.error(`启动SSH进程失败: ${err.message}`); }); sshProcess.on('exit', (code) => { console.log(`SSH会话已结束,退出码: ${code}`); });
方法2:修改exec配置(仅作参考)
如果坚持用exec,得配置stdio为inherit,但exec的回调机制本身不适合交互式场景:
const { exec } = require('child_process'); exec('ssh <server-ip>', { stdio: 'inherit' }, (error) => { if (error) { console.error(`SSH进程出错: ${error.message}`); } });
关键说明
stdio: 'inherit'是核心配置,它让子进程直接用当前终端的输入输出流,这样SSH的交互(密码输入、命令执行)就能正常工作,和你直接在终端敲ssh <server-ip>效果完全一致。spawn比exec更适合这类长时间运行的交互式进程,它是流式处理,不用等进程结束就能响应输出,而exec会缓存所有输出直到进程终止,不适合持续会话场景。
内容的提问来源于stack exchange,提问作者rzaal
相关产品推荐
相关产品推荐

