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 :-)
- 1607 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Rontsam el vele a működő kódot? :-)
- A hozzászóláshoz be kell jelentkezni