- 论坛徽章:
- 0
|
最近安装了一个openbsd4.5,出于安全考虑openbsd缺省并不安装telnet服务,并且源码包中也没有提供相应代码文件。在网上搜索了N久几乎没有任何有用信息,最后通过openbsd提供的cvs下载到了相应的源码。在编译安装过程颇费了些周折,现记录如下:
安装环境为windows xp + vmware 6.0
cvs上所需项目文件:
src/libexec/telnetd
src/lib/libtelnet
其他文件:
install45.iso (系统安装光盘映象,234M)
src.tar.gz(源码包,110M)
系统安装过程就不多说了,安装源码包:
#cd /usr/src
tar xzvf src.tar.gz
上传telnetd源码:src/libexec/telnetd src/lib/libtelnet
目录结构应为:/usr/src/libexec/telnetd /usr/src/lib/libtelnet
首先编译libtelnet:
cd /usr/src/lib/libtelnet
make
编译无法通过,一大堆错误。看了提示,估计是和平台相关的东西。修改Makefile如下:- # from: @(#)Makefile 8.2 (Berkeley) 12/15/93
- # $NetBSD: Makefile,v 1.31 2008/08/29 00:02:22 gmcgarry Exp $
- USE_FORT?= yes # network protocol library
- LIBISPRIVATE= yes
- .include <bsd.own.mk>
- WARNS?= 1
- LIB= telnet
- SRCS= auth.c encrypt.c genget.c getent.c misc.c
- CPPFLAGS+= -DHAS_CGETENT -Dlint
- CPPFLAGS+= -I${.CURDIR}
- #.if (${USE_KERBEROS} != "no")
- #SRCS+= enc_des.c
- #CPPFLAGS+= -DENCRYPTION -DAUTHENTICATION
- #CPPFLAGS+= -DDES_ENCRYPTION
- #SRCS+= kerberos5.c
- #CPPFLAGS+= -DKRB5
- #CPPFLAGS+= -I${DESTDIR}/usr/include/krb5
- #.endif
- #.if ${USE_PAM} != "no" && ${MKCRYPTO} != "no"
- #SRCS+= sra.c pk.c
- #CPPFLAGS+= -DSRA
- #.endif
- #.if (defined(HAVE_GCC) && ${HAVE_GCC} == 4) || defined(HAVE_PCC)
- #.for f in auth enc_des kerberos5 pk
- #COPTS.${f}.c+= -Wno-pointer-sign
- #.endfor
- #.endif
- .include <bsd.lib.mk>
复制代码 再次make,依然不能通过,错误信息如下:
encrypt.c:36: error: syntax error before string constant
vi encrypt.c 注释掉33-37行,编译OK
回过来编译telnetd:
cd /usr/src/libexec/telnetd
make 同样是一大堆报错,有些提示跟编译libtelnet.a类似。修改Makefile如下:- # $NetBSD: Makefile,v 1.45 2009/03/16 02:24:57 lukem Exp $
- # from: @(#)Makefile 8.2 (Berkeley) 12/15/93
- WARNS?= 2 # XXX: const issues in sys_term.c
- .include <bsd.own.mk>
- MAN= telnetd.8
- PROG= telnetd
- CPPFLAGS+=-DLINEMODE -DKLUDGELINEMODE -DDIAGNOSTICS -Dlint
- CPPFLAGS+=-DOLD_ENVIRON -DENV_HACK -DSECURELOGIN -DSUPPORT_UTMP #-DSUPPORT_UTMPX
- SRCS= authenc.c global.c slc.c state.c sys_term.c telnetd.c \
- termstat.c utility.c
- DPADD= ${LIBTELNETDIR}/libtelnet.a ${LIBTERMCAP} ${LIBUTIL}
- LDADD+= ${LIBTELNETDIR}/libtelnet.a -ltermcap -lutil
- CPPFLAGS+=-I${NETBSDSRCDIR}/lib
- CPPFLAGS+=-I${.CURDIR}
- LIBTELNETDIR=/usr/src/lib/libtelnet
- #LIBTELNETDIR!= cd ${.CURDIR}/../../lib/libtelnet; ${PRINTOBJDIR}
- #.if (${USE_KERBEROS} != "no")
- #CPPFLAGS+=-I${DESTDIR}/usr/include/krb5
- #CPPFLAGS+=-DKRB5 -DAUTHENTICATION -DENCRYPTION
- #LDADD+= -lkrb5 -lasn1 -lcrypto -lcrypt
- #DPADD+= ${LIBKRB5} ${LIBASN1} ${LIBCRYPTO} ${LIBCRYPT}
- #.if (${USE_PAM} != "no")
- #LDADD+= -lpam ${PAM_STATIC_LDADD}
- #DPADD+= ${LIBPAM} ${PAM_STATIC_DPADD}
- #.endif
- #VERS!= cd ${NETBSDSRCDIR}/lib/libvers && ${PRINTOBJDIR}
- #LDADD+= -ldes -lcom_err -L${VERS} -lvers -lroken
- #DPADD+= ${LIBDES} ${LIBCOM_ERR} ${LIBROKEN}
- #.endif
- .include <bsd.prog.mk>
复制代码 修改之后编译应该能够通过,运行telnetd,提示:
./telnetd: getpeername: Socket operation on non-socket
google了下出错信息,解决办法是该服务应该由inetd来启动。
vi /etc/inetd.conf
加入如下行:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd
telnet stream tcp6 nowait root /usr/libexec/telnetd telnetd
第二行应该是支持IP v6的,可以不要。
cp -p telnetd /usr/libexec/
重启inetd服务:
kill -HUP `cat /var/run/inetd.pid`
查看telnet是否起来:
# netstat -na|grep LISTEN|grep 23
尝试登录,连接直接中断了,提示login 不支持选项 -a
grep login *.c
问题出在sys_term.c
vi sys_term.c
修改函数start_login()
注释掉下面行:- //argv = addarg(argv, "-a");
- //(void)strvisx(buf, (const char *)(const void *)&from, sizeof(from),
- // VIS_WHITE);
- //argv = addarg(argv, buf);
复制代码 重新make
cp -p telnetd /usr/libexec/
kill -HUP `cat /var/run/inetd.pid`
尝试root用户登录,连接会被拒绝(如何修改没有继续研究了),新建了普通用户,可以正常登录,但不能su成root用户,提示与root不在同一个成员组。
telnetd.tgz.rar
(151.91 KB, 下载次数: 91)
|
|