日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

http://blog.chinaunix.net/uid-25082381-id-3242162.html

發(fā)布時(shí)間:2024/9/5 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 http://blog.chinaunix.net/uid-25082381-id-3242162.html 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?http://blog.chinaunix.net/uid-25082381-id-3242162.html



因?yàn)轫?xiàng)目用到了ftp傳輸文件的功能,設(shè)備要做ftp服務(wù)器,正好busybox有ftpd這個(gè)功能,所以就直接使用啦,但是測(cè)試發(fā)現(xiàn),自帶的這個(gè)ftpd登陸根本就不需要用戶名和密碼,所以這就有安全隱患了,這是不允許滴,搜索資料表明,搜不到關(guān)于ftpd用戶名和密碼登陸的問(wèn)題,都是使用另外一個(gè)工具,lftp,于是我就編譯了一個(gè)lftp,測(cè)試可以使用,但是因?yàn)榫幾g的時(shí)候總是不過(guò),需要屏蔽掉一些功能才可以編譯通過(guò),所以總覺(jué)得有隱患,于是決定再次研究一下ftpd為什么不能用戶名和密碼登陸,網(wǎng)上既然查不到,那只好自己去研究源代碼啦,看到了ftpd的源代碼文件ftpd.c里面有一個(gè)IF_WE_WANT_TO_REQUIRE_LOGIN,就是用來(lái)配置是否需要用戶名和密碼登陸的,可是這個(gè)宏卻不能在busybox的make xconfig中配置,所以我猜想肯定是因?yàn)檫@個(gè)功能還不完善,所以才不能配置的,于是自己在代碼中打開試一下,編譯通過(guò),測(cè)試顯示失敗,于是查找代碼發(fā)現(xiàn),if (G.ftp_arg == NULL || strcasecmp(G.ftp_arg, "anonymous") != 0),該if判斷只要是匿名用戶就可以登陸,而且后續(xù)沒(méi)有對(duì)密碼的驗(yàn)證,既然這樣,那就只好自己實(shí)現(xiàn)啦,我的busybox的版本是1.17.2,一下是我的代碼,里面所有在//wsm add和//end wsm之間的代碼都是我添加的,你們可以和官方的未修改版進(jìn)行對(duì)比就知道區(qū)別啦,代碼如下,主要函數(shù)和代碼我已經(jīng)做了注釋。

/* vi: set sw=4 ts=4: */
/*
?* Simple FTP daemon, based on vsftpd 2.0.7 (written by Chris Evans)
?*
?* Author: Adam Tkac <vonsch@gmail.com>
?*
?* Licensed under GPLv2, see file LICENSE in this tarball for details.
?*
?* Only subset of FTP protocol is implemented but vast majority of clients
?* should not have any problem.
?*
?* You have to run this daemon via inetd.
?*/
#include "libbb.h"
#include <syslog.h>
#include <netinet/tcp.h>
//wsm add
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <pwd.h>
#include <stdlib.h>
#include <crypt.h>
#include <string.h>
#include <shadow.h>
#define IF_WE_WANT_TO_REQUIRE_LOGIN
//end wsm
#define FTP_DATACONN ? ? ? ? ? ?150
#define FTP_NOOPOK ? ? ? ? ? ? ?200
#define FTP_TYPEOK ? ? ? ? ? ? ?200
#define FTP_PORTOK ? ? ? ? ? ? ?200
#define FTP_STRUOK ? ? ? ? ? ? ?200
#define FTP_MODEOK ? ? ? ? ? ? ?200
#define FTP_ALLOOK ? ? ? ? ? ? ?202
#define FTP_STATOK ? ? ? ? ? ? ?211
#define FTP_STATFILE_OK ? ? ? ? 213
#define FTP_HELP ? ? ? ? ? ? ? ?214
#define FTP_SYSTOK ? ? ? ? ? ? ?215
#define FTP_GREET ? ? ? ? ? ? ? 220
#define FTP_GOODBYE ? ? ? ? ? ? 221
#define FTP_TRANSFEROK ? ? ? ? ?226
#define FTP_PASVOK ? ? ? ? ? ? ?227
/*#define FTP_EPRTOK ? ? ? ? ? ? ?228*/
#define FTP_EPSVOK ? ? ? ? ? ? ?229
#define FTP_LOGINOK ? ? ? ? ? ? 230
#define FTP_CWDOK ? ? ? ? ? ? ? 250
#define FTP_RMDIROK ? ? ? ? ? ? 250
#define FTP_DELEOK ? ? ? ? ? ? ?250
#define FTP_RENAMEOK ? ? ? ? ? ?250
#define FTP_PWDOK ? ? ? ? ? ? ? 257
#define FTP_MKDIROK ? ? ? ? ? ? 257
#define FTP_GIVEPWORD ? ? ? ? ? 331
#define FTP_RESTOK ? ? ? ? ? ? ?350
#define FTP_RNFROK ? ? ? ? ? ? ?350
#define FTP_TIMEOUT ? ? ? ? ? ? 421
#define FTP_BADSENDCONN ? ? ? ? 425
#define FTP_BADSENDNET ? ? ? ? ?426
#define FTP_BADSENDFILE ? ? ? ? 451
#define FTP_BADCMD ? ? ? ? ? ? ?500
#define FTP_COMMANDNOTIMPL ? ? ?502
#define FTP_NEEDUSER ? ? ? ? ? ?503
#define FTP_NEEDRNFR ? ? ? ? ? ?503
#define FTP_BADSTRU ? ? ? ? ? ? 504
#define FTP_BADMODE ? ? ? ? ? ? 504
#define FTP_LOGINERR ? ? ? ? ? ?530
#define FTP_FILEFAIL ? ? ? ? ? ?550
#define FTP_NOPERM ? ? ? ? ? ? ?550
#define FTP_UPLOADFAIL ? ? ? ? ?553
#define STR1(s) #s
#define STR(s) STR1(s)
/* Convert a constant to 3-digit string, packed into uint32_t */
enum {
?/* Shift for Nth decimal digit */
?SHIFT2 ?= ?0 * BB_LITTLE_ENDIAN 24 * BB_BIG_ENDIAN,
?SHIFT1 ?= ?8 * BB_LITTLE_ENDIAN 16 * BB_BIG_ENDIAN,
?SHIFT0 ?= 16 * BB_LITTLE_ENDIAN 8 * BB_BIG_ENDIAN,
?/* And for 4th position (space) */
?SHIFTsp = 24 * BB_LITTLE_ENDIAN 0 * BB_BIG_ENDIAN,
};
#define STRNUM32(s) (uint32_t)(0 \
?| (('0' ((s) / 1 % 10)) << SHIFT0) \
?| (('0' ((s) / 10 % 10)) << SHIFT1) \
?| (('0' ((s) / 100 % 10)) << SHIFT2) \
)
#define STRNUM32sp(s) (uint32_t)(0 \
?| (' ' << SHIFTsp) \
?| (('0' ((s) / 1 % 10)) << SHIFT0) \
?| (('0' ((s) / 10 % 10)) << SHIFT1) \
?| (('0' ((s) / 100 % 10)) << SHIFT2) \
)
#define MSG_OK "Operation successful\r\n"
#define MSG_ERR "Error\r\n"
struct globals {
?int pasv_listen_fd;
#if !BB_MMU
?int root_fd;
#endif
?int local_file_fd;
?unsigned end_time;
?unsigned timeout;
?unsigned verbose;
?off_t local_file_pos;
?off_t restart_pos;
?len_and_sockaddr *local_addr;
?len_and_sockaddr *port_addr;
?char *ftp_cmd;
?char *ftp_arg;
#if ENABLE_FEATURE_FTP_WRITE
?char *rnfr_filename;
#endif
?/* We need these aligned to uint32_t */
?char msg_ok [(sizeof("NNN " MSG_OK ) 3) & 0xfffc];
?char msg_err[(sizeof("NNN " MSG_ERR) 3) & 0xfffc];
} FIX_ALIASING;
#define G (*(struct globals*)&bb_common_bufsiz1)
#define INIT_G() do { \
?/* Moved to main */ \
?/*strcpy(G.msg_ok ?4, MSG_OK );*/ \
?/*strcpy(G.msg_err 4, MSG_ERR);*/ \
} while (0)


