Fernando Silveira writes:

Hi,

  Well, I made this patch a long time ago (08/2002) because it was a
  need of a project, but had no time to send it to you. It adds support
  to `autologin' option of the telnet protocol. It has been used since
  made with busybox 0.60.3 at production and I had no problems with it.
  I have ported it to the HEAD revision of the CVS server (20040211) and
  I hope you enjoy and apply it to the official sources. :)

Thanks a lot!
This commit is contained in:
Eric Andersen 2004-02-22 12:25:47 +00:00
parent df2c56529c
commit 539ffc9129
3 changed files with 110 additions and 0 deletions

View File

@ -2415,11 +2415,26 @@
"$ cat /tmp/foo\n" \ "$ cat /tmp/foo\n" \
"Hello\n" "Hello\n"
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
#define telnet_trivial_usage \
"[-a] [-l USER] HOST [PORT]"
#define telnet_full_usage \
"Telnet is used to establish interactive communication with another\n" \
"computer over a network using the TELNET protocol.\n\n" \
"Options:\n" \
"\t-a\t\tAttempt an automatic login with the USER variable.\n" \
"\t-l USER\t\tAttempt an automatic login with the USER argument.\n" \
"\tHOST\t\tThe official name, alias or the IP address of the\n" \
"\t\t\tremote host.\n" \
"\tPORT\t\tThe remote port number to connect to. If it is not\n" \
"\t\t\tspecified, the default telnet (23) port is used.\n"
#else
#define telnet_trivial_usage \ #define telnet_trivial_usage \
"HOST [PORT]" "HOST [PORT]"
#define telnet_full_usage \ #define telnet_full_usage \
"Telnet is used to establish interactive communication with another\n"\ "Telnet is used to establish interactive communication with another\n"\
"computer over a network using the TELNET protocol." "computer over a network using the TELNET protocol."
#endif
#ifdef CONFIG_FEATURE_TELNETD_INETD #ifdef CONFIG_FEATURE_TELNETD_INETD
#define telnetd_trivial_usage \ #define telnetd_trivial_usage \

View File

@ -479,6 +479,16 @@ config CONFIG_FEATURE_TELNET_TTYPE
remote host you are connecting to. This is useful to make sure that remote host you are connecting to. This is useful to make sure that
things like ANSI colors and other control sequences behave. things like ANSI colors and other control sequences behave.
config CONFIG_FEATURE_TELNET_AUTOLOGIN
bool " Pass USER type to remote host"
default y
depends on CONFIG_TELNET
help
Setting this option will forward the USER environment variable to the
remote host you are connecting to. This is useful when you need to
log into a machine without telling the username (autologin). This
option enables `-a' and `-l USER' arguments.
config CONFIG_TELNETD config CONFIG_TELNETD
bool "telnetd" bool "telnetd"
default n default n

View File

@ -28,6 +28,8 @@
* Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen <andersen@codepoet.org> * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen <andersen@codepoet.org>
* Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan * Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan
* <jam@ltsp.org> * <jam@ltsp.org>
* Modified 2004/02/11 to add ability to pass the USER variable to remote host
* by Fernando Silveira <swrh@gmx.net>
* *
*/ */
@ -129,6 +131,10 @@ static int one = 1;
static char *ttype; static char *ttype;
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
static char *autologin;
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
static int win_width, win_height; static int win_width, win_height;
#endif #endif
@ -355,6 +361,34 @@ static void putiac_subopt(byte c, char *str)
} }
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
static void putiac_subopt_autologin(void)
{
int len = strlen(autologin) + 6; // (2 + 1 + 1 + strlen + 2)
char *user = "USER";
if (G.iaclen + len > IACBUFSIZE)
iacflush();
putiac(IAC);
putiac(SB);
putiac(TELOPT_NEW_ENVIRON);
putiac(TELQUAL_IS);
putiac(NEW_ENV_VAR);
while(*user)
putiac(*user++);
putiac(NEW_ENV_VALUE);
while(*autologin)
putiac(*autologin++);
putiac(IAC);
putiac(SE);
}
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
static void putiac_naws(byte c, int x, int y) static void putiac_naws(byte c, int x, int y)
{ {
@ -495,6 +529,20 @@ static inline void to_ttype(void)
} }
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
static inline void to_new_environ(void)
{
/* Tell server we will (or will not) do AUTOLOGIN */
if (autologin)
putiac2(WILL, TELOPT_NEW_ENVIRON);
else
putiac2(WONT, TELOPT_NEW_ENVIRON);
return;
}
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
static inline void to_naws(void) static inline void to_naws(void)
{ {
@ -513,6 +561,9 @@ static void telopt(byte c)
#ifdef CONFIG_FEATURE_TELNET_TTYPE #ifdef CONFIG_FEATURE_TELNET_TTYPE
case TELOPT_TTYPE: to_ttype();break; case TELOPT_TTYPE: to_ttype();break;
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
case TELOPT_NEW_ENVIRON: to_new_environ(); break;
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
case TELOPT_NAWS: to_naws(); case TELOPT_NAWS: to_naws();
putiac_naws(c, win_width, win_height); putiac_naws(c, win_width, win_height);
@ -539,6 +590,11 @@ static int subneg(byte c)
else else
if (c == TELOPT_TTYPE) if (c == TELOPT_TTYPE)
putiac_subopt(TELOPT_TTYPE,ttype); putiac_subopt(TELOPT_TTYPE,ttype);
#endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
else
if (c == TELOPT_NEW_ENVIRON)
putiac_subopt_autologin();
#endif #endif
break; break;
case TS_SUB2: case TS_SUB2:
@ -579,6 +635,10 @@ extern int telnet_main(int argc, char** argv)
int maxfd; int maxfd;
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
int opt;
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
get_terminal_width_height(0, &win_width, &win_height); get_terminal_width_height(0, &win_width, &win_height);
#endif #endif
@ -598,8 +658,33 @@ extern int telnet_main(int argc, char** argv)
if (argc < 2) if (argc < 2)
bb_show_usage(); bb_show_usage();
#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
autologin = NULL;
while ((opt = getopt(argc, argv, "al:")) != EOF) {
switch (opt) {
case 'l':
autologin = bb_xstrdup(optarg);
break;
case 'a':
autologin = getenv("USER");
break;
case '?':
bb_show_usage();
break;
}
}
if (optind < argc) {
bb_lookup_host(&s_in, argv[optind++]);
s_in.sin_port = bb_lookup_port((optind < argc) ? argv[optind++] :
"telnet", "tcp", 23);
if (optind < argc)
bb_show_usage();
} else
bb_show_usage();
#else
bb_lookup_host(&s_in, argv[1]); bb_lookup_host(&s_in, argv[1]);
s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23); s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23);
#endif
G.netfd = xconnect(&s_in); G.netfd = xconnect(&s_in);