- 전체
- ServerSpecific
- Tips
- Apps (Freeware)
- Apps
- BulitIn
- News
- MyStories
- Apps (iPhone/iPod Touch)
- Report
- Hardware
[작성중] 홈서버 구성 가이드 - 5. FTP를 이용한 파일서버 - LukemFTPd / PureFTPd
2008.11.19 01:23
1. 홈서버 시스템의 선택
2. 네트워크 구성과 공유기 설정
3. MacOSX 인스톨
4. 웹서버를 시동해 보자 - MAMP ( MacOSX Apach + MySQL + PHP )
5. FTP를 이용한 파일서버 - LukemFTPd / PureFTPd
6. SSH를 이용한 원격 관리와 터널링
7. GUI 원격관리 VNC
8. Transmission을 이용한 Torrent 공유 ( + FTP 응용 )
9. Windows에서 네트워크 드라이브로 연결해 보자
10. VMware + WindowsXP ( for ActiveX Webhards )
5. FTP를 이용한 파일서버 - LukemFTPd / PureFTPd
[1] FTPd 소개
FTP 데몬으로는 기본적으로 MacOSX가 포함하고 있는 LukemFTPd와 OpenSource인 PureFTPd를 설치/구동하는 것을 살펴보겠습니다.
우선 각 FTPd를 살펴보면,
1) LukemFTPd
장점 >
MacOSX를 설치하면 기본적으로 포함이 되는 데몬으로 사용자가 다시 설치를 한다거나 하는 불편함 없이 설정창에서 클릭 몇번만에 설정/구동이 가능합니다.
단점 >
타인에게 공개되지 않는 개인을 위한, 혹은 소규모의 FTP를 운영하고자 하신다면 LukemFTPd로도 충분합니다만 위낙 기본적인 기능들만을 탑재하고 있으며 MacOSX의 사용자 환경에 완전히 의존하기 때문에 관리에 어려움이 있습니다. 또한 Windows 환경에서 접근 했을때 한글이 제대로 표시되지 않는 문제가 있습니다. (소스코드의 수정을 통해 해결은 가능합니다)
2) PureFTPd
장점 >
LukemFTPd에 비해 월등히 많은 기능을 지원하고 있으며 상용 FTPd에 비교하더라도 그 기능상으로 부족한 면은 거의 없을 정도의 고기능의 FTPd입니다.
단점 >
많은 기능을 가지고 있으나 그만큼 설정에 더 많은 노력이 필요합니다.
단순히 잠깐 동안의 파일 공유나 친분이 있는 사람들 간의 파일 공유에는 LukemFTPd를 사용하시는 것이 좋겠습니다. 다만 공개 FTPd를 열어보실 생각이시라면 절대 LukemFTPd를 사용하는 것은 피하시는 것이 좋을 것이라 생각됩니다. 제 경험상 LukemFTPd를 사용하는 경우 문제가 되는 점이 많습니다.
[2] LukemFTPd 구동
위에서 말씀드린대로 LukemFTPd는 MacOSX를 설치했다면 이미 설치가 되어 있습니다. 다만 활성화가 되어 있지 않기에 기능을 하지 않고 있을 뿐입니다. 그럼 어떻게 LukemFTPd를 구동하면 되는지 봅시다.
왼쪽 위의 사과마크를 눌러 System Preferences를 열어 봅시다.
그럼 다음과 같은 창이 새로 뜹니다. 여기서 Sharing을 클릭해 봅시다.
창이 바뀌면서 아래와 같은 화면이 나타납니다.
혹시 왼쪽 아래에 자물쇠가 채워져 있는 그림이 나타난다면 클릭하시면 암호를 물어보게 되는데 암호를 넣어서 잠금을 해제합니다.
FTPd는 파일공유와 관련이 있기 때문에 당연히 File Sharing 항목에 관련 내용이 있습니다. File Sharing 항목을 선택해 봅니다. 그럼 다음과 같은 화면이 보여집니다.
초기 설치에 따라서 위의 항목 중 일부가 채워져 있을 수 도 있습니다. 일단 무시하고 오른쪽 하단의 Options를 눌러봅시다. 그럼 원래 떠 있던 창 위로 다음과 같은 창이 새로 나타납니다.
AFP, FTP, SMB 이렇게 3가지 항목이 보이네요. 자 FTP 항목에 체크를 합니다. 그러면 친절하게도 접속 경로까지 표시를 해 줍니다.
자 선택을 다 하셨으면 Done을 눌러줍니다. 그럼 원래의 창이 다음처럼 표시가 됩니다.
왼쪽 Service 창에 File Sharing이 체크가 되고 오른쪽 창에는 FTP Access: On 메세지가 출력이 됩니다. Shared Folders와 Users항목이 위 스크린샷에는 비워져 있는데 이는 로그인한 계정에 적용되는 권한과 별도로 권한을 제약/부여하는 목적으로 사용되는것입니다. Unix/Linux의 권한관련 지식이 없으시다면 그냥 싹 다 지워버리는 것이 좋습니다.
자 이제 FTPd의 구동이 끝났습니다. FTP 접속이 가능하게 된 것이죠. 이거 뭐 가이드라고 하기에도 민망한 수준의 구동 난이도입니다.
그런데 이렇게 해 놓고 만세~ 하기에는 문제가 있습니다. 계정이 하나밖에 없기 때문에 다른사람에게 알려주기가 찜찜하죠. 거기다가 로컬 유저로서 사용하는 계정을 다른 사람에게 알려준다는 것은 보안상 상당한 위험이 있습니다. 따라서 이제 FTP 전용의 계정을 만들어 보겠습니다.
다시 System Preferences로 돌아갑니다. (왼쪽 상단의 Show All을 누르시면 됩니다) 그리고 Accounts를 클릭합니다.
역시 이 곳에서도 왼쪽 아래 자물쇠가 채워져 있다면 해제하셔야 합니다. 위의 스샷에서 이미 제가 몇개의 계정을 만들어 놓았기에 여러 계정이 보이는데 처음 설치하신 이후로 사용자를 추가한적이 없다면 좀 횡~ 한 화면이 보일껍니다. 뭐 그건 이 가이드에서 다룰 내용이 아니니 넘어가기로 하죠.
이제 FTP 전용의 계정을 만들어 볼 텐데 왜 그냥 계정을 만든다고 하지 않고 "FTP 전용" 계정을 만든다고 하는지 궁금해 하실 분이 계실지 모르겠습니다. (사실 궁금해 하시는 분이라면 이 가이드를 읽는건 시간낭비입니다.;;) 일반적인 계정을 생성하게 되면 뒤에서도 다루겠지만 SSH라던가 VNC와 같은 서비스로 접근이 가능하게 될 수 있습니다. 간략하게 요약하자면, 보안상의 이유로 FTP 전용의 계정을 만든다고 생각하시면 되겠습니다. 딴소리는 그만하고 만들어 봅시다.
왼쪽 아래부분에 + 버튼을 눌러줍니다.
뭐 대충 봐도 다 알만한 내용이죠. 그럼 다음과 같이 작성을 합니다.
가장 위 New Account에서 "Sharing Only"를 선택하는 것이 중요합니다. 다 작성을 하셨으면 Create Account를 눌러줍니다.
새로 만든 계정이 표시가 됩니다. 그럼 계정 생성은 완료가 되었습니다. 이렇게 새로만든 계정으로는 로컬 시스템의 로그인이 불가능합니다. 더더군다나 Home Directory가 접근 불가능한 경로로 되어 있기 때문에 FTP도 사용이 불가능합니다. 그럼 FTP 사용이 가능하도록 Home Directory를 설정해 줍시다. Ctrl을 누른 상태에서 생성한 계정을 클릭해 봅시다.
새로운 팝업 메뉴가 떴습니다. Advanced Options... 눌러줍시다.
새로운 창이 뜨고 뭐라뭐라 경고를 합니다. 그런데 뭐 Sharing Only 계정인데다가 아직 한 일도 없기 때문에 그냥 하나도 문제될 것 없는 말이니 무시하고, User ID와 Group ID가 있는데 자동으로 채워져 있는 것임으로 위의 스크린샷과 값이 다를 수 있습니다. 이것역시 그냥 둡니다.
이제 수정할 부분을 수정해야 합니다. 이 상태 그대로라면 로컬 로그인은 고사하고 아예 ftp 로그인도 불가능한 계정이니까요. 우선 Login Shell이 기본으로 "/usr/bin/false"로 되어 있습니다. 이것은 어떤 접근이던 무조건 잘못된 접근으로 간주하게 됨으로 ftp 접속이 불가능하게 하는 첫째 원인입니다. 그 다음 Home Directory 부분을 수정해야 하는데 기본으로 /dev/null로 되어 있습니다. null, 즉 아무것도 아닌 것에 home dir.이 설정되어 있음으로 ftp 접속을 불가능하게 하는 두번째 원인이 되겠습니다.
이제 login shell을 접근가능하게 수정을 해줍시다. sh, bash, csh등 기본적으로 선택이 가능하게 되어 있는 shell들은 SSH로 접근할 가능성을 열어주는 보안상 매우 위험한 선택임으로 다음과 같이 타이핑을 합니다. "/sbin/nologin" MacOSX가 기본적으로 포함하고 있는 sh script인데 간략히 설명하면 로그인하자 마자 볼일을 끝내는 멍텅구리 shell입니다. (자체로 아무런 기능을 수행할수 없기에 보안상 문제가 없고 종료하면서 정상값을 반환하기에 로그인은 됩니다.)
그리고 Home Dir.을 설정해 줍니다. Home Dir.은 해당 계정이 FTP 로그인을 했을 때 기본적으로 위치할 경로를 의미합니다. 수정을 하고 OK를 눌러줍니다.
자 이제 준비는 됐는데 MacOSX가 허용하는 Shell에 위에서 지정한 nologin이란 shell을 허용하지 않음으로 로그인이 안됩니다. 그럼 nologin shell을 허용하도록 수정을 해줍시다. 그런데 요게 시스템 파일을 손보는 것이라서 차근차근 따라하셔야 합니다.
일단 터미널을 열고, 차례대로 타이핑을 합니다.
sudo -s
[암호입력]
echo /sbin/nologin >> /etc/shells
특히 주의하셔야 할 것이 맨 아래 줄 ">>" 입니다. 하나를 쓰게 된다면 시스템이 망가지게 되니 반드시 두개를 쓰셔야 합니다. pico나 nano, vi등을 이용하실 줄 아신다면 마지막줄에 "/sbin/nologin"을 넣어주시면 됩니다. cat /etc/shells 로 내용을 확인해 봅니다.
잘 모르시겠다면 아래 스크린샷을 참고하셔서 천천히 해 보세요.
자 이제 새로만든 계정의 FTP 로그인의 준비가 끝났습니다. 그럼 FTP 접속을 해 봅시다.
OpenSource이면서 강력한 Filezilla를 이용해서 연결을 해 봤습니다. localhost의 의미는 스스로를 지칭합니다.
눈치채신 분도 계시겠지만 엄청난 문제가 발생했습니다. FTP만 열어주려고 만든 계정인데 이 계정으로 MacOSX 시스템 온 동내를 다 돌아다닐 수 있습니다. 보안상 문제가 안될 수 없습니다. 공개할 계정은 이렇게 싸돌아 다니지 못하게 해야겠죠. 그럼 이제 계정의 발목을 묶어두는 작업을 해 봅시다.
또 위험하지만 시스템 파일을 좀 건드려야 합니다. 이번 것은 아까것 만큼 위험하진 않으니 조금 마음을 놓으셔도 됩니다. 터미널을 다시 여시고 다음을 차례대로 타이핑 합니다. (이것도 만약을 위해서 반드시 ">>"인 것을 확인하시고 enter를 누르세요.)
sudo -s
[암호입력]
echo test >> /etc/ftpchroot --- ( test는 새로 만든 계정 이름입니다 )
자 이것도 스크린샷으로 봅시다.
cat /etc/ftpchroot는 제대로 작성이 됐는지를 확인하는 부분이니 무시하셔도 됩니다.
자 이제 다시 Filezilla로 로그인을 해 봅시다.
앞의 로그인 화면과는 확실히 다른 것이 보이죠? 해당 계정의 Home Dir.에 묶여서 상위의 경로로 사용자가 이동할 수 없게 되었습니다.
추가작성할 내용:
LukemFTPd
- 한글(EUC-KR)사용
한글사용
소스코드 구하기
http://www.opensource.apple.com/darwinsource/
10.5.0 ~ 10.5.5 -> lukemftpd-33
http://www.opensource.apple.com/darwinsource/10.5.5/lukemftpd-33/tnftpd-20061217.tar.gz
압축을 푼다. 가능한한 작업은 MacOSX에서.
소스코드를 수정한다. 아래 DIFF 참조
diff -ruP lukemftpd-33/tnftpd/ls/print.c lukemftpd-33e.nocomments/tnftpd/ls/print.c
--- lukemftpd-33/tnftpd/ls/print.c 2003-12-15 21:18:43.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/ls/print.c 2008-04-09 01:37:09.000000000 +0900
@@ -65,6 +65,9 @@
#include "ls.h"
#include "extern.h"
+#include "enc.h"
+// ==================
+
extern int termwidth;
static int printaname(FTSENT *, int, int);
@@ -134,9 +137,11 @@
else
printtime(sp->st_mtime);
if (f_nonprint)
- (void)printescaped(p->fts_name);
+ //(void)printescaped(p->fts_name);
+ (void)printescaped(enc_convtoext(p->fts_name));
else
- (void)printf("%s", p->fts_name);
+ //(void)printf("%s", p->fts_name);
+ (void)printf("%s", enc_convtoext(p->fts_name));
if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
(void)printtype(sp->st_mode);
@@ -300,9 +305,11 @@
chcnt += printf(ULLFP("*") " ", sizefield,
(ULLT)howmany(sp->st_blocks, blocksize));
if (f_nonprint)
- chcnt += printescaped(p->fts_name);
+ //chcnt += printescaped(p->fts_name);
+ chcnt += printescaped(enc_convtoext(p->fts_name));
else
- chcnt += printf("%s", p->fts_name);
+ //chcnt += printf("%s", p->fts_name);
+ chcnt += printf("%s", enc_convtoext(p->fts_name));
if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
chcnt += printtype(sp->st_mode);
return (chcnt);
@@ -380,7 +387,9 @@
path[lnklen] = ' ';
(void)printf(" -> ");
if (f_nonprint)
- printescaped(path);
+ //printescaped(path);
+ printescaped(enc_convtoext(path));
else
- (void)printf("%s", path);
+ //(void)printf("%s", path);
+ (void)printf("%s", enc_convtoext(path));
}
diff -ruP lukemftpd-33/tnftpd/src/Makefile.in lukemftpd-33e.nocomments/tnftpd/src/Makefile.in
--- lukemftpd-33/tnftpd/src/Makefile.in 2007-07-12 06:25:39.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/Makefile.in 2008-04-09 01:37:05.000000000 +0900
@@ -17,13 +17,15 @@
CC = @CC@
CFLAGS = -I${srcdir} -I${srcdir}/.. -I. -I.. @INCLUDES@ -DHAVE_TNFTPD_H=1 @CFLAGS@ -D_DEFAULT_CONFDIR="${sysconfdir}"
-LIBS = @LIBS@ -lpam
+#LIBS = @LIBS@ -lpam
+LIBS = @LIBS@ -lpam -liconv
LDFLAGS = @LDFLAGS@
INSTALL = @INSTALL@
PROG = tnftpd
-OBJS = cmds.o conf.o ftpd.o ftpcmd.o popen.o @LSOBJS@
+#OBJS = cmds.o conf.o ftpd.o ftpcmd.o popen.o @LSOBJS@
+OBJS = cmds.o conf.o enc.o ftpd.o ftpcmd.o popen.o @LSOBJS@
# removed: logutmp.o logwtmp.o
all: ${PROG}
diff -ruP lukemftpd-33/tnftpd/src/cmds.c lukemftpd-33e.nocomments/tnftpd/src/cmds.c
--- lukemftpd-33/tnftpd/src/cmds.c 2006-09-26 15:38:38.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/cmds.c 2008-04-09 01:37:05.000000000 +0900
@@ -314,7 +314,8 @@
perror_reply(550, path);
return;
}
- reply(-250, "MLST %s", path);
+ //reply(-250, "MLST %s", path);
+ reply(-250, "MLST %s", enc_convtoext(path));
memset(&f, 0, sizeof(f));
f.path = path;
f.display = path;
@@ -469,7 +470,8 @@
{
struct stat stbuf;
if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
- reply(550, "%s: not a plain file.", filename);
+ //reply(550, "%s: not a plain file.", filename);
+ reply(550, "%s: not a plain file.", enc_convtoext(filename));
else
reply(213, ULLF, (ULLT)stbuf.st_size);
break;
@@ -486,12 +488,14 @@
return;
}
if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
- reply(550, "%s: not a plain file.", filename);
+ //reply(550, "%s: not a plain file.", filename);
+ reply(550, "%s: not a plain file.", enc_convtoext(filename));
(void) fclose(fin);
return;
}
if (stbuf.st_size > 10240) {
- reply(550, "%s: file too large for SIZE.", filename);
+ //reply(550, "%s: file too large for SIZE.", filename);
+ reply(550, "%s: file too large for SIZE.", enc_convtoext(filename));
(void) fclose(fin);
return;
}
@@ -522,7 +526,8 @@
argv[2] = (char *)filename;
fin = ftpd_popen(argv, "r", STDOUT_FILENO);
- reply(-211, "status of %s:", filename);
+ //reply(-211, "status of %s:", filename);
+ reply(-211, "status of %s:", enc_convtoext(filename));
/* XXX: use fgetln() or fparseln() here? */
atstart = 1;
while ((c = getc(fin)) != EOF) {
@@ -852,7 +857,8 @@
}
}
*p = ' ';
- reply(257, ""%s" %s", npath, message);
+ //reply(257, ""%s" %s", npath, message);
+ reply(257, ""%s" %s", enc_convtoext(npath), message);
}
static void
diff -ruP lukemftpd-33/tnftpd/src/enc.c lukemftpd-33e.nocomments/tnftpd/src/enc.c
--- lukemftpd-33/tnftpd/src/enc.c 1970-01-01 09:00:00.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/enc.c 2008-04-09 01:37:05.000000000 +0900
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <syslog.h>
+#include <sys/param.h>
+#include <iconv.h>
+
+
+static char *external_code = NULL;
+static char *internal_code = "UTF8-MAC";
+
+static void convcode(const char *inbuf, char *outbuf, const char *fromcode, const char *tocode);
+
+
+void enc_setcode(char *code) {
+ if (code && strlen(code)) {
+ if (external_code)
+ free(external_code);
+
+ external_code = (char *)malloc(strlen(code) + 1);
+ strcpy(external_code, code);
+ }
+}
+
+char *enc_convtoext(char *bytes) {
+ if (external_code) {
+ static char buf[MAXPATHLEN + 1];
+ convcode(bytes, buf, internal_code, external_code);
+ return buf;
+ }
+ return bytes;
+}
+
+char *enc_convtoint(char *bytes) {
+ if (external_code) {
+ char *buf = (char *)malloc(MAXPATHLEN + 1);
+ convcode(bytes, buf, external_code, internal_code);
+ return buf;
+ }
+ return bytes;
+}
+
+void convcode(const char *inbuf, char *outbuf, const char *fromcode, const char *tocode) {
+ iconv_t cd;
+ size_t inbytesleft = strlen(inbuf);
+ size_t outbytesleft = MAXPATHLEN;
+
+ if (!inbuf || !fromcode || !tocode) {
+ *outbuf = 0;
+ return;
+ }
+
+ cd = iconv_open(tocode, fromcode);
+ if (cd == (iconv_t)-1) {
+ syslog(LOG_ERR, "iconv_open error: %m");
+ strlcpy(outbuf, inbuf, MAXPATHLEN + 1);
+ return;
+ }
+
+ while (inbytesleft) {
+ size_t size = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (size == (size_t)-1) {
+ syslog(LOG_ERR, "iconv error: %m");
+ break;
+ }
+ }
+
+ *outbuf = 0;
+
+ iconv_close(cd);
+}
+
diff -ruP lukemftpd-33/tnftpd/src/enc.h lukemftpd-33e.nocomments/tnftpd/src/enc.h
--- lukemftpd-33/tnftpd/src/enc.h 1970-01-01 09:00:00.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/enc.h 2008-04-09 01:37:05.000000000 +0900
@@ -0,0 +1,12 @@
+#ifndef _CONV_H
+#define _CONV_H
+
+
+void enc_setcode(char *code);
+
+char *enc_convtoext(char *bytes);
+char *enc_convtoint(char *bytes);
+
+
+#endif
+
diff -ruP lukemftpd-33/tnftpd/src/ftpcmd.y lukemftpd-33e.nocomments/tnftpd/src/ftpcmd.y
--- lukemftpd-33/tnftpd/src/ftpcmd.y 2006-09-26 15:38:38.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/ftpcmd.y 2008-04-09 01:37:05.000000000 +0900
@@ -117,6 +117,9 @@
#include "extern.h"
#include "version.h"
+#include "enc.h"
+// ==================
+
static int cmd_type;
static int cmd_form;
static int cmd_bytesz;
@@ -842,7 +845,8 @@
if (stat($4, &stbuf) < 0)
perror_reply(550, $4);
else if (!S_ISREG(stbuf.st_mode)) {
- reply(550, "%s: not a plain file.", $4);
+ //reply(550, "%s: not a plain file.", $4);
+ reply(550, "%s: not a plain file.", enc_convtoext($4));
} else {
struct tm *t;
@@ -1142,10 +1146,12 @@
strlcat(result, "/", len);
strlcat(result, path, len);
}
- $$ = result;
+ //$$ = result;
+ $$ = enc_convtoint(result);
free($1);
} else
- $$ = $1;
+ //$$ = $1;
+ $$ = enc_convtoint($1);
}
;
@@ -1349,7 +1355,8 @@
*p == ',' || *p == '.' || *p == '_')
continue;
insane_name:
- reply(553, "File name `%s' not allowed.", file);
+ //reply(553, "File name `%s' not allowed.", file);
+ reply(553, "File name `%s' not allowed.", enc_convtoext(file));
return (0);
}
}
diff -ruP lukemftpd-33/tnftpd/src/ftpd.c lukemftpd-33e.nocomments/tnftpd/src/ftpd.c
--- lukemftpd-33/tnftpd/src/ftpd.c 2007-07-12 06:25:40.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/src/ftpd.c 2008-04-09 01:37:05.000000000 +0900
@@ -352,7 +352,8 @@
openlog("ftpd", LOG_PID | LOG_NDELAY, FTPD_LOGTYPE);
while ((ch = getopt(argc, argv,
- "46a:c:C:Dde:h:HlL:P:qQrst:T:uUvV:wWX")) != -1) {
+ //"46a:c:C:Dde:h:HlL:P:qQrst:T:uUvV:wWX")) != -1) {
+ "46a:c:C:Dde:E:h:HlL:P:qQrst:T:uUvV:wWX")) != -1) {
switch (ch) {
case '4':
af = AF_INET;
@@ -392,6 +393,10 @@
case 'e':
emailaddr = optarg;
break;
+ case 'E':
+ enc_setcode(optarg);
+ break;
+ // ==================
case 'h':
strlcpy(hostname, optarg, sizeof(hostname));
@@ -1807,7 +1812,8 @@
if (argv == NULL
&& (fstat(fileno(fin), &st) < 0 || !S_ISREG(st.st_mode))) {
error = "Not a plain file";
- reply(550, "%s: %s.", dispname, error);
+ //reply(550, "%s: %s.", dispname, error);
+ reply(550, "%s: %s.", enc_convtoext(dispname), error);
goto done;
}
if (restart_point) {
@@ -1954,7 +1960,8 @@
if (receive_data(din, fout) == 0) {
if (unique)
reply(226, "Transfer complete (unique file name:%s).",
- name);
+ //name);
+ enc_convtoext(name));
else
reply(226, "Transfer complete.");
}
@@ -2083,12 +2090,14 @@
(char *)&keepalive, sizeof(int));
#endif
reply(150, "Opening %s mode data connection for '%s'%s.",
- type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf);
+ //type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf);
+ type == TYPE_A ? "ASCII" : "BINARY", enc_convtoext(name), sizebuf);
return (fdopen(pdata, fmode));
}
if (data >= 0) {
reply(125, "Using existing data connection for '%s'%s.",
- name, sizebuf);
+ //name, sizebuf);
+ enc_convtoext(name), sizebuf);
usedefault = 1;
return (fdopen(data, fmode));
}
@@ -2131,7 +2140,8 @@
return (NULL);
}
reply(150, "Opening %s mode data connection for '%s'%s.",
- type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf);
+ //type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf);
+ type == TYPE_A ? "ASCII" : "BINARY", enc_convtoext(name), sizebuf);
return (file);
}
@@ -3428,7 +3438,8 @@
int save_errno;
save_errno = errno;
- reply(code, "%s: %s.", string, strerror(errno));
+ //reply(code, "%s: %s.", string, strerror(errno));
+ reply(code, "%s: %s.", enc_convtoext(string), strerror(errno));
errno = save_errno;
}
@@ -3514,7 +3525,8 @@
goto cleanup_send_file_list;
transflag = 1;
}
- cprintf(dout, "%s%sn", dirname,
+ //cprintf(dout, "%s%sn", dirname,
+ cprintf(dout, "%s%sn", enc_convtoext(dirname),
type == TYPE_A ? "r" : "");
continue;
} else if (!S_ISDIR(st.st_mode))
@@ -3560,7 +3572,8 @@
p = nbuf;
if (nbuf[0] == '.' && nbuf[1] == '/')
p = &nbuf[2];
- cprintf(dout, "%s%sn", p,
+ //cprintf(dout, "%s%sn", p,
+ cprintf(dout, "%s%sn", enc_convtoext(p),
type == TYPE_A ? "r" : "");
}
}
diff -ruP lukemftpd-33/tnftpd/tnftpd.h lukemftpd-33e.nocomments/tnftpd/tnftpd.h
--- lukemftpd-33/tnftpd/tnftpd.h 2007-07-12 06:25:39.000000000 +0900
+++ lukemftpd-33e.nocomments/tnftpd/tnftpd.h 2008-04-09 01:37:34.000000000 +0900
@@ -1,6 +1,7 @@
/* $Id: tnftpd.h,v 1.21 2006/12/18 04:15:01 lukem Exp $ */
-#define FTPD_VERSION "tnftpd 20061217"
+//#define FTPD_VERSION "tnftpd 20061217"
+#define FTPD_VERSION "tnftpd 20061217 encoding-patch"
#include "config.h"
PureFTPd
- 다운로드 / 컴파일 (일부 옵션 설명)
- 설치, configuration file 세팅
- Virtual User 개념과 사용
- Connections/IP
- Quota (생략?)
- Function : upload script (간략히, Shell Script 기초 필요)
- ...