2016-02-24 1 views
0

J'utilise la bibliothèque ssh2 pour nodejs.Bibliothèque ssh2 pour nodejs: Erreur: Impossible de demander un pseudo-terminal

# server.coffee 
new ssh2.Server 
    privateKey: fs.readFileSync './id_rsa' 
    port: 57037 
, (client) -> 
    console.log 'Client connected' 

    client.on 'authentication', (ctx) -> 
     ctx.accept() 
    .on 'ready', -> 
     console.log 'Client authenticated' 
     client.on 'session', (accept, reject) -> 
      console.log 'session' 
      session = accept() 
      console.log 'accept' 
      console.log session.on 
      session.on 'shell', (accept, reject, info) -> 
       console.log('Client wants to execute: ' + inspect(info.command)); 
       stream = accept() 
       stream.stderr.write 'Error!' 
       stream.write 'Just kidding' 
       stream.exit 0 
       stream.end() 
      session.on 'error', -> 
       console.log 'error' 

# client.coffee 
conn = new Client() 
conn.on 'ready', -> 
    console.log 'Client :: ready' 
    conn.shell (err, stream) -> 
     console.log 'shell' 
     if err then throw err 
     stream.on 'close', -> 
      console.log 'Stream :: close' 
      conn.end() 
     .on 'data', (chunk) -> 
      console.log 'STDOUT:', data 
     .stderr.on 'data', (chunk) -> 
      console.log 'STDERR:', data 
     stream.end 'ls -al' 
.connect() 

Quand je fais cela, je reçois l'erreur suivante:

Error: Unable to request a pseudo-terminal 
    at C:\Users\pv\Proj\test\ssh-test\node_modules\ssh2\lib\client.js:1160:25 
    at SSH2Stream.<anonymous> (C:\Users\pv\Proj\test\ssh-test\node_modules\ssh2\lib\Channel.js:179:24) 
    at SSH2Stream.emit (events.js:104:17) 
    at parsePacket (C:\Users\pv\Proj\test\ssh-test\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:3225:10) 
    at SSH2Stream._transform (C:\Users\pv\Proj\test\ssh-test\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:552:13) 
    at SSH2Stream.Transform._read [as __read] (_stream_transform.js:179:10) 
    at SSH2Stream._read (C:\Users\pv\Proj\test\ssh-test\node_modules\ssh2\node_modules\ssh2-streams\lib\ssh.js:213:15) 
    at SSH2Stream.Transform._write (_stream_transform.js:167:12) 
    at doWrite (_stream_writable.js:301:12) 
    at writeOrBuffer (_stream_writable.js:288:5) 

Que dois-je faire?

Répondre

0

Vous ne gérez pas l'événement de session pty. L'action par défaut lorsqu'il n'y a pas de gestionnaire d'événements consiste à rejeter la requête. Donc, pour autoriser toutes les demandes pty, ajoutez quelque chose comme ceci:

session.on 'pty', (accept, reject, info) -> 
    accept() 
+0

Oh hey, vous êtes l'auteur de 'ssh2'! Je pensais que l'événement 'shell' était un alias pour ça? C'est ce que l'exemple sur le github m'a amené à croire ... Je suis le premier exemple de serveur. – dopatraman

+0

'shell' est une chose distincte car vous pouvez techniquement demander une session shell interactive sans allouer de pty (par exemple, le client OpenSSH peut le faire avec l'indicateur' -T'). – mscdex

+0

Comment se fait-il que mon exemple ne fonctionne pas alors? Est-ce que shell dépend de 'pty'? – dopatraman