Hans Hüttel <2538015m001@mail1.stofanet.dk> writes:
> Men nu til mit naive spørgsmål: Hvordan kommer man lettest på StofaNet
> under OS X? Jeg har lige nu valgt den lidt underlige løsning at bruge
> programmet StofaNet SignOn under Classic - men der må da være en mere
> naturlig løsning.
Hvis ikke man er ked af at skulle starte en browser og at gemme sine
passwords i cookies, saa kan man selvfoelgelig bruge signon.stofanet.dk
> Nogen der har erfaringer?
Jeg vidste ikke, at signon.stofanet.dk var under opsejling, da jeg
installerede OS X, saa jeg forsoegte foerst at bruge det bash/expect
script, jeg plejede at bruge paa linux(ppc). Saa gav det mig problemer
at faa expect og tcl installeret rigtigt, fordi jeg ikke vidste, hvordan
man bliver en rigtig rod (det ved jeg nu).
Derfor skrev jeg et lille C-program, der kunne tricket (det er ikke koent,
men der virker, er naturligt og effektivt):
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/telnet.h>
#include <unistd.h>
#include <string.h>
int expect( int fd, const char *str ) {
int r, l;
unsigned char resp[ 1024 ];
l = strlen( str );
while ( r = read( fd, resp, 1000 ) ) {
resp[ r ] = 0;
if ( !strcmp( resp + r - l, str ) ) {
/* printf( "Yes!\n" ); */
return( 1 );
}
else {
/* printf( "No!\n" ); */
}
}
return( 0 );
}
int main( int argc, char *argv[] ) {
int descr, r;
struct sockaddr *sp;
struct in_addr inad;
struct sockaddr_in sad;
char send[ 1024 ];
if ( inet_aton( "192.168.30.2", &inad ) ) {
/* printf( "Yes: %d\n", inad.s_addr ); */
}
else {
printf( "No!\n" );
exit( 1 );
}
descr = socket(PF_INET, SOCK_STREAM, 0);
if ( descr == -1 ) {
printf( "No socket!\n" );
exit( 1 );
}
/* printf( "sock: %d\n", descr ); */
sad.sin_family = AF_INET;
sad.sin_addr = inad;
sad.sin_port = htons( 259 );
/* printf( "port: %d\n", sad.sin_port ); */
sp = ( struct sockaddr * )&sad;
if ( connect( descr, sp, sizeof( sad ) ) == -1 ) {
printf( "No connection!\n" );
exit( 1 );
}
printf( "Connected!\n" );
printf( "Starting communication...\n" );
if ( expect( descr, "ogin: " ) ) {
strcpy( send, "XXXXXXXsXXX\n" ); /* dit brugernavn her!!!!!!!!!! */
write( descr, send, strlen( send ) );
}
else {
printf( "Didn't get asked to login
\n" );
}
if ( expect( descr, "assword: " ) ) {
strcpy( send, "XXXXXXXX\n" ); /* dit password her!!!!!!!!!! */
write( descr, send, strlen( send ) );
}
else {
printf( "Didn't get asked for my password
\n" );
}
if ( expect( descr, "hoice: " ) ) {
strcpy( send, argv[ 1 ] );
strcpy( send + 1, "\n" );
write( descr, send, strlen( send ) );
}
else {
printf( "Didn't get asked for my password
\n" );
}
while ( r = read( descr, send, 1000 ) ) {
if ( r > 2 ) {
send[ r ] = 0;
printf( send );
}
}
close( descr );
}
Saa vidt jeg kan se paa din signatur vil det ikke give dig problemer
at kompilere og bruge dette program? Det skal have den kommando, som
loginserveren skal have som kommandolinieargument
1: sign on
2: sign off
3: status
Men faelt er det med sine hardcodede logins og passwords. OK - dem kan man
jo sagtens flytte ud i en fil og kryptere (UNIX er herligt), men det
lader jeg staa som en oevelse
Mit valg var i stedet at indkapsle ovenstaaende faele kode i en rigtig
Objective-C Cocoa applikation (min foerste). Den virker, men jeg har
ikke lige haft tid til at lave den konfigurerbar, sa andre end jeg kan
bruge den.
Hvis der er interesse, skal jeg nok lave den. Den skal jo bruge de
helt rigtige OS X preferences mekanismer, hvis det skal vaere rigtig,
men vi kan da hurtigt lave en unix-version, som bare bruger
en ~/.stofaconnetction fil eller saadan noget....
--
Jakob