[megoldva] ssh ProxyCommand; Protocol mismatch

Fórumok

Elkezdtem írni egy ProxyCommand-ként használandó programot linux-ra. Napok óta nem tudom kitalálni, miért nem működik.Indítottam egy ssh tunnelt; kipróbáltam, működik:


ssh -AxfNy -D '127.0.0.1:1089' 127.0.0.1
ssh 127.0.0.1 -o "ProxyCommand nc -X 4 -x 127.0.0.1:1089 %h %p" echo OK

Írtam egy kis programot:


#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

#define BUFFLEN (4096)
char buff[BUFFLEN];

int main( void ){
  int s = socket( AF_INET, SOCK_STREAM, 0 );
  struct sockaddr_in sa;
  memset( &sa, 0, sizeof(sa) );
  sa.sin_family      = AF_INET;
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  sa.sin_port        = htons(1089);
  connect( s, (struct sockaddr*)&sa, sizeof(sa) );

  struct socks4_cmd {
    uint8_t  ver;
    uint8_t  dir;
    uint16_t port;
    uint32_t addr;
    uint8_t  user;
  } cmd = (struct socks4_cmd){4,1,htons(22),inet_addr("127.0.0.1"),0};

  write( s, &cmd, sizeof(cmd) );
  int len=read( s, &cmd, 8 );
  if( cmd.dir == 0x5A ){
    int ret=fork();
         if( ret == 0 ){ while( (len=read(0,buff,BUFFLEN))>0 ) write(s,buff,len); }
    else if( ret >  0 ){ while( (len=read(s,buff,BUFFLEN))>0 ) write(1,buff,len); }
  }
  return 0;
}

Kipróbáltam, de nem működik:


# ssh 127.0.0.1 -o "ProxyCommand ./test" echo OK
Bad packet length 1349676916.
Disconnecting: Packet corrupt

A 1349676916 igazából egy szöveg első 4 karaktere: 'Protolcol mismatch'. Ezt az sshd küldi vissza, a sikeresen felépült socks4 tunnel-en keresztül, a kapcsolatfelvétel (SSH2_MSG_KEXINIT) során.

Úgy tűnik, mintha a fork() utáni sorokban lenne a hiba. Szóljon akinek van ötlete hogy mi lehet a hiba oka.

Elszoktam a C-től, nem vitás. A hibás részlet:


write( s, &cmd, sizeof(cmd) );

Helyesen:


write( s, &cmd, 9 );

Tanulság: a forráskód publikálása segíti a hibakeresést :-)

Hozzászólások

Sztem ezt igy ne. Inkabb: sizeof(struct socks4_cmd)
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal