Jak poslat programu textovou zprávu na standardni vstup stdin?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Říjen 22 21:58:33 CEST 2006


On 16 Oct 2006, condor wrote:

> Ahoj, potřeboval bych poslat programu na standardní vstup stdin
> řetězec. Mám konzolovou aplikaci, kde do konzoly píši příkazy a
> potřebuji příkaz poslat ze vzdáleného počítače.
[...]
> Zkusil jsem tedy poslat procesu zprávu na /proc/CisloProcesu/fd/0.
> Zpráva se vypsala na konzolu, ale na stdin nepřišla.

No samozřejmě. Když otevřete "/proc/CisloProcesu/fd/0", tak otevřete 
soubor či zařízení (či jinou podobnou věc), co má jmenovaný proces na 
fd 0. Pravděpodobně jeho terminál, a tudíž se to, co tam zapíšete, vypíše 
na ten terminál. Ale jde to úplně mimo ten proces.

Nechce se mi tu knížku stahovat a zkoumat, co je tam napsané, ale buď to 
tam mají blbě, nebo jste to špatně pochopil.

Pokud chcete něco propašovat na vstup cizího procesu, tak to musíte udělat 
jinak:

- Některé terminály lze přesvědčit, aby víceméně doslova poslaly to, 
  co jim pošlete jakoby na obrazovku, zpátky jakoby vstup k klávesnice.
  Detaily si nepamatuju.

- Je-li to pseudoterminál, můžete se pokusit zapisovat do jeho "master"
  konce. Ale má obavu, že při pokusu otevřít /dev/ptmx přes /proc
  získáte akorát další nezávislý klon a u BSD pseudoterminálů zase
  narazíte na to, že /dev/ptyXY je exkluzívní zařízení a jádro nepovolí
  nikomu dalšímu, aby to otevřel.

- Samozřejmě se můžete vždycky, máte-li patřičná privilegia,  přes 
  ptrace() napíchnout na příslušný proces a přimět ho, aby při nejbližším
  volání read(0, ...) vrátil nějaká předložená data.

Osobně bych hledal jiné řešení. Třeba něco jako program Screen. Nebo 
upravit ten program.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux