Nodejs 实现ssh交互,求助
Nodejs 实现ssh交互,求助
现在有一个需求,远程执行一个ssh脚本,该脚本是需要交互的,脚本
echo -n "是否继续运行(y/n): "
read ty
for ii in $ty
do
case $ii in
yes|y)
echo "请稍等,测试接口中
当出现 是否继续运行(y/n): 输入y继续执行,然后通过node判断日志是否执行成功。
现状:使用ssh2 进行执行,能发起,也能将data输出,但到 是否继续运行(y/n): 就停止执行了,y 无法输入和继续返回日志。
有谁知道怎么实现吗?请指教
当然可以!在 Node.js 中实现 SSH 交互式会话可以通过 ssh2
模块来完成。ssh2
模块提供了丰富的 API 来处理 SSH 连接和命令执行。为了实现与交互式脚本的对话,我们需要监听数据流并手动处理用户输入。
以下是一个简单的示例代码,展示了如何使用 ssh2
模块实现与 SSH 服务器的交互:
-
首先,确保你已经安装了
ssh2
模块:npm install ssh2
-
然后,编写 Node.js 脚本来连接到 SSH 服务器并执行交互式脚本:
const Client = require('ssh2').Client; const conn = new Client(); conn.on('ready', () => { console.log('SSH connection established'); // 执行交互式脚本 conn.exec('sh /path/to/your/script.sh', (err, stream) => { if (err) throw err; let response = ''; let userInput = 'y'; // 用户输入,这里设置为 'y' 作为示例 stream.on('close', (code, signal) => { console.log(`Stream closed with code ${code} and signal ${signal}`); conn.end(); }).on('data', (data) => { console.log(`STDOUT: ${data}`); response += data; // 检查是否需要用户输入 if (response.includes('是否继续运行(y/n):')) { stream.write(userInput + '\n'); // 发送用户输入 } }).stderr.on('data', (data) => { console.log(`STDERR: ${data}`); }); }); }).connect({ host: 'your_ssh_host', port: 22, username: 'your_username', password: 'your_password' });
解释
-
连接到 SSH 服务器:我们创建了一个新的
Client
对象,并使用.connect()
方法连接到 SSH 服务器。 -
执行命令:一旦连接建立,我们使用
.exec()
方法执行远程脚本。stream
对象用于捕获命令的输出。 -
处理输出和输入:我们监听
stream
的data
事件来捕获标准输出(STDOUT)和标准错误输出(STDERR)。当检测到需要用户输入的地方时,我们向stream
写入用户的输入(在这个例子中,我们预设用户输入为'y'
)。 -
关闭连接:当
stream
关闭时,我们结束 SSH 连接。
通过这种方式,你可以实现与 SSH 服务器的交互式对话。你可以根据实际需求调整用户输入的逻辑。
用 expect?? 这是个 shell 命令。
1L正解!用shell+expect来跑!让node来执行shell
要实现与SSH脚本的交互(例如输入y
来继续执行),可以使用ssh2
模块结合readline
模块来处理交互式的输入。以下是一个简单的示例代码,展示如何使用ssh2
连接到远程服务器并执行一个需要交互的SSH脚本。
示例代码
首先,确保你已经安装了ssh2
模块:
npm install ssh2
然后,你可以使用以下代码来实现SSH交互:
const Client = require('ssh2').Client;
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const conn = new Client();
conn.on('ready', () => {
console.log('SSH connection established');
// 执行SSH命令
conn.exec('bash /path/to/your/script.sh', (err, stream) => {
if (err) throw err;
stream.on('close', (code, signal) => {
console.log(`Stream closed with code ${code} and signal ${signal}`);
conn.end();
}).on('data', (data) => {
console.log(`STDOUT: ${data}`);
// 检测是否需要用户输入
if (data.includes("是否继续运行(y/n):")) {
rl.question("请输入 y 或 n: ", answer => {
stream.write(answer + '\n');
});
}
}).stderr.on('data', (data) => {
console.error(`STDERR: ${data}`);
});
});
}).connect({
host: 'your.server.com',
port: 22,
username: 'your_username',
password: 'your_password'
});
解释
- 创建SSH客户端:使用
ssh2
模块创建一个SSH客户端实例。 - 连接到服务器:通过调用
connect
方法连接到远程服务器。 - 执行命令:使用
exec
方法执行远程命令。 - 读取输出:监听
stream
的data
事件来读取命令的输出。 - 处理交互式输入:当检测到需要交互的地方(如
是否继续运行(y/n):
)时,使用readline
模块来提示用户输入,并将用户的输入写入到命令的输入流中。
以上代码展示了如何实现SSH脚本的交互操作。根据你的具体需求,可能还需要进行一些调整。希望这可以帮助你解决问题!