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

📄 readconf.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * 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.137 2005/03/04 08:48:06 djm 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     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     PasswordAuthentication yes     RSAAuthentication yes     RhostsRSAAuthentication yes     StrictHostKeyChecking yes     TcpKeepAlive no     IdentityFile ~/.ssh/identity     Port 22     EscapeChar ~*//* Keyword tokens. */typedef enum {	oBadOption,	oForwardAgent, oForwardX11, oForwardX11Trusted, oGatewayPorts,	oPasswordAuthentication, oRSAAuthentication,	oChallengeResponseAuthentication, oXAuthLocation,	oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,	oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,	oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,	oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,	oCompressionLevel, oTCPKeepAlive, oNumberOfPasswordPrompts,	oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oMacs,	oGlobalKnownHostsFile2, oUserKnownHostsFile2, oPubkeyAuthentication,	oKbdInteractiveAuthentication, oKbdInteractiveDevices, oHostKeyAlias,	oDynamicForward, oPreferredAuthentications, oHostbasedAuthentication,	oHostKeyAlgorithms, oBindAddress, oSmartcardDevice,	oClearAllForwardings, oNoHostAuthenticationForLocalhost,	oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout,	oAddressFamily, oGssAuthentication, oGssDelegateCreds,	oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,	oSendEnv, oControlPath, oControlMaster, oHashKnownHosts,	oDeprecated, oUnsupported} OpCodes;/* Textual representations of the tokens. */static struct {	const char *name;	OpCodes opcode;} keywords[] = {	{ "forwardagent", oForwardAgent },	{ "forwardx11", oForwardX11 },	{ "forwardx11trusted", oForwardX11Trusted },	{ "xauthlocation", oXAuthLocation },	{ "gatewayports", oGatewayPorts },	{ "useprivilegedport", oUsePrivilegedPort },	{ "rhostsauthentication", oDeprecated },	{ "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 */	{ "kerberosauthentication", oUnsupported },	{ "kerberostgtpassing", oUnsupported },	{ "afstokenpassing", oUnsupported },#if defined(GSSAPI)	{ "gssapiauthentication", oGssAuthentication },	{ "gssapidelegatecredentials", oGssDelegateCreds },#else	{ "gssapiauthentication", oUnsupported },	{ "gssapidelegatecredentials", oUnsupported },#endif	{ "fallbacktorsh", oDeprecated },	{ "usersh", oDeprecated },	{ "identityfile", oIdentityFile },	{ "identityfile2", oIdentityFile },			/* alias */	{ "identitiesonly", oIdentitiesOnly },	{ "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 },	{ "tcpkeepalive", oTCPKeepAlive },	{ "keepalive", oTCPKeepAlive },				/* obsolete */	{ "numberofpasswordprompts", oNumberOfPasswordPrompts },	{ "loglevel", oLogLevel },	{ "dynamicforward", oDynamicForward },	{ "preferredauthentications", oPreferredAuthentications },	{ "hostkeyalgorithms", oHostKeyAlgorithms },	{ "bindaddress", oBindAddress },#ifdef SMARTCARD	{ "smartcarddevice", oSmartcardDevice },#else	{ "smartcarddevice", oUnsupported },#endif	{ "clearallforwardings", oClearAllForwardings },	{ "enablesshkeysign", oEnableSSHKeysign },	{ "verifyhostkeydns", oVerifyHostKeyDNS },	{ "nohostauthenticationforlocalhost", oNoHostAuthenticationForLocalhost },	{ "rekeylimit", oRekeyLimit },	{ "connecttimeout", oConnectTimeout },	{ "addressfamily", oAddressFamily },	{ "serveraliveinterval", oServerAliveInterval },	{ "serveralivecountmax", oServerAliveCountMax },	{ "sendenv", oSendEnv },	{ "controlpath", oControlPath },	{ "controlmaster", oControlMaster },	{ "hashknownhosts", oHashKnownHosts },	{ NULL, oBadOption }};/* * Adds a local TCP/IP port forward to options.  Never returns if there is an * error. */voidadd_local_forward(Options *options, const Forward *newfwd){	Forward *fwd;#ifndef NO_IPPORT_RESERVED_CONCEPT	extern uid_t original_real_uid;	if (newfwd->listen_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->listen_host = (newfwd->listen_host == NULL) ?	    NULL : xstrdup(newfwd->listen_host);	fwd->listen_port = newfwd->listen_port;	fwd->connect_host = xstrdup(newfwd->connect_host);	fwd->connect_port = newfwd->connect_port;}/* * Adds a remote TCP/IP port forward to options.  Never returns if there is * an error. */voidadd_remote_forward(Options *options, const Forward *newfwd){	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->listen_host = (newfwd->listen_host == NULL) ?	    NULL : xstrdup(newfwd->listen_host);	fwd->listen_port = newfwd->listen_port;	fwd->connect_host = xstrdup(newfwd->connect_host);	fwd->connect_port = newfwd->connect_port;}static voidclear_forwardings(Options *options){	int i;	for (i = 0; i < options->num_local_forwards; i++) {		xfree(options->local_forwards[i].listen_host);		xfree(options->local_forwards[i].connect_host);	}	options->num_local_forwards = 0;	for (i = 0; i < options->num_remote_forwards; i++) {		xfree(options->remote_forwards[i].listen_host);		xfree(options->remote_forwards[i].connect_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. */#define WHITESPACE " \t\r\n"intprocess_config_line(Options *options, const char *host,		    char *line, const char *filename, int linenum,		    int *activep){	char *s, **charptr, *endofnumber, *keyword, *arg, *arg2, fwdarg[256];	int opcode, *intptr, value;	size_t len;	Forward fwd;	/* Strip trailing whitespace */	for(len = strlen(line) - 1; len > 0; len--) {		if (strchr(WHITESPACE, line[len]) == NULL)			break;		line[len] = '\0';	}	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 oConnectTimeout:		intptr = &options->connection_timeout;parse_time:		arg = strdelim(&s);		if (!arg || *arg == '\0')			fatal("%s line %d: missing time value.",			    filename, linenum);		if ((value = convtime(arg)) == -1)			fatal("%s line %d: invalid time value.",			    filename, linenum);		if (*intptr == -1)			*intptr = value;		break;	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 oForwardX11Trusted:		intptr = &options->forward_x11_trusted;		goto parse_flag;	case oGatewayPorts:		intptr = &options->gateway_ports;		goto parse_flag;	case oUsePrivilegedPort:		intptr = &options->use_privileged_port;		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;

⌨️ 快捷键说明

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