static char *
escape_text(const char *prepend, const char *str, unsigned escapee)
{
?unsigned retlen, remainlen, chunklen;
?char *ret, *found;
?char append;
?append = (char)escapee;
?escapee >>= 8;
?remainlen = strlen(str);
?retlen = strlen(prepend);
?ret = xmalloc(retlen remainlen * 2 1 1);
?strcpy(ret, prepend);
?for (;;) {
? found = strchrnul(str, escapee);
? chunklen = found - str 1;
? /* Copy chunk up to and including escapee (or NUL) to ret */
? memcpy(ret retlen, str, chunklen);
? retlen = chunklen;
? if (*found == '\0') {
? ?/* It wasn't escapee, it was NUL! */
? ?ret[retlen - 1] = append; /* replace NUL */
? ?ret[retlen] = '\0'; /* add NUL */
? ?break;
? }
? ret[retlen ] = escapee; /* duplicate escapee */
? str = found 1;
?}
?return ret;
}
/* Returns strlen as a bonus */
static unsigned
replace_char(char *str, char from, char to)
{
?char *p = str;
?while (*p) {
? if (*p == from)
? ?*p = to;
? p ;
?}
?return p - str;
}
static void
verbose_log(const char *str)
{
?bb_error_msg("%.*s", (int)strcspn(str, "\r\n"), str);
}
/* NB: status_str is char[4] packed into uint32_t */
static void
cmdio_write(uint32_t status_str, const char *str)
{
?char *response;
?int len;
?/* FTP uses telnet protocol for command link.
? * In telnet, 0xff is an escape char, and needs to be escaped: */
?response = escape_text((char *) &status_str, str, (0xff << 8) '\r');
?/* FTP sends embedded LFs as NULs */
?len = replace_char(response, '\n', '\0');
?response[len ] = '\n'; /* tack on trailing '\n' */
?xwrite(STDOUT_FILENO, response, len);
?if (G.verbose > 1)
? verbose_log(response);
?free(response);
}
static void
cmdio_write_ok(unsigned status)
{
?*(uint32_t *) G.msg_ok = status;
?xwrite(STDOUT_FILENO, G.msg_ok, sizeof("NNN " MSG_OK) - 1);
?if (G.verbose > 1)
? verbose_log(G.msg_ok);
}
#define WRITE_OK(a) cmdio_write_ok(STRNUM32sp(a))
/* TODO: output strerr(errno) if errno != 0? */
static void
cmdio_write_error(unsigned status)
{
?*(uint32_t *) G.msg_err = status;
?xwrite(STDOUT_FILENO, G.msg_err, sizeof("NNN " MSG_ERR) - 1);
?if (G.verbose > 1)
? verbose_log(G.msg_err);
}
#define WRITE_ERR(a) cmdio_write_error(STRNUM32sp(a))
static void
cmdio_write_raw(const char *p_text)
{
?xwrite_str(STDOUT_FILENO, p_text);
?if (G.verbose > 1)
? verbose_log(p_text);
}
static void
timeout_handler(int sig UNUSED_PARAM)
{
?off_t pos;
?int sv_errno = errno;
?if ((int)(monotonic_sec() - G.end_time) >= 0)
? goto timed_out;
?if (!G.local_file_fd)
? goto timed_out;
?pos = xlseek(G.local_file_fd, 0, SEEK_CUR);
?if (pos == G.local_file_pos)
? goto timed_out;
?G.local_file_pos = pos;
?alarm(G.timeout);
?errno = sv_errno;
?return;
?timed_out:
?cmdio_write_raw(STR(FTP_TIMEOUT)" Timeout\r\n");
/* TODO: do we need to abort (as opposed to usual shutdown) data transfer? */
?exit(1);
}
/* Simple commands */
static void
handle_pwd(void)
{
?char *cwd, *response;
?cwd = xrealloc_getcwd_or_warn(NULL);
?if (cwd == NULL)
? cwd = xstrdup("");
?/* We have to promote each " to "" */
?response = escape_text(" \"", cwd, ('"' << 8) '"');
?free(cwd);
?cmdio_write(STRNUM32(FTP_PWDOK), response);
?free(response);
}
static void
handle_cwd(void)
{
?if (!G.ftp_arg || chdir(G.ftp_arg) != 0) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?WRITE_OK(FTP_CWDOK);
}
static void
handle_cdup(void)
{
?G.ftp_arg = (char*)"..";
?handle_cwd();
}
static void
handle_stat(void)
{
?cmdio_write_raw(STR(FTP_STATOK)"-Server status:\r\n"
? ?" TYPE: BINARY\r\n"
? ?STR(FTP_STATOK)" Ok\r\n");
}
/* Examples of HELP and FEAT:
# nc -vvv ftp.kernel.org 21
ftp.kernel.org (130.239.17.4:21) open
220 Welcome to ftp.kernel.org.
FEAT
211-Features:
?EPRT
?EPSV
?MDTM
?PASV
?REST STREAM
?SIZE
?TVFS
?UTF8
211 End
HELP
214-The following commands are recognized.
?ABOR ACCT ALLO APPE CDUP CWD ?DELE EPRT EPSV FEAT HELP LIST MDTM MKD
?MODE NLST NOOP OPTS PASS PASV PORT PWD ?QUIT REIN REST RETR RMD ?RNFR
?RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD
?XPWD XRMD
214 Help OK.
*/
static void
handle_feat(unsigned status)
{
?cmdio_write(status, "-Features:");
?cmdio_write_raw(" EPSV\r\n"
? ?" PASV\r\n"
? ?" REST STREAM\r\n"
? ?" MDTM\r\n"
? ?" SIZE\r\n");
?cmdio_write(status, " Ok");
}
/* Download commands */
static inline int
port_active(void)
{
?return (G.port_addr != NULL);
}
static inline int
pasv_active(void)
{
?return (G.pasv_listen_fd > STDOUT_FILENO);
}
static void
port_pasv_cleanup(void)
{
?free(G.port_addr);
?G.port_addr = NULL;
?if (G.pasv_listen_fd > STDOUT_FILENO)
? close(G.pasv_listen_fd);
?G.pasv_listen_fd = -1;
}
/* On error, emits error code to the peer */
static int
ftpdataio_get_pasv_fd(void)
{
?int remote_fd;
?remote_fd = accept(G.pasv_listen_fd, NULL, 0);
?if (remote_fd < 0) {
? WRITE_ERR(FTP_BADSENDCONN);
? return remote_fd;
?}
?setsockopt(remote_fd, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
?return remote_fd;
}
/* Clears port/pasv data.
?* This means we dont waste resources, for example, keeping
?* PASV listening socket open when it is no longer needed.
?* On error, emits error code to the peer (or exits).
?* On success, emits p_status_msg to the peer.
?*/
static int
get_remote_transfer_fd(const char *p_status_msg)
{
?int remote_fd;
?if (pasv_active())
? /* On error, emits error code to the peer */
? remote_fd = ftpdataio_get_pasv_fd();
?else
? /* Exits on error */
? remote_fd = xconnect_stream(G.port_addr);
?port_pasv_cleanup();
?if (remote_fd < 0)
? return remote_fd;
?cmdio_write(STRNUM32(FTP_DATACONN), p_status_msg);
?return remote_fd;
}
/* If there were neither PASV nor PORT, emits error code to the peer */
static int
port_or_pasv_was_seen(void)
{
?if (!pasv_active() && !port_active()) {
? cmdio_write_raw(STR(FTP_BADSENDCONN)" Use PORT/PASV first\r\n");
? return 0;
?}
?return 1;
}
/* Exits on error */
static unsigned
bind_for_passive_mode(void)
{
?int fd;
?unsigned port;
?port_pasv_cleanup();
?G.pasv_listen_fd = fd = xsocket(G.local_addr->u.sa.sa_family, SOCK_STREAM, 0);
?setsockopt_reuseaddr(fd);
?set_nport(G.local_addr, 0);
?xbind(fd, &G.local_addr->u.sa, G.local_addr->len);
?xlisten(fd, 1);
?getsockname(fd, &G.local_addr->u.sa, &G.local_addr->len);
?port = get_nport(&G.local_addr->u.sa);
?port = ntohs(port);
?return port;
}
/* Exits on error */
static void
handle_pasv(void)
{
?unsigned port;
?char *addr, *response;
?port = bind_for_passive_mode();
?if (G.local_addr->u.sa.sa_family == AF_INET)
? addr = xmalloc_sockaddr2dotted_noport(&G.local_addr->u.sa);
?else /* seen this in the wild done by other ftp servers: */
? addr = xstrdup("0.0.0.0");
?replace_char(addr, '.', ',');
?response = xasprintf(STR(FTP_PASVOK)" PASV ok (%s,%u,%u)\r\n",
? ?addr, (int)(port >> 8), (int)(port & 255));
?free(addr);
?cmdio_write_raw(response);
?free(response);
}
/* Exits on error */
static void
handle_epsv(void)
{
?unsigned port;
?char *response;
?port = bind_for_passive_mode();
?response = xasprintf(STR(FTP_EPSVOK)" EPSV ok (|||%u|)\r\n", port);
?cmdio_write_raw(response);
?free(response);
}
static void
handle_port(void)
{
?unsigned port, port_hi;
?char *raw, *comma;
#ifdef WHY_BOTHER_WE_CAN_ASSUME_IP_MATCHES
?socklen_t peer_ipv4_len;
?struct sockaddr_in peer_ipv4;
?struct in_addr port_ipv4_sin_addr;
#endif
?port_pasv_cleanup();
?raw = G.ftp_arg;
?/* PORT command format makes sense only over IPv4 */
?if (!raw
#ifdef WHY_BOTHER_WE_CAN_ASSUME_IP_MATCHES
? || G.local_addr->u.sa.sa_family != AF_INET
#endif
?) {
?bail:
? WRITE_ERR(FTP_BADCMD);
? return;
?}
?comma = strrchr(raw, ',');
?if (comma == NULL)
? goto bail;
?*comma = '\0';
?port = bb_strtou(&comma[1], NULL, 10);
?if (errno || port > 0xff)
? goto bail;
?comma = strrchr(raw, ',');
?if (comma == NULL)
? goto bail;
?*comma = '\0';
?port_hi = bb_strtou(&comma[1], NULL, 10);
?if (errno || port_hi > 0xff)
? goto bail;
?port |= port_hi << 8;
#ifdef WHY_BOTHER_WE_CAN_ASSUME_IP_MATCHES
?replace_char(raw, ',', '.');
?/* We are verifying that PORT's IP matches getpeername().
? * Otherwise peer can make us open data connections
? * to other hosts (security problem!)
? * This code would be too simplistic:
? * lsa = xdotted2sockaddr(raw, port);
? * if (lsa == NULL) goto bail;
? */
?if (!inet_aton(raw, &port_ipv4_sin_addr))
? goto bail;
?peer_ipv4_len = sizeof(peer_ipv4);
?if (getpeername(STDIN_FILENO, &peer_ipv4, &peer_ipv4_len) != 0)
? goto bail;
?if (memcmp(&port_ipv4_sin_addr, &peer_ipv4.sin_addr, sizeof(struct in_addr)) != 0)
? goto bail;
?G.port_addr = xdotted2sockaddr(raw, port);
#else
?G.port_addr = get_peer_lsa(STDIN_FILENO);
?set_nport(G.port_addr, htons(port));
#endif
?WRITE_OK(FTP_PORTOK);
}
static void
handle_rest(void)
{
?/* When ftp_arg == NULL simply restart from beginning */
?G.restart_pos = G.ftp_arg ? xatoi_u(G.ftp_arg) : 0;
?WRITE_OK(FTP_RESTOK);
}
static void
handle_retr(void)
{
?struct stat statbuf;
?off_t bytes_transferred;
?int remote_fd;
?int local_file_fd;
?off_t offset = G.restart_pos;
?char *response;
?G.restart_pos = 0;
?if (!port_or_pasv_was_seen())
? return; /* port_or_pasv_was_seen emitted error response */
?/* O_NONBLOCK is useful if file happens to be a device node */
?local_file_fd = G.ftp_arg ? open(G.ftp_arg, O_RDONLY | O_NONBLOCK) : -1;
?if (local_file_fd < 0) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?if (fstat(local_file_fd, &statbuf) != 0 || !S_ISREG(statbuf.st_mode)) {
? /* Note - pretend open failed */
? WRITE_ERR(FTP_FILEFAIL);
? goto file_close_out;
?}
?G.local_file_fd = local_file_fd;
?/* Now deactive O_NONBLOCK, otherwise we have a problem
? * on DMAPI filesystems such as XFS DMAPI.
? */
?ndelay_off(local_file_fd);
?/* Set the download offset (from REST) if any */
?if (offset != 0)
? xlseek(local_file_fd, offset, SEEK_SET);
?response = xasprintf(
? " Opening BINARY connection for %s (%"OFF_FMT"u bytes)",
? G.ftp_arg, statbuf.st_size);
?remote_fd = get_remote_transfer_fd(response);
?free(response);
?if (remote_fd < 0)
? goto file_close_out;
?bytes_transferred = bb_copyfd_eof(local_file_fd, remote_fd);
?close(remote_fd);
?if (bytes_transferred < 0)
? WRITE_ERR(FTP_BADSENDFILE);
?else
? WRITE_OK(FTP_TRANSFEROK);
?file_close_out:
?close(local_file_fd);
?G.local_file_fd = 0;
}
/* List commands */
static int
popen_ls(const char *opt)
{
?const char *argv[5];
?struct fd_pair outfd;
?pid_t pid;
?argv[0] = "ftpd";
?argv[1] = opt; /* "-l" or "-1" */
#if BB_MMU
?argv[2] = "--";
#else
?/* NOMMU ftpd ls helper chdirs to argv[2],
? * preventing peer from seeing real root. */
?argv[2] = xrealloc_getcwd_or_warn(NULL);
#endif
?argv[3] = G.ftp_arg;
?argv[4] = NULL;
?/* Improve compatibility with non-RFC conforming FTP clients
? * which send e.g. "LIST -l", "LIST -la", "LIST -aL".
? * See https://bugs.kde.org/show_bug.cgi?id=195578 */
?if (ENABLE_FEATURE_FTPD_ACCEPT_BROKEN_LIST
? && G.ftp_arg && G.ftp_arg[0] == '-'
?) {
? const char *tmp = strchr(G.ftp_arg, ' ');
? if (tmp) /* skip the space */
? ?tmp ;
? argv[3] = tmp;
?}
?xpiped_pair(outfd);
?/*fflush_all(); - so far we dont use stdio on output */
?pid = BB_MMU ? xfork() : xvfork();
?if (pid == 0) {
? /* child */
#if !BB_MMU
? /* On NOMMU, we want to execute a child - copy of ourself.
? ?* In chroot we usually can't do it. Thus we chdir
? ?* out of the chroot back to original root,
? ?* and (see later below) execute bb_busybox_exec_path
? ?* relative to current directory */
? if (fchdir(G.root_fd) != 0)
? ?_exit(127);
? /*close(G.root_fd); - close_on_exec_on() took care of this */
#endif
? /* NB: close _first_, then move fd! */
? close(outfd.rd);
? xmove_fd(outfd.wr, STDOUT_FILENO);
? /* Opening /dev/null in chroot is hard.
? ?* Just making sure STDIN_FILENO is opened
? ?* to something harmless. Paranoia,
? ?* ls won't read it anyway */
? close(STDIN_FILENO);
? dup(STDOUT_FILENO); /* copy will become STDIN_FILENO */
#if BB_MMU
? /* memset(&G, 0, sizeof(G)); - ls_main does it */
? exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv));
#else
? /* 1: we must use relative path here if in chroot.
? ?* For example, execv("/proc/self/exe") will fail, since
? ?* it looks for "/proc/self/exe" _relative to chroot!_ */
? execv(bb_busybox_exec_path 1, (char**) argv);
? _exit(127);
#endif
?}
?/* parent */
?close(outfd.wr);
#if !BB_MMU
?free((char*)argv[2]);
#endif
?return outfd.rd;
}
enum {
?USE_CTRL_CONN = 1,
?LONG_LISTING = 2,
};
static void
handle_dir_common(int opts)
{
?FILE *ls_fp;
?char *line;
?int ls_fd;
?if (!(opts & USE_CTRL_CONN) && !port_or_pasv_was_seen())
? return; /* port_or_pasv_was_seen emitted error response */
?/* -n prevents user/groupname display,
? * which can be problematic in chroot */
?ls_fd = popen_ls((opts & LONG_LISTING) ? "-l" : "-1");
?ls_fp = xfdopen_for_read(ls_fd);
?if (opts & USE_CTRL_CONN) {
? /* STAT <filename> */
? cmdio_write_raw(STR(FTP_STATFILE_OK)"-File status:\r\n");
? while (1) {
? ?line = xmalloc_fgetline(ls_fp);
? ?if (!line)
? ? break;
? ?/* Hack: 0 results in no status at all */
? ?/* Note: it's ok that we don't prepend space,
? ? * ftp.kernel.org doesn't do that too */
? ?cmdio_write(0, line);
? ?free(line);
? }
? WRITE_OK(FTP_STATFILE_OK);
?} else {
? /* LIST/NLST [<filename>] */
? int remote_fd = get_remote_transfer_fd(" Directory listing");
? if (remote_fd >= 0) {
? ?while (1) {
? ? line = xmalloc_fgetline(ls_fp);
? ? if (!line)
? ? ?break;
? ? /* I've seen clients complaining when they
? ? ?* are fed with ls output with bare '\n'.
? ? ?* Pity... that would be much simpler.
? ? ?*/
/* TODO: need to s/LF/NUL/g here */
? ? xwrite_str(remote_fd, line);
? ? xwrite(remote_fd, "\r\n", 2);
? ? free(line);
? ?}
? }
? close(remote_fd);
? WRITE_OK(FTP_TRANSFEROK);
?}
?fclose(ls_fp); /* closes ls_fd too */
}
static void
handle_list(void)
{
?handle_dir_common(LONG_LISTING);
}
static void
handle_nlst(void)
{
?/* NLST returns list of names, "\r\n" terminated without regard
? * to the current binary flag. Names may start with "/",
? * then they represent full names (we don't produce such names),
? * otherwise names are relative to current directory.
? * Embedded "\n" are replaced by NULs. This is safe since names
? * can never contain NUL.
? */
?handle_dir_common(0);
}
static void
handle_stat_file(void)
{
?handle_dir_common(LONG_LISTING USE_CTRL_CONN);
}
/* This can be extended to handle MLST, as all info is available
?* in struct stat for that:
?* MLST file_name
?* 250-Listing file_name
?* ?type=file;size=4161;modify=19970214165800; /dir/dir/file_name
?* 250 End
?* Nano-doc:
?* MLST [<file or dir name, "." assumed if not given>]
?* Returned name should be either the same as requested, or fully qualified.
?* If there was no parameter, return "" or (preferred) fully-qualified name.
?* Returned "facts" (case is not important):
?* ?size ? ?- size in octets
?* ?modify ?- last modification time
?* ?type ? ?- entry type (file,dir,OS.unix=block)
?* ? ? ? ? ? ?( cdir and pdir types for MLSD)
?* ?unique ?- unique id of file/directory (inode#)
?* ?perm ? ?-
?* ? ? ?a: can be appended to (APPE)
?* ? ? ?d: can be deleted (RMD/DELE)
?* ? ? ?f: can be renamed (RNFR)
?* ? ? ?r: can be read (RETR)
?* ? ? ?w: can be written (STOR)
?* ? ? ?e: can CWD into this dir
?* ? ? ?l: this dir can be listed (dir only!)
?* ? ? ?c: can create files in this dir
?* ? ? ?m: can create dirs in this dir (MKD)
?* ? ? ?p: can delete files in this dir
?* ?UNIX.mode - unix file mode
?*/
static void
handle_size_or_mdtm(int need_size)
{
?struct stat statbuf;
?struct tm broken_out;
?char buf[(sizeof("NNN %"OFF_FMT"u\r\n") sizeof(off_t) * 3)
? | sizeof("NNN YYYYMMDDhhmmss\r\n")
?];
?if (!G.ftp_arg
? || stat(G.ftp_arg, &statbuf) != 0
? || !S_ISREG(statbuf.st_mode)
?) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?if (need_size) {
? sprintf(buf, STR(FTP_STATFILE_OK)" %"OFF_FMT"u\r\n", statbuf.st_size);
?} else {
? gmtime_r(&statbuf.st_mtime, &broken_out);
? sprintf(buf, STR(FTP_STATFILE_OK)" uuuuuu\r\n",
? ?broken_out.tm_year 1900,
? ?broken_out.tm_mon,
? ?broken_out.tm_mday,
? ?broken_out.tm_hour,
? ?broken_out.tm_min,
? ?broken_out.tm_sec);
?}
?cmdio_write_raw(buf);
}
/* Upload commands */
#if ENABLE_FEATURE_FTP_WRITE
static void
handle_mkd(void)
{
?if (!G.ftp_arg || mkdir(G.ftp_arg, 0777) != 0) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?WRITE_OK(FTP_MKDIROK);
}
static void
handle_rmd(void)
{
?if (!G.ftp_arg || rmdir(G.ftp_arg) != 0) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?WRITE_OK(FTP_RMDIROK);
}
static void
handle_dele(void)
{
?if (!G.ftp_arg || unlink(G.ftp_arg) != 0) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?WRITE_OK(FTP_DELEOK);
}
static void
handle_rnfr(void)
{
?free(G.rnfr_filename);
?G.rnfr_filename = xstrdup(G.ftp_arg);
?WRITE_OK(FTP_RNFROK);
}
static void
handle_rnto(void)
{
?int retval;
?/* If we didn't get a RNFR, throw a wobbly */
?if (G.rnfr_filename == NULL || G.ftp_arg == NULL) {
? cmdio_write_raw(STR(FTP_NEEDRNFR)" Use RNFR first\r\n");
? return;
?}
?retval = rename(G.rnfr_filename, G.ftp_arg);
?free(G.rnfr_filename);
?G.rnfr_filename = NULL;
?if (retval) {
? WRITE_ERR(FTP_FILEFAIL);
? return;
?}
?WRITE_OK(FTP_RENAMEOK);
}
static void
handle_upload_common(int is_append, int is_unique)
{
?struct stat statbuf;
?char *tempname;
?off_t bytes_transferred;
?off_t offset;
?int local_file_fd;
?int remote_fd;
?offset = G.restart_pos;
?G.restart_pos = 0;
?if (!port_or_pasv_was_seen())
? return; /* port_or_pasv_was_seen emitted error response */
?tempname = NULL;
?local_file_fd = -1;
?if (is_unique) {
? tempname = xstrdup(" FILE: uniq.XXXXXX");
? local_file_fd = mkstemp(tempname 7);
?} else if (G.ftp_arg) {
? int flags = O_WRONLY | O_CREAT | O_TRUNC;
? if (is_append)
? ?flags = O_WRONLY | O_CREAT | O_APPEND;
? if (offset)
? ?flags = O_WRONLY | O_CREAT;
? local_file_fd = open(G.ftp_arg, flags, 0666);
?}
?if (local_file_fd < 0
? || fstat(local_file_fd, &statbuf) != 0
? || !S_ISREG(statbuf.st_mode)
?) {
? WRITE_ERR(FTP_UPLOADFAIL);
? if (local_file_fd >= 0)
? ?goto close_local_and_bail;
? return;
?}
?G.local_file_fd = local_file_fd;
?if (offset)
? xlseek(local_file_fd, offset, SEEK_SET);
?remote_fd = get_remote_transfer_fd(tempname ? tempname : " Ok to send data");
?free(tempname);
?if (remote_fd < 0)
? goto close_local_and_bail;
?bytes_transferred = bb_copyfd_eof(remote_fd, local_file_fd);
?close(remote_fd);
?if (bytes_transferred < 0)
? WRITE_ERR(FTP_BADSENDFILE);
?else
? WRITE_OK(FTP_TRANSFEROK);
?close_local_and_bail:
?close(local_file_fd);
?G.local_file_fd = 0;
}
static void
handle_stor(void)
{
?handle_upload_common(0, 0);
}
static void
handle_appe(void)
{
?G.restart_pos = 0;
?handle_upload_common(1, 0);
}
static void
handle_stou(void)
{
?G.restart_pos = 0;
?handle_upload_common(0, 1);
}
#endif /* ENABLE_FEATURE_FTP_WRITE */
static uint32_t
cmdio_get_cmd_and_arg(void)
{
?int len;
?uint32_t cmdval;
?char *cmd;
?alarm(G.timeout);
?free(G.ftp_cmd);
?{
? /* Paranoia. Peer may send 1 gigabyte long cmd... */
? /* Using separate len_on_stk instead of len optimizes
? ?* code size (allows len to be in CPU register) */
? size_t len_on_stk = 8 * 1024;
? G.ftp_cmd = cmd = xmalloc_fgets_str_len(stdin, "\r\n", &len_on_stk);
? if (!cmd)
? ?exit(0);
? len = len_on_stk;
?}
?/* De-escape telnet: 0xff,0xff => 0xff */
?/* RFC959 says that ABOR, STAT, QUIT may be sent even during
? * data transfer, and may be preceded by telnet's "Interrupt Process"
? * code (two-byte sequence 255,244) and then by telnet "Synch" code
? * 255,242 (byte 242 is sent with TCP URG bit using send(MSG_OOB)
? * and may generate SIGURG on our side. See RFC854).
? * So far we don't support that (may install SIGURG handler if we'd want to),
? * but we need to at least remove 255,xxx pairs. lftp sends those. */
?/* Then de-escape FTP: NUL => '\n' */
?/* Testing for \xff:
? * Create file named '\xff': echo Hello >`echo -ne "\xff"`
? * Try to get it: ? ? ? ? ? ?ftpget -v 127.0.0.1 Eff `echo -ne "\xff\xff"`
? * (need "\xff\xff" until ftpget applet is fixed to do escaping :)
? * Testing for embedded LF:
? * LF_HERE=`echo -ne "LF\nHERE"`
? * echo Hello >"$LF_HERE"
? * ftpget -v 127.0.0.1 LF_HERE "$LF_HERE"
? */
?{
? int dst, src;
? /* Strip "\r\n" if it is there */
? if (len != 0 && cmd[len - 1] == '\n') {
? ?len--;
? ?if (len != 0 && cmd[len - 1] == '\r')
? ? len--;
? ?cmd[len] = '\0';
? }
? src = strchrnul(cmd, 0xff) - cmd;
? /* 99,99% there are neither NULs nor 255s and src == len */
? if (src < len) {
? ?dst = src;
? ?do {
? ? if ((unsigned char)(cmd[src]) == 255) {
? ? ?src ;
? ? ?/* 255,xxx - skip 255 */
? ? ?if ((unsigned char)(cmd[src]) != 255) {
? ? ? /* 255,!255 - skip both */
? ? ? src ;
? ? ? continue;
? ? ?}
? ? ?/* 255,255 - retain one 255 */
? ? }
? ? /* NUL => '\n' */
? ? cmd[dst ] = cmd[src] ? cmd[src] : '\n';
? ? src ;
? ?} while (src < len);
? ?cmd[dst] = '\0';
? }
?}
?if (G.verbose > 1)
? verbose_log(cmd);
?G.ftp_arg = strchr(cmd, ' ');
?if (G.ftp_arg != NULL)
? *G.ftp_arg = '\0';
?/* Uppercase and pack into uint32_t first word of the command */
?cmdval = 0;
?while (*cmd)
? cmdval = (cmdval << 8) ((unsigned char)*cmd & (unsigned char)~0x20);
?return cmdval;
}
#define mk_const4(a,b,c,d) (((a * 0x100 b) * 0x100 c) * 0x100 d)
#define mk_const3(a,b,c) ? ?((a * 0x100 b) * 0x100 c)
enum {
?const_ALLO = mk_const4('A', 'L', 'L', 'O'),
?const_APPE = mk_const4('A', 'P', 'P', 'E'),
?const_CDUP = mk_const4('C', 'D', 'U', 'P'),
?const_CWD ?= mk_const3('C', 'W', 'D'),
?const_DELE = mk_const4('D', 'E', 'L', 'E'),
?const_EPSV = mk_const4('E', 'P', 'S', 'V'),
?const_FEAT = mk_const4('F', 'E', 'A', 'T'),
?const_HELP = mk_const4('H', 'E', 'L', 'P'),
?const_LIST = mk_const4('L', 'I', 'S', 'T'),
?const_MDTM = mk_const4('M', 'D', 'T', 'M'),
?const_MKD ?= mk_const3('M', 'K', 'D'),
?const_MODE = mk_const4('M', 'O', 'D', 'E'),
?const_NLST = mk_const4('N', 'L', 'S', 'T'),
?const_NOOP = mk_const4('N', 'O', 'O', 'P'),
?const_PASS = mk_const4('P', 'A', 'S', 'S'),
?const_PASV = mk_const4('P', 'A', 'S', 'V'),
?const_PORT = mk_const4('P', 'O', 'R', 'T'),
?const_PWD ?= mk_const3('P', 'W', 'D'),
?const_QUIT = mk_const4('Q', 'U', 'I', 'T'),
?const_REST = mk_const4('R', 'E', 'S', 'T'),
?const_RETR = mk_const4('R', 'E', 'T', 'R'),
?const_RMD ?= mk_const3('R', 'M', 'D'),
?const_RNFR = mk_const4('R', 'N', 'F', 'R'),
?const_RNTO = mk_const4('R', 'N', 'T', 'O'),
?const_SIZE = mk_const4('S', 'I', 'Z', 'E'),
?const_STAT = mk_const4('S', 'T', 'A', 'T'),
?const_STOR = mk_const4('S', 'T', 'O', 'R'),
?const_STOU = mk_const4('S', 'T', 'O', 'U'),
?const_STRU = mk_const4('S', 'T', 'R', 'U'),
?const_SYST = mk_const4('S', 'Y', 'S', 'T'),
?const_TYPE = mk_const4('T', 'Y', 'P', 'E'),
?const_USER = mk_const4('U', 'S', 'E', 'R'),
#if !BB_MMU
?OPT_l = (1 << 0),
?OPT_1 = (1 << 1),
#endif
?OPT_v = (1 << ((!BB_MMU) * 2 0)),
?OPT_S = (1 << ((!BB_MMU) * 2 1)),
?OPT_w = (1 << ((!BB_MMU) * 2 2)) * ENABLE_FEATURE_FTP_WRITE,
};
//wsm add
#ifdef IF_WE_WANT_TO_REQUIRE_LOGIN
static int parse_username(char *user_list,char *user)//該函數(shù)是用來(lái)驗(yàn)證用戶名的
{
?FILE *stream;
?char buf[100];
?bzero(buf,sizeof(buf));
?if((stream = fopen(user_list,"r"))==NULL)
?{
? //puts("file /etc/ftpusers open fail! \n");
? return 0;?
?}
?while ((fgets (buf, 100, stream)) != NULL)
? {
? buf[strlen(buf)-1]='\0';
? if((buf[0]!='#')&&(strcmp(buf,user)==0))
? {
? ?//puts("user is accept !\n");
? ?fclose(stream);
? ?return 1;
? }
??
? }
?fclose(stream);
?//puts("user is refuse !\n");
?return 0;
}
static int parse_username_password(char *user,char *password)//該函數(shù)是用來(lái)驗(yàn)證用戶名對(duì)應(yīng)的密碼的
{
?const char *cpwd = NULL;
?struct passwd *pw;
?struct spwd *spw;?
?char *crypt_pw;
?
?pw=getpwnam(user);
?if(pw) ?
?{
? if ((((pw->pw_passwd)[0] == 'x' && (pw->pw_passwd)[1] == 0) || \
? ((pw->pw_passwd)[0] == '#' && (pw->pw_passwd)[1] == '#' && \
? strcmp(pw->pw_passwd 2, user) == 0)) && \
? (spw = getspnam(user)) != NULL && spw->sp_pwdp != NULL)
? {
? ? ? ? cpwd = spw->sp_pwdp[0] == '@' ? NULL : spw->sp_pwdp;
? ? ? }
? ? ?else
? ? ?{
? ? ? ?cpwd= pw->pw_passwd;
? ? ?}
??
? crypt_pw = crypt(password,cpwd);
??
? if (strcmp(cpwd,crypt_pw)==0)
? {
? ?//printf("Success!\n");?
? ?return 1; ? ? ??
? }
? else
? {
? ?//printf("Password is not correct!\n");
? ? ? return 0;
? ? ?}
? ?}
? ?else
? ? {
? ? ? //printf("Unknown User!\n");
? ? ? return 0;
? ? }
}
#endif
//end wsm
int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
#if !BB_MMU
int ftpd_main(int argc, char **argv)
#else
int ftpd_main(int argc UNUSED_PARAM, char **argv)
#endif
{
?unsigned abs_timeout;
?unsigned verbose_S;
?smallint opts;
?char user[50];//wsm add
?char user_list[50]="/etc/ftpusers";//wsm add
?INIT_G();
?abs_timeout = 1 * 60 * 60;
?verbose_S = 0;
?G.timeout = 2 * 60;
?opt_complementary = "t :T :vv:SS";
#if BB_MMU
?opts = getopt32(argv, ? "vS" IF_FEATURE_FTP_WRITE("w") "t:T:", &G.timeout, &abs_timeout, &G.verbose, &verbose_S);
#else
?opts = getopt32(argv, "l1vS" IF_FEATURE_FTP_WRITE("w") "t:T:", &G.timeout, &abs_timeout, &G.verbose, &verbose_S);
?if (opts & (OPT_l|OPT_1)) {
? /* Our secret backdoor to ls */
/* TODO: pass -n? It prevents user/group resolution, which may not work in chroot anyway */
/* TODO: pass -A? It shows dot files */
/* TODO: pass --group-directories-first? would be nice, but ls doesn't do that yet */
? xchdir(argv[2]);
? argv[2] = (char*)"--";
? /* memset(&G, 0, sizeof(G)); - ls_main does it */
? return ls_main(argc, argv);
?}
#endif
?if (G.verbose < verbose_S)
? G.verbose = verbose_S;
?if (abs_timeout | G.timeout) {
? if (abs_timeout == 0)
? ?abs_timeout = INT_MAX;
? G.end_time = monotonic_sec() abs_timeout;
? if (G.timeout > abs_timeout)
? ?G.timeout = abs_timeout;
?}
?strcpy(G.msg_ok ?4, MSG_OK );
?strcpy(G.msg_err 4, MSG_ERR);
?G.local_addr = get_sock_lsa(STDIN_FILENO);
?if (!G.local_addr) {
? /* This is confusing:
? ?* bb_error_msg_and_die("stdin is not a socket");
? ?* Better: */
? bb_show_usage();
? /* Help text says that ftpd must be used as inetd service,
? ?* which is by far the most usual cause of get_sock_lsa
? ?* failure */
?}
?if (!(opts & OPT_v))
? logmode = LOGMODE_NONE;
?if (opts & OPT_S) {
? /* LOG_NDELAY is needed since we may chroot later */
? openlog(applet_name, LOG_PID | LOG_NDELAY, LOG_DAEMON);
? logmode |= LOGMODE_SYSLOG;
?}
?if (logmode)
? applet_name = xasprintf("%s[%u]", applet_name, (int)getpid());
#if !BB_MMU
?G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY);
?close_on_exec_on(G.root_fd);
#endif
?if (argv[optind]) {
? xchdir(argv[optind]);
? chroot(".");
?}
?//wsm add 該段代碼是用來(lái)讀取出被允許的用戶列表文件的路徑,只有在該列表中的用戶才被允許登陸
?if(argv[optind 1])
?{
? strcpy(user_list,argv[optind 1]);
?}
?//end wsm
?//umask(077); - admin can set umask before starting us
?/* Signals. We'll always take -EPIPE rather than a rude signal, thanks */
?signal(SIGPIPE, SIG_IGN);
?/* Set up options on the command socket (do we need these all? why?) */
?setsockopt(STDIN_FILENO, IPPROTO_TCP, TCP_NODELAY, &const_int_1, sizeof(const_int_1));
?setsockopt(STDIN_FILENO, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
?/* Telnet protocol over command link may send "urgent" data,
? * we prefer it to be received in the "normal" data stream: */
?setsockopt(STDIN_FILENO, SOL_SOCKET, SO_OOBINLINE, &const_int_1, sizeof(const_int_1));
?WRITE_OK(FTP_GREET);
?signal(SIGALRM, timeout_handler);
#ifdef IF_WE_WANT_TO_REQUIRE_LOGIN
?{
? smallint user_was_specified = 0;
? while (1) {
? ?uint32_t cmdval = cmdio_get_cmd_and_arg();
? ?if (cmdval == const_USER) {
? ? //if (G.ftp_arg == NULL || strcasecmp(G.ftp_arg, "anonymous") != 0)//wsm dec
? ? if (G.ftp_arg == NULL || parse_username(user_list,G.ftp_arg) == 0)//wsm
? ? ?cmdio_write_raw(STR(FTP_LOGINERR)" user is refuse\r\n");//wsm ch
? ? else {
? ? ?user_was_specified = 1;
? ? ?strcpy(user,G.ftp_arg);
? ? ?cmdio_write_raw(STR(FTP_GIVEPWORD)" Please specify the password\r\n");
? ? }
? ?} else if (cmdval == const_PASS) {
? ? if (user_was_specified)
? ? {
? ? ?if(parse_username_password(user,G.ftp_arg))
? ? ?{
? ? ? break;
? ? ?}
? ? ?cmdio_write_raw(STR(FTP_LOGINERR)" password error\r\n");
? ? }
? ? else
? ? {
? ? ?cmdio_write_raw(STR(FTP_NEEDUSER)" Login with USER\r\n");
? ? }
? ?} else if (cmdval == const_QUIT) {
? ? WRITE_OK(FTP_GOODBYE);
? ? return 0;
? ?} else {
? ? cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER and PASS\r\n");
? ?}
? }
?}
?WRITE_OK(FTP_LOGINOK);
#endif
?/* RFC-959 Section 5.1
? * The following commands and options MUST be supported by every
? * server-FTP and user-FTP, except in cases where the underlying
? * file system or operating system does not allow or support
? * a particular command.
? * Type: ASCII Non-print, IMAGE, LOCAL 8
? * Mode: Stream
? * Structure: File, Record*
? * (Record structure is REQUIRED only for hosts whose file
? * ?systems support record structure).
? * Commands:
? * USER, PASS, ACCT, [bbox: ACCT not supported]
? * PORT, PASV,
? * TYPE, MODE, STRU,
? * RETR, STOR, APPE,
? * RNFR, RNTO, DELE,
? * CWD, ?CDUP, RMD, ?MKD, ?PWD,
? * LIST, NLST,
? * SYST, STAT,
? * HELP, NOOP, QUIT.
? */
?/* ACCOUNT (ACCT)
? * "The argument field is a Telnet string identifying the user's account.
? * The command is not necessarily related to the USER command, as some
? * sites may require an account for login and others only for specific
? * access, such as storing files. In the latter case the command may
? * arrive at any time.
? * There are reply codes to differentiate these cases for the automation:
? * when account information is required for login, the response to
? * a successful PASSword command is reply code 332. On the other hand,
? * if account information is NOT required for login, the reply to
? * a successful PASSword command is 230; and if the account information
? * is needed for a command issued later in the dialogue, the server
? * should return a 332 or 532 reply depending on whether it stores
? * (pending receipt of the ACCounT command) or discards the command,
? * respectively."
? */
?while (1) {
? uint32_t cmdval = cmdio_get_cmd_and_arg();
? if (cmdval == const_QUIT) {
? ?WRITE_OK(FTP_GOODBYE);
? ?return 0;
? }
? else if (cmdval == const_USER)
? ?/* This would mean "ok, now give me PASS". */
? ?/*WRITE_OK(FTP_GIVEPWORD);*/
? ?/* vsftpd can be configured to not require that,
? ? * and this also saves one roundtrip:
? ? */
? ?WRITE_OK(FTP_LOGINOK);
? else if (cmdval == const_PASS)
? ?WRITE_OK(FTP_LOGINOK);
? else if (cmdval == const_NOOP)
? ?WRITE_OK(FTP_NOOPOK);
? else if (cmdval == const_TYPE)
? ?WRITE_OK(FTP_TYPEOK);
? else if (cmdval == const_STRU)
? ?WRITE_OK(FTP_STRUOK);
? else if (cmdval == const_MODE)
? ?WRITE_OK(FTP_MODEOK);
? else if (cmdval == const_ALLO)
? ?WRITE_OK(FTP_ALLOOK);
? else if (cmdval == const_SYST)
? ?cmdio_write_raw(STR(FTP_SYSTOK)" UNIX Type: L8\r\n");
? else if (cmdval == const_PWD)
? ?handle_pwd();
? else if (cmdval == const_CWD)
? ?handle_cwd();
? else if (cmdval == const_CDUP) /* cd .. */
? ?handle_cdup();
? /* HELP is nearly useless, but we can reuse FEAT for it */
? /* lftp uses FEAT */
? else if (cmdval == const_HELP || cmdval == const_FEAT)
? ?handle_feat(cmdval == const_HELP
? ? ?? STRNUM32(FTP_HELP)
? ? ?: STRNUM32(FTP_STATOK)
? ?);
? else if (cmdval == const_LIST) /* ls -l */
? ?handle_list();
? else if (cmdval == const_NLST) /* "name list", bare ls */
? ?handle_nlst();
? /* SIZE is crucial for wget's download indicator etc */
? /* Mozilla, lftp use MDTM (presumably for caching) */
? else if (cmdval == const_SIZE || cmdval == const_MDTM)
? ?handle_size_or_mdtm(cmdval == const_SIZE);
? else if (cmdval == const_STAT) {
? ?if (G.ftp_arg == NULL)
? ? handle_stat();
? ?else
? ? handle_stat_file();
? }
? else if (cmdval == const_PASV)
? ?handle_pasv();
? else if (cmdval == const_EPSV)
? ?handle_epsv();
? else if (cmdval == const_RETR)
? ?handle_retr();
? else if (cmdval == const_PORT)
? ?handle_port();
? else if (cmdval == const_REST)
? ?handle_rest();
#if ENABLE_FEATURE_FTP_WRITE
? else if (opts & OPT_w) {
? ?if (cmdval == const_STOR)
? ? handle_stor();
? ?else if (cmdval == const_MKD)
? ? handle_mkd();
? ?else if (cmdval == const_RMD)
? ? handle_rmd();
? ?else if (cmdval == const_DELE)
? ? handle_dele();
? ?else if (cmdval == const_RNFR) /* "rename from" */
? ? handle_rnfr();
? ?else if (cmdval == const_RNTO) /* "rename to" */
? ? handle_rnto();
? ?else if (cmdval == const_APPE)
? ? handle_appe();
? ?else if (cmdval == const_STOU) /* "store unique" */
? ? handle_stou();
? ?else
? ? goto bad_cmd;
? }
#endif
#if 0
? else if (cmdval == const_STOR
? ?|| cmdval == const_MKD
? ?|| cmdval == const_RMD
? ?|| cmdval == const_DELE
? ?|| cmdval == const_RNFR
? ?|| cmdval == const_RNTO
? ?|| cmdval == const_APPE
? ?|| cmdval == const_STOU
? ) {
? ?cmdio_write_raw(STR(FTP_NOPERM)" Permission denied\r\n");
? }
#endif
? else {
? ?/* Which unsupported commands were seen in the wild?
? ? * (doesn't necessarily mean "we must support them")
? ? * foo 1.2.3: XXXX - comment
? ? */
#if ENABLE_FEATURE_FTP_WRITE
?bad_cmd:
#endif
? ?cmdio_write_raw(STR(FTP_BADCMD)" Unknown command\r\n");
? }
?}
}


