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

📄 servconf.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 C
📖 第 1 页 / 共 2 页
字号:
		break;	case sKeyRegenerationTime:		intptr = &options->key_regeneration_time;		goto parse_time;	case sListenAddress:		arg = strdelim(&cp);		if (arg == NULL || *arg == '\0')			fatal("%s line %d: missing address",			    filename, linenum);		p = hpdelim(&arg);		if (p == NULL)			fatal("%s line %d: bad address:port usage",			    filename, linenum);		p = cleanhostname(p);		if (arg == NULL)			port = 0;		else if ((port = a2port(arg)) == 0)			fatal("%s line %d: bad port number", filename, linenum);		add_listen_addr(options, p, port);		break;	case sAddressFamily:		arg = strdelim(&cp);		intptr = &options->address_family;		if (options->listen_addrs != NULL)			fatal("%s line %d: address family must be specified before "			    "ListenAddress.", filename, linenum);		if (strcasecmp(arg, "inet") == 0)			value = AF_INET;		else if (strcasecmp(arg, "inet6") == 0)			value = AF_INET6;		else if (strcasecmp(arg, "any") == 0)			value = AF_UNSPEC;		else			fatal("%s line %d: unsupported address family \"%s\".",			    filename, linenum, arg);		if (*intptr == -1)			*intptr = value;		break;	case sHostKeyFile:		intptr = &options->num_host_key_files;		if (*intptr >= MAX_HOSTKEYS)			fatal("%s line %d: too many host keys specified (max %d).",			    filename, linenum, MAX_HOSTKEYS);		charptr = &options->host_key_files[*intptr];parse_filename:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing file name.",			    filename, linenum);		if (*charptr == NULL) {			*charptr = tilde_expand_filename(arg, getuid());			/* increase optional counter */			if (intptr != NULL)				*intptr = *intptr + 1;		}		break;	case sPidFile:		charptr = &options->pid_file;		goto parse_filename;	case sPermitRootLogin:		intptr = &options->permit_root_login;		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing yes/"			    "without-password/forced-commands-only/no "			    "argument.", filename, linenum);		value = 0;	/* silence compiler */		if (strcmp(arg, "without-password") == 0)			value = PERMIT_NO_PASSWD;		else if (strcmp(arg, "forced-commands-only") == 0)			value = PERMIT_FORCED_ONLY;		else if (strcmp(arg, "yes") == 0)			value = PERMIT_YES;		else if (strcmp(arg, "no") == 0)			value = PERMIT_NO;		else			fatal("%s line %d: Bad yes/"			    "without-password/forced-commands-only/no "			    "argument: %s", filename, linenum, arg);		if (*intptr == -1)			*intptr = value;		break;	case sIgnoreRhosts:		intptr = &options->ignore_rhosts;parse_flag:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing yes/no argument.",			    filename, linenum);		value = 0;	/* silence compiler */		if (strcmp(arg, "yes") == 0)			value = 1;		else if (strcmp(arg, "no") == 0)			value = 0;		else			fatal("%s line %d: Bad yes/no argument: %s",				filename, linenum, arg);		if (*intptr == -1)			*intptr = value;		break;	case sIgnoreUserKnownHosts:		intptr = &options->ignore_user_known_hosts;		goto parse_flag;	case sRhostsRSAAuthentication:		intptr = &options->rhosts_rsa_authentication;		goto parse_flag;	case sHostbasedAuthentication:		intptr = &options->hostbased_authentication;		goto parse_flag;	case sHostbasedUsesNameFromPacketOnly:		intptr = &options->hostbased_uses_name_from_packet_only;		goto parse_flag;	case sRSAAuthentication:		intptr = &options->rsa_authentication;		goto parse_flag;	case sPubkeyAuthentication:		intptr = &options->pubkey_authentication;		goto parse_flag;	case sKerberosAuthentication:		intptr = &options->kerberos_authentication;		goto parse_flag;	case sKerberosOrLocalPasswd:		intptr = &options->kerberos_or_local_passwd;		goto parse_flag;	case sKerberosTicketCleanup:		intptr = &options->kerberos_ticket_cleanup;		goto parse_flag;	case sKerberosGetAFSToken:		intptr = &options->kerberos_get_afs_token;		goto parse_flag;	case sGssAuthentication:		intptr = &options->gss_authentication;		goto parse_flag;	case sGssCleanupCreds:		intptr = &options->gss_cleanup_creds;		goto parse_flag;	case sPasswordAuthentication:		intptr = &options->password_authentication;		goto parse_flag;	case sKbdInteractiveAuthentication:		intptr = &options->kbd_interactive_authentication;		goto parse_flag;	case sChallengeResponseAuthentication:		intptr = &options->challenge_response_authentication;		goto parse_flag;	case sPrintMotd:		intptr = &options->print_motd;		goto parse_flag;	case sPrintLastLog:		intptr = &options->print_lastlog;		goto parse_flag;	case sX11Forwarding:		intptr = &options->x11_forwarding;		goto parse_flag;	case sX11DisplayOffset:		intptr = &options->x11_display_offset;		goto parse_int;	case sX11UseLocalhost:		intptr = &options->x11_use_localhost;		goto parse_flag;	case sXAuthLocation:		charptr = &options->xauth_location;		goto parse_filename;	case sStrictModes:		intptr = &options->strict_modes;		goto parse_flag;	case sTCPKeepAlive:		intptr = &options->tcp_keep_alive;		goto parse_flag;	case sEmptyPasswd:		intptr = &options->permit_empty_passwd;		goto parse_flag;	case sPermitUserEnvironment:		intptr = &options->permit_user_env;		goto parse_flag;	case sUseLogin:		intptr = &options->use_login;		goto parse_flag;	case sCompression:		intptr = &options->compression;		goto parse_flag;	case sGatewayPorts:		intptr = &options->gateway_ports;		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing yes/no/clientspecified "			    "argument.", filename, linenum);		value = 0;	/* silence compiler */		if (strcmp(arg, "clientspecified") == 0)			value = 2;		else if (strcmp(arg, "yes") == 0)			value = 1;		else if (strcmp(arg, "no") == 0)			value = 0;		else			fatal("%s line %d: Bad yes/no/clientspecified "			    "argument: %s", filename, linenum, arg);		if (*intptr == -1)			*intptr = value;		break;	case sUseDNS:		intptr = &options->use_dns;		goto parse_flag;	case sLogFacility:		intptr = (int *) &options->log_facility;		arg = strdelim(&cp);		value = log_facility_number(arg);		if (value == SYSLOG_FACILITY_NOT_SET)			fatal("%.200s line %d: unsupported log facility '%s'",			    filename, linenum, arg ? arg : "<NONE>");		if (*intptr == -1)			*intptr = (SyslogFacility) value;		break;	case sLogLevel:		intptr = (int *) &options->log_level;		arg = strdelim(&cp);		value = log_level_number(arg);		if (value == SYSLOG_LEVEL_NOT_SET)			fatal("%.200s line %d: unsupported log level '%s'",			    filename, linenum, arg ? arg : "<NONE>");		if (*intptr == -1)			*intptr = (LogLevel) value;		break;	case sAllowTcpForwarding:		intptr = &options->allow_tcp_forwarding;		goto parse_flag;	case sUsePrivilegeSeparation:		intptr = &use_privsep;		goto parse_flag;	case sAllowUsers:		while ((arg = strdelim(&cp)) && *arg != '\0') {			if (options->num_allow_users >= MAX_ALLOW_USERS)				fatal("%s line %d: too many allow users.",				    filename, linenum);			options->allow_users[options->num_allow_users++] =			    xstrdup(arg);		}		break;	case sDenyUsers:		while ((arg = strdelim(&cp)) && *arg != '\0') {			if (options->num_deny_users >= MAX_DENY_USERS)				fatal( "%s line %d: too many deny users.",				    filename, linenum);			options->deny_users[options->num_deny_users++] =			    xstrdup(arg);		}		break;	case sAllowGroups:		while ((arg = strdelim(&cp)) && *arg != '\0') {			if (options->num_allow_groups >= MAX_ALLOW_GROUPS)				fatal("%s line %d: too many allow groups.",				    filename, linenum);			options->allow_groups[options->num_allow_groups++] =			    xstrdup(arg);		}		break;	case sDenyGroups:		while ((arg = strdelim(&cp)) && *arg != '\0') {			if (options->num_deny_groups >= MAX_DENY_GROUPS)				fatal("%s line %d: too many deny groups.",				    filename, linenum);			options->deny_groups[options->num_deny_groups++] = xstrdup(arg);		}		break;	case sCiphers:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing argument.", filename, linenum);		if (!ciphers_valid(arg))			fatal("%s line %d: Bad SSH2 cipher spec '%s'.",			    filename, linenum, arg ? arg : "<NONE>");		if (options->ciphers == NULL)			options->ciphers = xstrdup(arg);		break;	case sMacs:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing argument.", filename, linenum);		if (!mac_valid(arg))			fatal("%s line %d: Bad SSH2 mac spec '%s'.",			    filename, linenum, arg ? arg : "<NONE>");		if (options->macs == NULL)			options->macs = xstrdup(arg);		break;	case sProtocol:		intptr = &options->protocol;		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing argument.", filename, linenum);		value = proto_spec(arg);		if (value == SSH_PROTO_UNKNOWN)			fatal("%s line %d: Bad protocol spec '%s'.",			    filename, linenum, arg ? arg : "<NONE>");		if (*intptr == SSH_PROTO_UNKNOWN)			*intptr = value;		break;	case sSubsystem:		if (options->num_subsystems >= MAX_SUBSYSTEMS) {			fatal("%s line %d: too many subsystems defined.",			    filename, linenum);		}		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing subsystem name.",			    filename, linenum);		for (i = 0; i < options->num_subsystems; i++)			if (strcmp(arg, options->subsystem_name[i]) == 0)				fatal("%s line %d: Subsystem '%s' already defined.",				    filename, linenum, arg);		options->subsystem_name[options->num_subsystems] = xstrdup(arg);		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing subsystem command.",			    filename, linenum);		options->subsystem_command[options->num_subsystems] = xstrdup(arg);		options->num_subsystems++;		break;	case sMaxStartups:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: Missing MaxStartups spec.",			    filename, linenum);		if ((n = sscanf(arg, "%d:%d:%d",		    &options->max_startups_begin,		    &options->max_startups_rate,		    &options->max_startups)) == 3) {			if (options->max_startups_begin >			    options->max_startups ||			    options->max_startups_rate > 100 ||			    options->max_startups_rate < 1)				fatal("%s line %d: Illegal MaxStartups spec.",				    filename, linenum);		} else if (n != 1)			fatal("%s line %d: Illegal MaxStartups spec.",			    filename, linenum);		else			options->max_startups = options->max_startups_begin;		break;	case sMaxAuthTries:		intptr = &options->max_authtries;		goto parse_int;	case sBanner:		charptr = &options->banner;		goto parse_filename;	/*	 * These options can contain %X options expanded at	 * connect time, so that you can specify paths like:	 *	 * AuthorizedKeysFile	/etc/ssh_keys/%u	 */	case sAuthorizedKeysFile:	case sAuthorizedKeysFile2:		charptr = (opcode == sAuthorizedKeysFile ) ?		    &options->authorized_keys_file :		    &options->authorized_keys_file2;		goto parse_filename;	case sClientAliveInterval:		intptr = &options->client_alive_interval;		goto parse_time;	case sClientAliveCountMax:		intptr = &options->client_alive_count_max;		goto parse_int;	case sAcceptEnv:		while ((arg = strdelim(&cp)) && *arg != '\0') {			if (strchr(arg, '=') != NULL)				fatal("%s line %d: Invalid environment name.",				    filename, linenum);			if (options->num_accept_env >= MAX_ACCEPT_ENV)				fatal("%s line %d: too many allow env.",				    filename, linenum);			options->accept_env[options->num_accept_env++] =			    xstrdup(arg);		}		break;	case sDeprecated:		logit("%s line %d: Deprecated option %s",		    filename, linenum, arg);		while (arg)		    arg = strdelim(&cp);		break;	case sUnsupported:		logit("%s line %d: Unsupported option %s",		    filename, linenum, arg);		while (arg)		    arg = strdelim(&cp);		break;	default:		fatal("%s line %d: Missing handler for opcode %s (%d)",		    filename, linenum, arg, opcode);	}	if ((arg = strdelim(&cp)) != NULL && *arg != '\0')		fatal("%s line %d: garbage at end of line; \"%.200s\".",		    filename, linenum, arg);	return 0;}/* Reads the server configuration file. */voidload_server_config(const char *filename, Buffer *conf){	char line[1024], *cp;	FILE *f;	debug2("%s: filename %s", __func__, filename);	if ((f = fopen(filename, "r")) == NULL) {		perror(filename);		exit(1);	}	buffer_clear(conf);	while (fgets(line, sizeof(line), f)) {		/*		 * Trim out comments and strip whitespace		 * NB - preserve newlines, they are needed to reproduce		 * line numbers later for error messages		 */		if ((cp = strchr(line, '#')) != NULL)			memcpy(cp, "\n", 2);		cp = line + strspn(line, " \t\r");		buffer_append(conf, cp, strlen(cp));	}	buffer_append(conf, "\0", 1);	fclose(f);	debug2("%s: done config len = %d", __func__, buffer_len(conf));}voidparse_server_config(ServerOptions *options, const char *filename, Buffer *conf){	int linenum, bad_options = 0;	char *cp, *obuf, *cbuf;	debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));	obuf = cbuf = xstrdup(buffer_ptr(conf));	linenum = 1;	while((cp = strsep(&cbuf, "\n")) != NULL) {		if (process_server_config_line(options, cp, filename,		    linenum++) != 0)			bad_options++;	}	xfree(obuf);	if (bad_options > 0)		fatal("%s: terminating, %d bad configuration options",		    filename, bad_options);}

⌨️ 快捷键说明

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