⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readconf.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland *                    All rights reserved * Functions for reading the configuration files. * * As far as I am concerned, the code I have written for this software * can be used freely for any purpose.  Any derived versions of this * software must be clearly marked as such, and if the derived work is * incompatible with the protocol description in the RFC file, it must be * called by a name other than "ssh" or "Secure Shell". */#include "includes.h"RCSID("$OpenBSD: readconf.c,v 1.100 2002/06/19 00:27:55 deraadt Exp $");#include "ssh.h"#include "xmalloc.h"#include "compat.h"#include "cipher.h"#include "pathnames.h"#include "log.h"#include "readconf.h"#include "match.h"#include "misc.h"#include "kex.h"#include "mac.h"/* Format of the configuration file:   # Configuration data is parsed as follows:   #  1. command line options   #  2. user-specific file   #  3. system-wide file   # Any configuration value is only changed the first time it is set.   # Thus, host-specific definitions should be at the beginning of the   # configuration file, and defaults at the end.   # Host-specific declarations.  These may override anything above.  A single   # host may match multiple declarations; these are processed in the order   # that they are given in.   Host *.ngs.fi ngs.fi     User foo   Host fake.com     HostName another.host.name.real.org     User blaah     Port 34289     ForwardX11 no     ForwardAgent no   Host books.com     RemoteForward 9999 shadows.cs.hut.fi:9999     Cipher 3des   Host fascist.blob.com     Port 23123     User tylonen     RhostsAuthentication no     PasswordAuthentication no   Host puukko.hut.fi     User t35124p     ProxyCommand ssh-proxy %h %p   Host *.fr     PublicKeyAuthentication no   Host *.su     Cipher none     PasswordAuthentication no   # Defaults for various options   Host *     ForwardAgent no     ForwardX11 no     RhostsAuthentication yes     PasswordAuthentication yes     RSAAuthentication yes     RhostsRSAAuthentication yes     StrictHostKeyChecking yes     KeepAlives no     IdentityFile ~/.ssh/identity     Port 22     EscapeChar ~*//* Keyword tokens. */typedef enum {	oBadOption,	oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,	oPasswordAuthentication, oRSAAuthentication,	oChallengeResponseAuthentication, oXAuthLocation,#if defined(KRB4) || defined(KRB5)	oKerberosAuthentication,#endif#if defined(AFS) || defined(KRB5)	oKerberosTgtPassing,#endif#ifdef AFS	oAFSTokenPassing,#endif	oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,	oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,	oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,	oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,	oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts,	oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oMacs,	oGlobalKnownHostsFile2, oUserKnownHostsFile2, oPubkeyAuthentication,	oKbdInteractiveAuthentication, oKbdInteractiveDevices, oHostKeyAlias,	oDynamicForward, oPreferredAuthentications, oHostbasedAuthentication,	oHostKeyAlgorithms, oBindAddress, oSmartcardDevice,	oClearAllForwardings, oNoHostAuthenticationForLocalhost,	oDeprecated} OpCodes;/* Textual representations of the tokens. */static struct {	const char *name;	OpCodes opcode;} keywords[] = {	{ "forwardagent", oForwardAgent },	{ "forwardx11", oForwardX11 },	{ "xauthlocation", oXAuthLocation },	{ "gatewayports", oGatewayPorts },	{ "useprivilegedport", oUsePrivilegedPort },	{ "rhostsauthentication", oRhostsAuthentication },	{ "passwordauthentication", oPasswordAuthentication },	{ "kbdinteractiveauthentication", oKbdInteractiveAuthentication },	{ "kbdinteractivedevices", oKbdInteractiveDevices },	{ "rsaauthentication", oRSAAuthentication },	{ "pubkeyauthentication", oPubkeyAuthentication },	{ "dsaauthentication", oPubkeyAuthentication },		    /* alias */	{ "rhostsrsaauthentication", oRhostsRSAAuthentication },	{ "hostbasedauthentication", oHostbasedAuthentication },	{ "challengeresponseauthentication", oChallengeResponseAuthentication },	{ "skeyauthentication", oChallengeResponseAuthentication }, /* alias */	{ "tisauthentication", oChallengeResponseAuthentication },  /* alias */#if defined(KRB4) || defined(KRB5)	{ "kerberosauthentication", oKerberosAuthentication },#endif#if defined(AFS) || defined(KRB5)	{ "kerberostgtpassing", oKerberosTgtPassing },#endif#ifdef AFS	{ "afstokenpassing", oAFSTokenPassing },#endif	{ "fallbacktorsh", oDeprecated },	{ "usersh", oDeprecated },	{ "identityfile", oIdentityFile },	{ "identityfile2", oIdentityFile },			/* alias */	{ "hostname", oHostName },	{ "hostkeyalias", oHostKeyAlias },	{ "proxycommand", oProxyCommand },	{ "port", oPort },	{ "cipher", oCipher },	{ "ciphers", oCiphers },	{ "macs", oMacs },	{ "protocol", oProtocol },	{ "remoteforward", oRemoteForward },	{ "localforward", oLocalForward },	{ "user", oUser },	{ "host", oHost },	{ "escapechar", oEscapeChar },	{ "globalknownhostsfile", oGlobalKnownHostsFile },	{ "userknownhostsfile", oUserKnownHostsFile },		/* obsolete */	{ "globalknownhostsfile2", oGlobalKnownHostsFile2 },	{ "userknownhostsfile2", oUserKnownHostsFile2 },	/* obsolete */	{ "connectionattempts", oConnectionAttempts },	{ "batchmode", oBatchMode },	{ "checkhostip", oCheckHostIP },	{ "stricthostkeychecking", oStrictHostKeyChecking },	{ "compression", oCompression },	{ "compressionlevel", oCompressionLevel },	{ "keepalive", oKeepAlives },	{ "numberofpasswordprompts", oNumberOfPasswordPrompts },	{ "loglevel", oLogLevel },	{ "dynamicforward", oDynamicForward },	{ "preferredauthentications", oPreferredAuthentications },	{ "hostkeyalgorithms", oHostKeyAlgorithms },	{ "bindaddress", oBindAddress },	{ "smartcarddevice", oSmartcardDevice },	{ "clearallforwardings", oClearAllForwardings },	{ "nohostauthenticationforlocalhost", oNoHostAuthenticationForLocalhost },	{ NULL, oBadOption }};/* * Adds a local TCP/IP port forward to options.  Never returns if there is an * error. */voidadd_local_forward(Options *options, u_short port, const char *host,		  u_short host_port){	Forward *fwd;#ifndef HAVE_CYGWIN	extern uid_t original_real_uid;	if (port < IPPORT_RESERVED && original_real_uid != 0)		fatal("Privileged ports can only be forwarded by root.");#endif	if (options->num_local_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)		fatal("Too many local forwards (max %d).", SSH_MAX_FORWARDS_PER_DIRECTION);	fwd = &options->local_forwards[options->num_local_forwards++];	fwd->port = port;	fwd->host = xstrdup(host);	fwd->host_port = host_port;}/* * Adds a remote TCP/IP port forward to options.  Never returns if there is * an error. */voidadd_remote_forward(Options *options, u_short port, const char *host,		   u_short host_port){	Forward *fwd;	if (options->num_remote_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)		fatal("Too many remote forwards (max %d).",		    SSH_MAX_FORWARDS_PER_DIRECTION);	fwd = &options->remote_forwards[options->num_remote_forwards++];	fwd->port = port;	fwd->host = xstrdup(host);	fwd->host_port = host_port;}static voidclear_forwardings(Options *options){	int i;	for (i = 0; i < options->num_local_forwards; i++)		xfree(options->local_forwards[i].host);	options->num_local_forwards = 0;	for (i = 0; i < options->num_remote_forwards; i++)		xfree(options->remote_forwards[i].host);	options->num_remote_forwards = 0;}/* * Returns the number of the token pointed to by cp or oBadOption. */static OpCodesparse_token(const char *cp, const char *filename, int linenum){	u_int i;	for (i = 0; keywords[i].name; i++)		if (strcasecmp(cp, keywords[i].name) == 0)			return keywords[i].opcode;	error("%s: line %d: Bad configuration option: %s",	    filename, linenum, cp);	return oBadOption;}/* * Processes a single option line as used in the configuration files. This * only sets those values that have not already been set. */intprocess_config_line(Options *options, const char *host,		    char *line, const char *filename, int linenum,		    int *activep){	char buf[256], *s, *string, **charptr, *endofnumber, *keyword, *arg;	int opcode, *intptr, value;	u_short fwd_port, fwd_host_port;	char sfwd_host_port[6];	s = line;	/* Get the keyword. (Each line is supposed to begin with a keyword). */	keyword = strdelim(&s);	/* Ignore leading whitespace. */	if (*keyword == '\0')		keyword = strdelim(&s);	if (keyword == NULL || !*keyword || *keyword == '\n' || *keyword == '#')		return 0;	opcode = parse_token(keyword, filename, linenum);	switch (opcode) {	case oBadOption:		/* don't panic, but count bad options */		return -1;		/* NOTREACHED */	case oForwardAgent:		intptr = &options->forward_agent;parse_flag:		arg = strdelim(&s);		if (!arg || *arg == '\0')			fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);		value = 0;	/* To avoid compiler warning... */		if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)			value = 1;		else if (strcmp(arg, "no") == 0 || strcmp(arg, "false") == 0)			value = 0;		else			fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);		if (*activep && *intptr == -1)			*intptr = value;		break;	case oForwardX11:		intptr = &options->forward_x11;		goto parse_flag;	case oGatewayPorts:		intptr = &options->gateway_ports;		goto parse_flag;	case oUsePrivilegedPort:		intptr = &options->use_privileged_port;		goto parse_flag;	case oRhostsAuthentication:		intptr = &options->rhosts_authentication;		goto parse_flag;	case oPasswordAuthentication:		intptr = &options->password_authentication;		goto parse_flag;	case oKbdInteractiveAuthentication:		intptr = &options->kbd_interactive_authentication;		goto parse_flag;	case oKbdInteractiveDevices:		charptr = &options->kbd_interactive_devices;		goto parse_string;	case oPubkeyAuthentication:		intptr = &options->pubkey_authentication;		goto parse_flag;	case oRSAAuthentication:		intptr = &options->rsa_authentication;		goto parse_flag;	case oRhostsRSAAuthentication:		intptr = &options->rhosts_rsa_authentication;		goto parse_flag;	case oHostbasedAuthentication:		intptr = &options->hostbased_authentication;		goto parse_flag;	case oChallengeResponseAuthentication:		intptr = &options->challenge_response_authentication;		goto parse_flag;#if defined(KRB4) || defined(KRB5)	case oKerberosAuthentication:		intptr = &options->kerberos_authentication;		goto parse_flag;#endif#if defined(AFS) || defined(KRB5)	case oKerberosTgtPassing:		intptr = &options->kerberos_tgt_passing;		goto parse_flag;#endif#ifdef AFS	case oAFSTokenPassing:		intptr = &options->afs_token_passing;		goto parse_flag;#endif	case oBatchMode:		intptr = &options->batch_mode;		goto parse_flag;	case oCheckHostIP:		intptr = &options->check_host_ip;		goto parse_flag;	case oStrictHostKeyChecking:		intptr = &options->strict_host_key_checking;		arg = strdelim(&s);		if (!arg || *arg == '\0')			fatal("%.200s line %d: Missing yes/no/ask argument.",			    filename, linenum);		value = 0;	/* To avoid compiler warning... */		if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)			value = 1;		else if (strcmp(arg, "no") == 0 || strcmp(arg, "false") == 0)			value = 0;		else if (strcmp(arg, "ask") == 0)			value = 2;		else			fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);		if (*activep && *intptr == -1)			*intptr = value;		break;	case oCompression:		intptr = &options->compression;		goto parse_flag;	case oKeepAlives:		intptr = &options->keepalives;		goto parse_flag;	case oNoHostAuthenticationForLocalhost:		intptr = &options->no_host_authentication_for_localhost;		goto parse_flag;	case oNumberOfPasswordPrompts:		intptr = &options->number_of_password_prompts;		goto parse_int;	case oCompressionLevel:		intptr = &options->compression_level;		goto parse_int;	case oIdentityFile:		arg = strdelim(&s);		if (!arg || *arg == '\0')			fatal("%.200s line %d: Missing argument.", filename, linenum);		if (*activep) {			intptr = &options->num_identity_files;			if (*intptr >= SSH_MAX_IDENTITY_FILES)				fatal("%.200s line %d: Too many identity files specified (max %d).",				    filename, linenum, SSH_MAX_IDENTITY_FILES);			charptr =  &options->identity_files[*intptr];			*charptr = xstrdup(arg);			*intptr = *intptr + 1;		}		break;	case oXAuthLocation:		charptr=&options->xauth_location;		goto parse_string;	case oUser:		charptr = &options->user;parse_string:		arg = strdelim(&s);		if (!arg || *arg == '\0')			fatal("%.200s line %d: Missing argument.", filename, linenum);		if (*activep && *charptr == NULL)			*charptr = xstrdup(arg);		break;	case oGlobalKnownHostsFile:		charptr = &options->system_hostfile;		goto parse_string;	case oUserKnownHostsFile:		charptr = &options->user_hostfile;		goto parse_string;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -