2014-01-30 3 views
0

Я работаю с node.js, и я пытаюсь встроить консоль в веб-браузер для работы на удаленном сервере. Веб-приложение делает соединение, поэтому пользователю не нужно делать ssh [email protected], но только команды типа.ssh постоянные сессии с node.js

Я пробовал модуль node.js 'ssh2 и другие модули, которые используют ssh2. Но у меня всегда одна и та же проблема. Каждый раз, когда я выполняю команду программно, используя exec(), сеанс ssh перезапускается. Я объясню это лучше с примера.

> ls 

возвращает содержимое домашнего каталога, один из каталогов в домашней директории mydir

> cd mydir 
> ls 

возвращает содержимое домашнего каталога еще раз, потому что после того, как команда выполнила SSH сессия закрытая/перезапущен.

Любая библиотека node.js, которая может выполнять эту работу? или даже библиотека другой технологии, отличной от javascript?

Edit: Другой пример для уточнения, использовании модуля Node.js' ssh-exec Сервер должен выполнить некоторые команды в другой машине с помощью SSH. Функция на сервере содержит следующий код

var c = exec.connection('[email protected]'); // It takes the ssh key from the default location 
exec('cd mydir', c).pipe(process.stdout); 
exec('ls -lh', c).pipe(process.stdout); 

Как вы видите, я не заканчивается соединение после первого exec, но на выходе я получаю это содержание домашней директории не содержание Mydir каталога, потому что сеанс ssh сбрасывается после каждого exec.

ответ

1

Составитель модуля node.js 'ssh2 предоставил решение.

Использовать метод shell() вместо метода exec().

Метод shell() создает интерактивный сеанс с подключаемым нами сервером. Метод shell() предоставляет поток в качестве параметра его обратного вызова (например, метод exec()).

Как при использовании exec(), stream.on('data', function(data, extended) {...}); может использоваться для вывода команд. Однако в этом случае для предоставления команд (ввода) к компьютеру, с которым вы подключились, вам необходимо использовать stream.write(yourcommand+'\n');

PS.Не стесняйтесь редактировать, чтобы повысить точность ответа.

0

Я должен угадать, но вы делаете что-то вроде child = exec('ssh [email protected] ls')?

Вы можете сделать что-то вроде

child = exec('ssh [email protected]'); 

авансовые и в "петле" вашего браузера

child.stdin.write('ls\n'); 

Когда закончите, просто закройте stdin:

child.stdin.end() 

который также заканчивается дочерний процесс.

+0

Это не так. Я использую ajax для вызова функции на сервере, которая ранее создала соединение shh и выполняла 'connection.exec ('cd mydir')'. Позже, другой запрос ajax вызывает функцию с другой командой; функция выполняет команду, выполняющую 'connection.exec ('ls')'. У меня нет проблем с выходом, а его получение и печать на нем прекрасны, но вывод не является ожидаемым (это не содержание mydir, а содержимое домашнего каталога), потому что сеанс ssh, кажется, сбрасывается после каждого exec :( –

+0

Не сильно изменится. У вас все еще есть новый контекст с вашими вызовами exec. Вам нужно открыть на стороне сервера ssh-соединение и оставить его открытым (и тайм-аут простоя, если хотите). – CFrei

+0

Что я пытаюсь объяснить, что это не работает.Если я открываю соединение на стороне сервера и программно, сразу после этого, я делаю 'connection.exec ('cd mydir')', и сразу я делаю 'connection.exec ('ls ') 'результат не ожидается, потому что соединение, кажется, сбрасывается после каждого exec.Я отредактирую свой вопрос, чтобы уточнить с помощью примера. –

0

Я знаю, что эта ссылка устарела, но я подумал, что это может помочь кому-то, если они ищут решение.

Использовать метод shell() вместо метода exec().

Работы. Вот еще одно решение. Использовать абсолютные пути к файлу, то есть

conn.exec("mkdir -p /home/user/Direc/{one,two,three}/", function(err, stream) { 
     if (err) throw err; 
     stream.on('data', function(data) { 
      console.log('STDOUT: ' + data); 
     }).stderr.on('data', function(data) { 
      console.log('STDERR: ' + data); 
     }); 
    }); 

conn.exec("ls -la /home/user/", function(err, stream) { 
    if (err) throw err; 
    stream.on('close', function(code, signal) { 
     console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); 
     conn.end(); 
    }).on('data', function(data) { 
     console.log('STDOUT: ' + data); 
    }).stderr.on('data', function(data) { 
     console.log('STDERR: ' + data); 
    }); 
}); 
Смежные вопросы