Schreiben Sie in den Standard eines laufenden Prozesses mit dem gleichen Effekt / Verhalten wie beim direkten Schreiben

8

Dieser Beitrag beantwortet meine Frage nur teilweise. Mein Problem ist, dass das Schreiben in den Standard des laufenden Prozesses mit dem FD des Prozesses im Dateisystem / proc nicht den gleichen Effekt hat.

Problem:

  1. Starten Sie nc, um Port 10000 abzuhören (dieser Vorgang wird als weiteres nc 1 bezeichnet).

    nc -l 10000
    
  2. starte ein anderes nc, um Zeichen an das hörende nc zu senden (dies ist nc 2)

    nc localhost 10000
    
  3. Schreiben Sie an den Standard auf dem NC 2

    echo "some chars here" >> /proc/[PID-nc-2]/fd/0
    

das problem: "einige zeichen hier" kommen nicht zum hörenden nc (nc 1), ABER werden auf der konsole des nc 2 angezeigt.

Frage: Warum und ist es möglich, dass dies funktioniert?

Geo
quelle

Antworten:

11

Dies funktioniert nicht wie erwartet, da /proc/<PID>/fd/0es sich nicht um eine Pipe handelt. Wenn Sie die sendende Seite aufrufen, deren Standard an eine Pipe angeschlossen ist, funktioniert dies

Auf dem empfangenden Host

nc -l 10000

Auf dem sendenden Host

mkfifo my.fifo
cat >my.fifo &
cat my.fifo | nc remotehost.tld 10000

Jetzt kannst du

echo "Hello World" >my.fifo
myprog >my.fifo

Beachten Sie, dass das cat >my.fifoerforderlich ist, um das FIFO offen zu halten, da sonst ein EOF gesendet und die Verbindung vorzeitig geschlossen wird. Um die Verbindung zu beenden, müssen Sie den Cat-Prozess beenden, der das Fifo offen hält.

user9517
quelle
Sehr hilfreich! In meinem Fall hat dies die Kommunikation mit einem Prozess tatsächlich erleichtert , da die FIFO-Dauerwellen es einem normalen Benutzer ermöglichen können, ein Sudo'ne-Skript zu beeinflussen.
Natevw
1

Wie in der Antwort auf den von Ihnen verlinkten Beitrag angegeben, müssen Sie /proc/pid/fd/0nicht schreiben /proc/pid/fd/1.

Michael Hampton
quelle
1
Ich habe meine Frage korrigiert. Aber trotzdem: Ich habe sowohl / fd / 0 als auch / fd / 1 ausprobiert. Die Frage bleibt ...
Geo
Ich habe es versucht, aber vor kleinen Problemen. Es sendet die erforderliche Domain an Telnet, aber ich denke, es erfordert eine Art Wagenrücklauf oder ein neues Zeilenzeichen, das ich nicht an es weitergeben kann
Farhan