2017-02-22 9 views
3

J'utilise perl Net :: SSH2 v0.48 et j'essaie d'exécuter un script distant qui lit l'entrée de stdin. Le canal de cette connexion utilise vt100 pty pour certaines exigences spécifiques. Après avoir écrit des données à stdin, j'appelle également $channel->send_eof();. Mais le script distant ne semble pas recevoir de caractère EOF du tout. Le script distant est en python et lit à partir de stdin comme sys.stdin.read() et il se bloque jusqu'à ce qu'il obtienne un EOF. Ce problème est simplement résolu lorsque je désactive pty ou que j'appose chr(4) avec une charge utile d'entrée qui est le caractère EOF.Perl Net :: SSH2 en mode pty et EOF

Questions:

  1. Toute idée pourquoi send_eof() ne fonctionne pas?
  2. Quelle est la meilleure façon de résoudre ce problème?
  3. Puis-je supposer que send_eof() n'est pas requis si pty est activé?

P.S. Je n'inclus aucun extrait de code pour le moment car le code de production est trop complexe pour expliquer le problème et il faudra du temps pour préparer une version de code minimale. Mais je vais essayer de mettre à jour ma question avec un échantillon de code bientôt. Puis-je supposer que send_eof() n'est pas requis si pty est activé?

+0

La version 0.48 est assez ancienne et buggée. Vous devriez en utiliser un plus récent. – salva

Répondre

2

De docs:

send_eof

Envoie un EOF sur le côté distant.

Après l'envoi d'un message EOF, aucune donnée supplémentaire ne peut être envoyée au canal STDIN du processus distant.

Notez que si un PTY a été demandé pour le canal, l'EOF peut être ignoré par le serveur distant.

+0

'EOF peut être ignoré par le serveur distant', cela ne signifie-t-il pas que l'EOF peut être ignoré même si j'ajoute cela comme une partie de mes données d'entrée? Évidemment, cela ne se produit pas, mais il semble qu'il pourrait y avoir plus d'information pour avoir une vue d'ensemble. – Samiron

+0

Les périphériques TTY ne permettent pas de fermer un seul côté de la connexion. C'est pourquoi les requêtes EOF au niveau du canal sont ignorées. – salva