tcpsvd 0 21 ftpd -w / -t 5 /etc/ftpusers
上面是我的啟動(dòng)ftpd服務(wù)器的命令
第一個(gè)‘/’是ftpd服務(wù)器的共享目錄,“/etc/ftpusers”是被允許的用戶列表文件,用戶可以根據(jù)實(shí)際路徑改變,用戶列表文件的格式為每一行一個(gè)用戶名,不允許的用戶刪除該行或者用#注釋掉即可,另外要求用戶列表文件路徑必須在共享目錄路徑的后面。

總結(jié)

以上是生活随笔為你收集整理的http://blog.chinaunix.net/uid-25082381-id-3242162.html的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

99久久久国产精品免费99 | 免费久久视频 | 欧美乱大交 | 黄av免费 | 国产精品久久久久久999 | 久久久精品国产一区二区三区 | a在线视频v视频 | 麻豆视频免费在线观看 | 美女性爽视频国产免费app | 一区二区三区视频在线 | 韩国视频一区二区三区 | 精品久久久久久久久久国产 | 一区二区三区国产欧美 | 国产黄色av影视 | 九九九热 | 永久免费精品视频网站 | 九月婷婷人人澡人人添人人爽 | 日韩在线播放av | 精品久久久久久久久久久久久 | 久久香蕉国产精品麻豆粉嫩av | 亚洲成人动漫在线观看 | 亚洲激情av| 亚洲 综合 激情 | 中文字幕在线播放一区 | 黄a在线观看| 毛片3 | 国产在线精品一区二区 | 最近中文字幕mv免费高清在线 | 日本精品小视频 | 国产成人久久久77777 | 在线黄频| 在线免费三级 | 久久成人国产精品免费软件 | 国产午夜不卡 | 国产精品毛片一区二区在线 | 色全色在线资源网 | 97理论片| 久久久久一区二区三区 | 99精品乱码国产在线观看 | 99热播精品 | 亚洲精品白浆高清久久久久久 | 日本精品xxxx | 国产老太婆免费交性大片 | 久久国产影院 | 日韩二区在线播放 | 91精品国产亚洲 | 色99色| 麻豆视频国产精品 | 欧美一二三区在线播放 | 久久综合久久伊人 | 视频在线观看入口黄最新永久免费国产 | 日韩日韩日韩日韩 | 国产视频欧美视频 | 亚州视频在线 | 欧美日韩亚洲第一 | 97精品国产一二三产区 | 激情久久伊人 | 国产高清视频免费观看 | 久久久久亚洲天堂 | 亚洲激情六月 | 美女福利视频一区二区 | 中文字幕中文字幕 | 黄污网站在线观看 | 九色在线 | 中文字幕精品三级久久久 | www.在线看片.com | 九九久久免费 | 高清国产在线一区 | 久久精品国产一区二区三 | 欧美色黄 | 免费看污污视频的网站 | 国产精品原创在线 | 日韩欧美在线免费观看 | av中文字幕av | 天天综合天天做天天综合 | 黄av免费在线观看 | 久久综合中文色婷婷 | 日韩高清久久 | 欧美成人xxxxx| 在线观看一区视频 | 91麻豆看国产在线紧急地址 | 国产在线观看99 | 亚洲婷久久 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 超碰在线94| 性色av一区二区三区在线观看 | 亚洲女同ⅹxx女同tv | 韩日电影在线 | 天天玩夜夜操 | 黄色免费大全 | 国产精品乱码久久久久久1区2区 | 激情喷水 | 国语精品免费视频 | 日韩av伦理片 | 天天透天天插 | 国产精品久久久久久久av电影 | 日韩欧美在线观看一区二区三区 | 狠狠干夜夜操天天爽 | 6080yy午夜一二三区久久 | 中文字幕在线播放日韩 | 日韩电影中文字幕 | 日韩系列在线 | 日日操网 | 日韩久久视频 | 97在线观视频免费观看 | 亚洲精品欧美成人 | 精品久久中文 | 成人在线视频论坛 | 狠狠狠狠狠狠 | 中文资源在线官网 | 国产中文字幕在线免费观看 | 天天干夜夜夜操天 | 91私密保健| aaa免费毛片 | 国产五月天婷婷 | 亚洲1区在线 | 亚洲最大成人免费网站 | 成片免费观看视频大全 | 91精品国产自产老师啪 | 久草在线在线 | 五月婷婷中文 | 精品高清美女精品国产区 | 91九色蝌蚪视频在线 | 天天射日 | 国产69精品久久久久9999apgf | 中文字幕一区二区三区乱码不卡 | 91中文视频 | 国产精品久久久久久久久久白浆 | 久久国产品 | 在线观看免费一级片 | 久久精品一二三区 | 亚洲精品国产精品国自产 | 五月丁色| 欧美亚洲免费在线一区 | 国产亚洲成av人片在线观看桃 | 国产精品专区h在线观看 | 97视频精品| 久久成人在线视频 | 视频一区视频二区在线观看 | 久久成人精品电影 | 国产夫妻自拍av | 国产精品视频在线观看 | 中文字幕在线一区二区三区 | 午夜影院在线观看18 | 99久久er热在这里只有精品15 | 日韩欧美视频二区 | 欧美激精品 | 中文字幕激情 | 久久精品国产亚洲aⅴ | 99热最新地址 | 日韩二区三区在线观看 | 99精品视频99 | 国产日本三级 | 亚洲综合在线视频 | av中文字幕免费在线观看 | 久久久久久久综合色一本 | 91av在线免费观看 | 日韩在线观看电影 | 色综合久久88色综合天天 | 五月婷婷一区 | 波多野结衣在线观看视频 | 国产在线中文 | 91在线观看视频网站 | 成人免费在线看片 | 久久国产免费视频 | 天天干,天天射,天天操,天天摸 | 99色亚洲 | 成人性生交大片免费看中文网站 | 青春草免费在线视频 | 久九视频 | 国产一区二区在线免费视频 | 天天操夜夜拍 | 久久www免费人成看片高清 | 国产精品久久久久久一二三四五 | www蜜桃视频 | 91精品麻豆| 欧美精品在线免费 | 久久久精品免费观看 | 欧美污网站 | 中文字幕欧美日韩va免费视频 | 人人爽人人爽人人 | 国产精品av在线 | 日韩av在线不卡 | 久草视频免费观 | 久久国产精品99久久人人澡 | 久青草影院 | 99久久婷婷 | 久久av在线 | 五月天狠狠操 | 久草在线观看视频免费 | 狠狠干激情 | 免费黄色在线网站 | 久草在线 | 日韩电影一区二区三区 | 国产人成在线观看 | 黄污在线看 | 国产破处视频在线播放 | 四虎成人免费观看 | 日本久久综合视频 | 中文字幕日韩伦理 | 激情av五月婷婷 | 九色琪琪久久综合网天天 | 国产综合精品久久 | 国产精品免费久久久久久 | 麻豆传媒在线免费看 | 国产麻豆视频免费观看 | 青青草在久久免费久久免费 | 欧美日韩不卡在线 | 精品久久久久久久久亚洲 | 日韩免费看视频 | 免费看国产a | 国产伦精品一区二区三区… | 高清一区二区 | 天天夜夜狠狠操 | 黄色www| 国产欧美在线一区 | 韩国av不卡 | 久精品视频 | 天堂资源在线观看视频 | www.夜夜骑.com | 精品99视频 | 精品视频久久 | 亚洲精品在线二区 | 免费看成人片 | 日韩欧美在线观看一区二区三区 | 亚洲黄色一级电影 | 99免费视频 | 在线免费亚洲 | 中文字幕精品一区二区三区电影 | 手机av观看| 色婷婷综合激情 | 亚州精品成人 | www.国产在线 | 国产又粗又猛又黄又爽的视频 | 国内视频 | 五月天久久婷婷 | 婷婷精品进入 | 久久国语露脸国产精品电影 | 99热在| 99视频偷窥在线精品国自产拍 | 色综合欧洲 | 日韩欧美视频免费在线观看 | 国产精品精 | 亚洲黄色小说网址 | 欧美日韩国产欧美 | 香蕉影院在线 | 久久五月婷婷丁香社区 | 国产精品视屏 | 亚洲另类人人澡 | 婷婷丁香久久五月婷婷 | 色综合久久久久综合 | 96香蕉视频 | 亚洲午夜在线视频 | 日韩久久在线 | 久久久国产99久久国产一 | 精品99在线观看 | 天天艹天天 | 色在线免费观看 | 国产丝袜 | 久久在线免费视频 | 欧美极品在线播放 | 在线 日韩 av | 日韩videos| 亚洲国内精品视频 | 美女网站久久 | 久久久国产一区二区三区 | 国产黄色片网站 | 视频高清 | 久久精品女人毛片国产 | 天天天操操操 | 久久人人爽人人人人片 | 国产女人免费看a级丨片 | 中文字幕精品www乱入免费视频 | 香蕉视频在线免费 | 在线观看视频免费大全 | 99爱视频| 99久视频| 国产成年人av | 国产小视频在线观看免费 | 精品国产一区二区三区久久久蜜月 | 国内精品福利视频 | 色资源二区在线视频 | 五月天丁香| 欧美91视频 | 91在线精品观看 | 亚洲色视频 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 精品在线免费视频 | 婷婷色综合色 | av解说在线观看 | 91九色视频观看 | 国产精品久久久久久999 | av在线之家电影网站 | 欧美韩国日本在线 | 色综合久久66 | 久久这里只有精品1 | 成人黄色在线看 | 麻豆av一区二区三区在线观看 | 69av免费视频 | 婷婷综合视频 | 亚洲欧美日本一区二区三区 | 免费三级网 | 免费一级片在线 | 激情影院在线 | 亚洲天堂色婷婷 | av网站手机在线观看 | 久久精品一区二区三 | 欧美日韩中文国产一区发布 | 国内精品福利视频 | 欧美精品久久99 | 天天干,天天射,天天操,天天摸 | 曰韩精品 | 日日夜夜免费精品视频 | 亚洲高清视频在线观看免费 | 麻豆精品91 | 国产美女精品 | 日b视频国产 | 黄色在线看网站 | 国内久久精品 | 国产一级黄色电影 | 亚洲精品视 | 日韩xxxxxxxxx | 色婷婷综合久久久久中文字幕1 | 久久久国产高清 | 日韩在线观看网站 | 毛片888 | 亚洲精品国产综合久久 | 久久乐九色婷婷综合色狠狠182 | 国产福利91精品一区二区三区 | 草久在线观看 | 狠狠干天天射 | 在线导航av | 日本丶国产丶欧美色综合 | 久久综合免费视频影院 | 激情综合网在线观看 | 18性欧美xxxⅹ性满足 | 日韩二级毛片 | 欧美精品一区二区蜜臀亚洲 | 中文字幕免费看 | 韩国av一区 | 天天干婷婷| 91中文在线视频 | 91黄视频在线观看 | 美女网站色免费 | 久久天堂精品视频 | 亚洲精品在线免费观看视频 | 精品国模一区二区三区 | 人人澡人人添人人爽一区二区 | 欧洲精品视频一区二区 | 日韩在线观看av | 日韩在线二区 | 大型av综合网站 | www.五月天 | 在线亚洲精品 | 久久国产乱 | 最新高清无码专区 | 久久老司机精品视频 | 国产精品乱码久久久久久1区2区 | 亚洲免费国产视频 | 91视频久久久 | 在线观看你懂的网址 | 公与妇乱理三级xxx 在线观看视频在线观看 | 99久久精品免费看国产一区二区三区 | 国产精品理论视频 | 久久久久国产精品一区二区 | 91精品视频一区二区三区 | 久久欧美在线电影 | 国产精品 中文字幕 亚洲 欧美 | 欧美精品一区二区性色 | 日日夜夜精品视频天天综合网 | 五月婷婷在线播放 | 中文字幕在线视频一区 | 麻豆91精品视频 | av大片免费看 | 久久精品视频在线免费观看 | 成 人 黄 色 视频 免费观看 | 久久精国产 | 蜜桃麻豆www久久囤产精品 | 超碰97网站 | av一级片在线观看 | 亚洲免费在线播放视频 | 日韩欧美在线视频一区二区三区 | 亚洲在线视频网站 | 福利视频一二区 | 国产精品成人在线 | 欧美一区二区三区在线观看 | 日韩素人在线观看 | www.亚洲精品 | 91成人精品一区在线播放69 | 成人九九视频 | 婷婷在线网站 | 日本一区二区不卡高清 | 成人欧美一区二区三区黑人麻豆 | 国产免费不卡av | 91成人天堂久久成人 | av一本久道久久波多野结衣 | 色婷婷成人网 | 伊人伊成久久人综合网小说 | 久久精品精品电影网 | 欧美性色xo影院 | 国内精品久久天天躁人人爽 | 欧美日韩91| 亚洲国产精久久久久久久 | 美女视频久久久 | 午夜国产影院 | 色先锋资源网 | 99久久国产免费,99久久国产免费大片 | 在线播放第一页 | 久久夜av| 欧美综合色| 综合久久网 | 国产精品永久免费在线 | 久久综合九色综合97_ 久久久 | 日韩免费电影一区二区三区 | 精品国产电影一区 | 最近中文字幕第一页 | 一二三区av| 草莓视频在线观看免费观看 | 叶爱av在线 | 丁香花在线视频观看免费 | 亚洲成人精品在线 | 天天躁天天躁天天躁婷 | 久久涩视频 | 91九色视频导航 | 九九日韩 | 亚州激情视频 | 色是在线视频 | 又黄又爽又刺激 | 国精产品永久999 | 丁香 婷婷 激情 | 五月婷在线 | 米奇狠狠狠888 | 青青啪 | 国产视频在线免费观看 | 国产日韩欧美自拍 | 黄色一级大片免费看 | 久久草草影视免费网 | 国产美女被啪进深处喷白浆视频 | 日韩在线视 | 国产中文字幕视频在线 | 久久99精品国产麻豆宅宅 | 日韩v欧美v日本v亚洲v国产v | 最近日本mv字幕免费观看 | 色天天| 国产精品第一视频 | 人人舔人人爽 | 国产精品免费一区二区 | 狠狠操精品 | 成人国产精品久久久久久亚洲 | 九九九热精品免费视频观看网站 | 色妞久久福利网 | 久久久伦理 | 亚洲成人黄色在线 | 91在线最新| 91高清视频 | 精品毛片久久久久久 | 国产久草在线 | 色久综合 | 日本久久免费电影 | 欧美韩国在线 | 91麻豆网站 | 久久久午夜剧场 | 日本精品久久久久影院 | 在线免费日韩 | 五月激情在线 | 狠狠操操操| 香蕉网在线观看 | 婷婷丁香在线视频 | 久久中文精品视频 | 久草在线观| 国产精品精品 | 91爱爱电影 | 日韩啪视频 | 99视频在线精品免费观看2 | 久久国产精品偷 | 黄色片网站 | 欧美日韩亚洲一 | 亚洲aⅴ免费在线观看 | 欧美a在线免费观看 | 日本性生活一级片 | 98久9在线 | 免费 | 精品福利在线视频 | 国产精品毛片久久久久久 | 九九九热精品免费视频观看 | 日韩精品久久久久久中文字幕8 | 97在线成人| 亚洲综合成人专区片 | 欧产日产国产69 | 成年人app网址 | 日韩在线免费看 | 特级xxxxx欧美 | 一区二区三区免费在线观看 | 久久超 | 国产精品s色 | 91精品影视| 在线播放一区 | 夜夜躁日日躁狠狠躁 | 久草网在线视频 | 91久久国产综合精品女同国语 | 久久大片网站 | 99久久久久免费精品国产 | 精品99在线观看 | 中文字幕免费高清在线观看 | 91原创在线观看 | 精品女同一区二区三区在线观看 | 一区二区三区四区五区在线 | 久久精品第一页 | 91麻豆国产福利在线观看 | 亚洲清纯国产 | 国产精品一区二区电影 | 精品亚洲欧美无人区乱码 | 在线视频区 | 久久久黄色免费网站 | 综合国产视频 | 国产一区精品在线观看 | 亚洲一一在线 | 久久久久久蜜桃一区二区 | 国产小视频国产精品 | 久久久毛片 | 欧美日韩免费看 | 中国一级片免费看 | av福利在线看 | 天天综合网天天综合色 | 天天操导航 | 91精品国产综合久久婷婷香蕉 | 久久欧美在线电影 | 最新日韩在线观看视频 | 2019中文字幕第一页 | 国产精品嫩草55av | 日韩在线大片 | 在线视频观看你懂的 | 中文字幕乱码亚洲精品一区 | 丁香婷婷电影 | 日韩久久电影 | 亚洲国产精品传媒在线观看 | 韩国av一区 | 狠狠狠的干| 成人国产一区 | 午夜精品福利在线 | 日韩精品一区二区三区免费视频观看 | 九色视频网址 | 欧美另类交人妖 | 五月婷香蕉久色在线看 | 在线不卡视频 | 色噜噜狠狠狠狠色综合久不 | 一区二区电影在线观看 | 依人成人综合网 | 欧美日韩国产在线一区 | 一区中文字幕电影 | 嫩草av在线 | 最近2019好看的中文字幕免费 | 久色免费视频 | 日本中文字幕在线一区 | 久久www免费视频 | 四虎永久精品在线 | 27xxoo无遮挡动态视频 | 91精品导航| 美女精品久久久 | 国产日韩精品一区二区三区 | 日韩一级成人av | 日韩网站在线 | 久久99精品国产 | 久久亚洲电影 | se婷婷| 特级黄色片免费看 | 精品久久久久久久久久久久久久久久久久 | 久久久久成人精品 | 亚洲视频aaa | 在线影院 国内精品 | 狠狠网亚洲精品 | 日日综合网 | 亚洲欧美日韩一区二区三区在线观看 | 91成年人网站 | 国产精品理论片在线播放 | 又污又黄网站 | 在线播放视频一区 | 麻豆94tv免费版 | 久久精品在线免费观看 | 国产一级视频在线免费观看 | 久久天天综合网 | 激情综合五月婷婷 | 香蕉视频国产在线 | 俺要去色综合狠狠 | 91中文在线观看 | 国产精品一区二区62 | 亚洲午夜久久久久久久久久久 | 亚洲综合五月 | 久久国产a| 97成人资源站 | 狠狠色伊人亚洲综合成人 | 成人在线免费看 | 国产一线二线三线在线观看 | 日韩美女高潮 | 久久伊人精品一区二区三区 | 婷婷电影在线观看 | 亚洲精品乱码久久久久久高潮 | 久久久久久久久久影视 | .国产精品成人自产拍在线观看6 | 久久精品99国产精品日本 | 国产精品99久久久久 | 九九久久久久久久久激情 | 久久一区国产 | 亚洲精品一区二区三区高潮 | 九月婷婷人人澡人人添人人爽 | 黄色三级视频片 | 成人黄色小说视频 | 日韩中文字幕国产精品 | 亚洲综合欧美精品电影 | 色播激情五月 | 久久久久中文 | 亚洲91精品在线观看 | 国产精品久久久久毛片大屁完整版 | 国产成人精品一区二区三区在线观看 | 欧美日韩在线播放 | 欧美专区亚洲专区 | 亚洲激情在线 | 日日干夜夜操视频 | 开心激情综合网 | 爱爱av网站 | 激情久久综合 | 九九热只有这里有精品 | 97免费 | 国产a级片免费观看 | 99精品视频免费在线观看 | 久久精品免费观看 | 国产精品mv在线观看 | 久久久久久久久免费视频 | 91色国产在线 | 婷婷色在线资源 | 免费视频一区二区 | 日韩精品播放 | 成人黄色av网站 | 久久视频在线免费观看 | 精品无人国产偷自产在线 | 国产精品中文字幕在线观看 | 四虎国产| 久热av在线 | 黄色高清视频在线观看 | 国产精品9999| 一区二区三区四区精品 | 亚洲香蕉在线观看 | 成人av免费在线播放 | 人人人爽 | 成人理论在线观看 | 草久久av| 麻豆影视网 | 国产一级在线看 | 激情电影影院 | 亚洲精品在线观看不卡 | 国产视频日韩视频欧美视频 | 91精品在线免费 | 久久影视中文字幕 | 天天射射天天 | 日韩久久久久久久久久 | 日韩三级免费观看 | 日韩免费电影 | 国产精品一区二区 91 | 日韩性片 | 亚洲香蕉在线观看 | 911在线| 久久精品国产99国产 | 黄色app网站在线观看 | 国产黄在线 | 在线午夜| 国产一区二区视频在线播放 | 日韩色视频在线观看 | 最近日本中文字幕a | 欧美日韩免费一区二区 | 国产69精品久久久久久 | japanesexxxxfreehd乱熟| 日日夜夜精品视频天天综合网 | 精品国产福利在线 | 国产一级电影 | 8x成人在线 | 天天操网 | 欧美性久久久 | 亚洲精品视频第一页 | www操操操| 久久乱码卡一卡2卡三卡四 五月婷婷久 | 日韩欧美视频在线 | 51久久成人国产精品麻豆 | 亚洲成人精品久久 | 亚洲婷婷免费 | 日韩精品国产一区 | 欧美日韩免费观看一区二区三区 | 麻豆免费在线播放 | 不卡的av在线播放 | 97免费视频在线播放 | 成人xxxx| 亚洲伊人婷婷 | 久久国产区| 久久综合九色 | 99热99热| 午夜12点| 国产真实精品久久二三区 | 日韩高清一二区 | av成人黄色| 国产精品k频道 | 久久久午夜精品理论片中文字幕 | 免费在线观看黄色网 | 欧美日韩精品综合 | 中文字幕欧美日韩va免费视频 | 九九免费视频 | 91精品成人 | 国产伦理久久精品久久久久_ | 成 人 黄 色视频免费播放 | 黄网站app在线观看免费视频 | 夜夜操天天干 | 亚洲h视频在线 | 91成人在线观看喷潮 | 国产成人精品网站 | 欧美一级在线观看视频 | 国产小视频你懂的 | 午夜精品久久一牛影视 | 五月婷婷电影网 | 国产在线永久 | 狠狠干综合网 | 欧美成人高清 | 97成人资源 | 在线观看福利网站 | 久久亚洲视频 | 国产玖玖在线 | 亚在线播放中文视频 | 国产福利精品一区二区 | 欧美精品国产精品 | 91九色在线视频观看 | 色开心 | 国产精品 美女 | 国产精品久久久久久五月尺 | 99久久久国产精品免费观看 | 性色av一区二区三区在线观看 | 久久久久久久久久久精 | 插插插色综合 | 日韩亚洲精品电影 | 美女福利视频网 | 国产不卡一二三区 | 国产一区视频在线播放 | 91成年人视频 | 国产精品一区二区电影 | 国产免费视频在线 | 中文字幕av一区二区三区四区 | 97精品一区 | 人人插人人做 | 四季av综合网站 | 欧美日韩不卡一区二区三区 | 欧美成人性战久久 | 激情影音先锋 | zzijzzij亚洲成熟少妇 | 精品视频免费看 | 中文字幕在线日 | 日本特黄一级 | 亚洲国产精品成人av | 激情久久综合 | 91久久国产综合精品女同国语 | 久久精品首页 | 国产在线理论片 | 久草在线视频资源 | 国产香蕉久久 | 亚州精品国产 | 色欧美成人精品a∨在线观看 | 国内精品久久久久影院男同志 | 福利视频区 | 国产精品麻豆欧美日韩ww | 在线韩国电影免费观影完整版 | 伊人午夜视频 | 国产成人在线一区 | 欧美日韩视频 | 欧美日韩在线视频观看 | 日韩在线观看的 | 五月精品| 欧美日韩一区二区三区视频 | 亚洲六月丁香色婷婷综合久久 | 视频在线观看入口黄最新永久免费国产 | 九九免费在线观看 | 玖玖爱免费视频 | 奇米影视四色8888 | 亚洲免费一级电影 | 中文av在线免费观看 | 国产不卡精品视频 | 97精品超碰一区二区三区 | 国产精品毛片一区二区在线看 | bbbb操bbbb| 999久久久免费视频 午夜国产在线观看 | 一区二区三区中文字幕在线观看 | 91麻豆精品国产91久久久更新时间 | 色播五月激情综合网 | 久久久久五月 | 精品国产一二三四区 | 日韩中文字幕a | 在线视频专区 | 九九久久精品 | 久久免费看av | 欧美韩日视频 | 国产精品久久久久久久久久久久冷 | 综合色在线观看 | 成人一区二区在线 | 亚洲黄色激情小说 | 亚洲精品综合在线观看 | 99热在线观看免费 | 亚洲国产中文字幕在线 | 免费进去里的视频 | 国产高清在线a视频大全 | 美女视频久久黄 | 激情视频一区二区三区 | 爱射综合 | 一区二区三区av在线 | 91精品视频在线看 | 欧美一性一交一乱 | 亚洲一二区精品 | 国产精品久久久999 国产91九色视频 | 在线播放国产一区二区三区 | 久久久 精品 | 久久国内精品99久久6app | 五月天婷婷综合 | 日韩理论在线播放 | 高清国产在线一区 | 最近中文字幕视频网 | 91麻豆精品国产自产在线游戏 | 国产精彩视频一区二区 | 久草视频免费在线观看 | 亚洲精品www久久久 www国产精品com | 免费a级观看| 久久99精品热在线观看 | 久久精品电影院 | 91视频高清完整版 | 日韩理论视频 | 久久成人亚洲欧美电影 | 亚洲黄色免费在线 | 久久综合一本 | 国产69精品久久99的直播节目 | av一级一片 | 成年人视频在线观看免费 | 久久免费一级片 | 欧美精品九九99久久 | 亚洲专区 国产精品 | 欧美色图88 | 久久视屏网| 免费在线激情电影 | 亚洲最快最全在线视频 | 五月婷婷激情六月 | 国产亚洲精品v | 激情综合网五月婷婷 | 天天插狠狠插 | 国产手机在线精品 | 亚a在线 | 国产精品欧美日韩在线观看 | 欧美日产在线观看 | 激情综合国产 | 天天干天天操天天搞 | 99免费视频 | 国产区在线视频 | 欧美日韩视频免费看 | 亚洲精品久 | av高清在线 | 欧美一区二区视频97 | 久久午夜电影网 | 欧美大片大全 | 免费看国产视频 | 中文在线字幕观看电影 | 亚洲mv大片欧洲mv大片免费 | 99久久精品日本一区二区免费 | 欧美 日韩 视频 | 国产日韩视频在线观看 | 国产精品成人av电影 | 777奇米四色 | 精品国产精品一区二区夜夜嗨 | 国产一二区视频 | 亚洲国产中文在线 | 亚洲精品中文在线 | 亚洲国产欧美一区二区三区丁香婷 | 四虎成人在线 | 99精品毛片| 91网站在线视频 | 97电影网站 | 手机av永久免费 | 国产精品video爽爽爽爽 | 国内精品久久久久影院优 | 欧美日韩国内在线 | 亚洲黄色区 | 97在线视频网站 | 国产精品美女毛片真酒店 | 中文在线免费视频 | 国产人免费人成免费视频 | 婷婷天天色 | h视频在线看 | 国产精品久久久一区二区三区网站 | 在线免费黄色片 | 国产午夜一级毛片 | 91av视频| 天天狠狠干 | av电影免费在线看 | 在线免费视频你懂的 | 伊人伊成久久人综合网站 | 国产一级片网站 | 中文字幕你懂的 | 免费在线观看亚洲视频 | 亚洲精品动漫成人3d无尽在线 | 天天艹天天爽 | 久久久精品久久日韩一区综合 | 欧美aa一级| 91成人在线看 | 欧美成人h版在线观看 | 色窝资源| 日韩欧美视频在线免费观看 | 天天干天天操天天 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久爱综合 | 日韩av一区二区三区在线观看 | www一起操 | 97精品视频在线 | 91高清在线 | 91九色国产视频 | 亚洲精品美女久久久久 | 色狠狠综合天天综合综合 | 久久99久久99精品中文字幕 | 国产视频在线观看一区二区 | 国产视频一区二区在线 | 丁香花在线视频观看免费 | 玖玖精品视频 | 91视频久久 | 精品久久久久久综合 | 五月天色综合 | 亚洲春色成人 | 亚洲一级黄色av | 成人午夜电影免费在线观看 | 久久国产亚洲视频 | 色婷婷狠狠五月综合天色拍 | 中文字幕乱码日本亚洲一区二区 | 亚洲一级黄色片 | 久久精品免视看 | 日本最新高清不卡中文字幕 | 精品夜夜嗨av一区二区三区 | 中文字幕第一页在线播放 | 天干啦夜天干天干在线线 | 日本99精品| 操操操av | 国产在线观看污片 | 亚洲久草在线视频 | 日韩在线短视频 | 国产专区在线播放 | 天海翼一区二区三区免费 | 狠狠躁天天躁综合网 | 久草视频播放 | 四虎影视成人精品国库在线观看 | 色国产精品一区在线观看 | 国产黄a三级 | 久精品视频 | 国产日产精品久久久久快鸭 | av资源在线看 | 国产中文字幕在线免费观看 | 国产精品久久久毛片 | 91av视频免费观看 | 人人澡超碰碰 | av网站免费在线 | 久久艹影院 | 91精品国产综合久久福利不卡 | 国产精品久久电影网 | 久久久久久久久黄色 | 国产成人精品免费在线观看 | 久久精品国产一区 | 日韩精品aaa | 久久久久亚洲天堂 | 日日爽天天 | 久久黄色美女 | 不卡视频在线 | 狂野欧美激情性xxxx | 国产精品理论视频 | 97看片 | 一区二区三区四区在线免费观看 | www.伊人网 | www.久草.com| 91成人看片 | 91在线视频网址 | 一二区精品 | 日韩啪啪小视频 | 久久不射电影院 | 视频在线观看一区 | 国产成人av一区二区三区在线观看 | 99热国产在线| 九九热久久久 | 免费在线观看成人小视频 | av在线播放不卡 | 十八岁以下禁止观看的1000个网站 | 美女福利视频网 | 国产精品久久一区二区无卡 | 婷婷综合伊人 | 精品国产1区二区 | 免费无遮挡动漫网站 | 国产精品久久久久久av | 免费黄色a网站 | 久草成人在线 | 激情丁香综合五月 | 欧美日韩二区三区 | 中文字幕视频网站 | 久久久久久国产精品 | 在线看国产精品 | 国产精品一区二区美女视频免费看 | av黄色免费在线观看 |