Alexander (HH): Netzwerkdrucker ansprechen exec('echo "text"> /?')

Beitrag lesen

Moin Moin!

genau so was hab ich gesucht :-)

exec ( 'echo "text" | netcat -C -D 192.168.123.40 9100');

Wahrscheinlich geht's auch ohne drei neue Prozesse anzustoßen (shell, echo und netcat), einfach indem Du innerhalb Deines Programms einen Socket öffnest, statt das an netcat zu delegieren. Ich tippe mal auf PHP (weil in so ziemlich jeder anderen Sprache, die auf Unixen läuft, exec() den aktuellen Prozess durch einen anderen ersetzt und deswegen exakt einmal "funktioniert", während PHPs exec() das macht, was allgemein mit system() oder spawn() bezeichnet wird), da findest Du einen Einstieg bei socket_create(), noch besser bei dem Client-Beispiel. Vergiß das ganze HTTP-Theater, schreib einfach "Hallo Welt" in den Socket, das Lesen einer Antwort kannst Du ebenfalls vergessen, der Drucker antwortet in aller Regel mit Text oder Grafik auf Papier, nicht mit Bytes im Socket.

Perl hat Sockets in perlipc dokumentiert, die Beispiel-Clients lesen aber aus dem Socket, statt zu schreiben. Ein einfacher Test könnte so aussehen (ungetestet):

  
#!/usr/bin/perl  
use strict;  
use warnings;  
use IO::Socket;  
  
my $sock=IO::Socket::INET->new(  
    Proto => 'TCP',  
    PeerAddr => 'drucker42.local.lan',  
    PeerPort => 9100,  
) or die "Can't open socket: $!";  
$sock->print("Hallo Welt!\nDieser Text fällt aus dem Drucker\n");  
$sock->close();  

PHP müßte ungefähr so aussehen -- ungetestet, ohne Fehlerprüfungen, frei nach dem Beispiel 2 aus dem Manual:

  
$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);  
socket_connect($sock,"drucker42.local.lan",9100);  
$printjob="Hallo Welt!\nDieser Text fällt aus dem Drucker\n");  
socket_write($sock,$printjob,strlen($printjob));  
socket_close($sock);  

Und wenn ich aus dem Beispiel die $-Zeichen und den "socket_"-Prefix streiche, sieht das schon fast aus wie C (insbesondere das strlen()-Theater. Als ob PHP nicht wüßte, wie lang $printjob ist):

  
#include <sys/socket.h>  
#include <netinet/in.h>  
  
static const char printjob[]="Hallo Welt!\nDieser Text fällt aus dem Drucker\n");  
  
int main(int argc, char**argv)  
{  
   int sockfd;  
   struct sockaddr_in servaddr;  
   sockfd=socket(AF_INET,SOCK_STREAM,0);  
   bzero(&servaddr,sizeof(servaddr));  
   servaddr.sin_family = AF_INET;  
   servaddr.sin_addr.s_addr=inet_addr("drucker42.local.lan");  
   servaddr.sin_port=htons(9100);  
   connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));  
   write(sockfd,printjob,strlen(printjob));  
   close(sockfd);  
}  

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".