2010-10-02 12 views
5

J'ai une application qui s'exécute comme un processus sur un serveur ubuntu. Cette application a la ligne de commande gui qui me permet de taper une commande, puis appuyez sur Entrée et la commande s'exécute. Je suis capable d'écrire la détermination de l'identifiant du processus. Je puis le script qui suit pour l'envoyer une commande:envoyer une commande pour traiter en utilisant/proc

# echo "command" > /proc/<PROCESSID>/fd/0 

J'ai essayé des variations de

# echo "command" > /proc/<PROCESSID>/fd/0 

# echo -e "command\r" > /proc/<PROCESSID>/fd/0 

# echo -e "command\c" > /proc/<PROCESSID>/fd/0 
# echo -e "\015" > /proc/<PROCESSID>/fd/0 

Je sais que le programme devient la commande, mais ne l'exécute pas. Je suppose que c'est parce que je ne suis pas physiquement en train d'appuyer sur Entrée et peut-être que la ligne de commande attend cela. Quelqu'un peut-il me conseiller sur la façon dont je l'utilise incorrectement ou une meilleure option?

+0

'Ligne de commande GUI'? Ou 'interface de ligne de commande'? Si vous conduisez le processus de manière orthodoxe, que tapez-vous au clavier? Ou devez-vous faire quelque chose avec la souris, aussi? Comment savez-vous que le processus obtient la commande? –

+0

UI de ligne de commande est ce que je pense le mieux décrire, il n'y a pas d'interaction avec la souris. En règle générale, je lance le programme via ssh et une ligne de commande basée sur le texte apparaît. Dans cette interface, je peux taper des commandes et elles sont exécutées. Si j'ouvre une seconde interface ssh séparée, je peux taper echo "commande">/proc//fd/0 après avoir déterminé l'ID du processus et il apparaît dans l'interface ssh d'origine mais ne s'exécute pas. – RandyMorris

+0

Question connexe: [Injecter Keystroke à différents processus utilisant Bash] (http://stackoverflow.com/a/11199135/929437) – aland

Répondre

4

Vous ne pouvez pas faire cela./proc/fd/0 n'est (habituellement) pas un tube auquel vous pouvez écrire et donner l'entrée de processus. Ce que vous devez faire, c'est invoquer le processus avec son stdin provenant de quelque chose qui est un tuyau (ou une socket etc) de sorte que vous pouvez écrire des choses dedans.

Un tuyau nommé PEUT fonctionner ici (voir mknod (1) ou mkfifo (3)).

Sinon, vous avez besoin d'un programme de contrôle qui se trouve devant lui et utilise une paire de tuyaux pour lui parler.

+0

vous aviez raison, je envoyais le texte à l'interface, pas le programme. Je vais devoir faire ce que vous avez conseillé et créer un programme pour agir comme un tuyau approprié. Je vous remercie. – RandyMorris

2

Sans connaître les détails, vous avez probablement ceci: expect

+0

J'ai lu un peu à ce sujet, il semble que ce soit l'option à utiliser si vous attendez un certaine invite à laquelle vous pouvez répondre par programme. Suggéreriez-vous encore s'il n'y a pas une telle invite? J'essaie d'utiliser un codage minimal et propre, mais si j'utilise une autre bibliothèque, j'accepterai ... – RandyMorris

+0

De votre commentaire sur la réponse ci-dessus, il semble que vous attendiez une sorte de message: "et une ligne de commande à base de texte apparaît " – ennuikiller

+0

c'était très intéressant à lire, merci pour votre commentaire: D – RandyMorris