간단한 CLI에서 작업하고 있는데, 그 중 하나는 ssh를 원격 서버에 실행하는 것입니다. ,Node.js readline with interactive child_process spawning
#!/usr/bin/env node
var spawn = require('child_process').spawn;
var readline = require('readline');
var iface =readline.createInterface({
input: process.stdin,
output: process.stdout
});
iface.setPrompt("host> ");
iface.on("line", function(line) {
if (line.trim() == "") {
return iface.prompt();
}
var host = line.split()[0];
iface.pause(); // PAUSING STDIN!
var proc = spawn('ssh', [ host, '-l', 'root', '-o', 'ConnectTimeout=4' ], { stdio: [0,1,2] });
proc.on("exit", function(code, signal) {
iface.prompt();
});
});
iface.prompt();
내가이 줄을 제거하는 경우에만, 일부 기호가 원격 서버에 의해 사로 잡았됩니다 STDIN에서 읽을 자식 프로세스 수 있도록 iface.pause()를 사용 이 무슨 뜻인지의 예입니다 다른 것들 - 로컬 readline. 그러나이 pause()
은 실제로 stdin을 고정 시키므로 ssh가 연결을 기다리는 시간이 너무 길거나 암호를 묻는 경우 stdin이 일시 중지 되었기 때문에 어떤 문자도 보낼 수 없습니다. 나는 정말로 ssh가 어떻게 연결 (일시 중지 된 상태)을 처리했는지 알지 못한다. 그러나 정상적으로 연결되었지만 어떻게 든 작동한다. 문제는 "대화 형 자식 프로세스가 작동하는 동안 그것을 일시 중지하지 않고 readline에서 stdin을 분리하고 자식 프로세스가 완료된 후 다시 연결하는 방법"입니다.
@mscdex 여기에서 반갑습니다. 이미'ssh2' 모듈을 사용해 보았습니다. 그리고 한 번에 여러 서버에서 작업을 병렬로 실행하는 데 정말 좋습니다. 그러나 나를 위해'ssh2'를 통해 대화식 쉘을 구현하는 것은 정말 골칫거리입니다. 탭 자동 완성 및 기타 원시 tty 동작을 중단시키지 않고 창 크기 조정을 처리하기 위해 수행해야하는 작업의 수는 원시 ssh를 사용하는 것이 더 간단하다고 생각하게 만듭니다. –