2009-09-10 3 views
3

현재 서버에 대한 액세스가 제한되어 있지만 단일 디렉토리 구조 내에 포함 된 상당한 양의 파일을 업로드하고 다운로드해야하는 상황에 처해 있습니다. SSH 액세스가 없으므로 SCP를 사용할 수 없습니다. rsync는 불행히도 옵션이 아닙니다.FTP를 사용하여 원격 서버에 파일을 반복적으로 PUT합니다.

저는 현재 ncftpput을 사용하고 있습니다. 그러나 이것은 아주 빠르지 만 (빠른 연결 임에도 불구하고) 상당히 느립니다.

내가 볼 수있는 대안/더 나은 방법이 있습니까?

(이이 포함되어있는 경우 내 사과를 받아주십시오, 나는 이전에 게시에 빠른 검색을했지만 특별히 내 질문에 대답 아무것도 찾지 못했습니다) 나는 ncftpput에 익숙하지 않다

+2

- 사용중인 "put -R"명령을 사용하여 재귀 적 디렉토리 업로드를 할 수 있습니까? – DmitryK

+0

나는 정말로 - 문제의 일부는 FTP가 상당히 오래되었다고 생각합니다. 그래서 이상적인 솔루션이 아닐 수도 있습니다. – codeinthehole

답변

1

합니다. 비대화 형 FTP의 경우, 항상 Perl Net :: FTP 모듈을 사용했습니다. - http://perldoc.perl.org/Net/FTP.html

이렇게하면 로그인 할 수 있고 모든 전송을 한 번에 할 수 있기 때문에 더 빠릅니다. 각 파일 get/put에 대해 한 번 ncftpput을 실행하십시오.

결코 ASCII mangling을 사용하지 마십시오! 이것은 기본값이므로 다음을 사용하십시오.

$ftp->binary 

MySQL 자동 - 시간대 해석을 사용하면 ASCII 맹 글링이 같은 불로 죽을 필요가 있습니다.

2

, 나는 GNOME이나 KDE 파일 관리자, 또는 다른 CurlFtpFS를 사용을 통해 FTP 서버를 장착 추천 할 것입니다. 그런 다음 다른 폴더처럼 취급 할 수 있습니다. 난 항상이에 문제가 결국 때문에

+0

This 끔찍한 대답입니다. 이렇게하는 것이 FTP보다 빠를 수는 없으며 특히 많은 양의 데이터를 사용할 경우 인터럽트 재개를 지원하지 않으므로 훨씬 위험합니다. SSH에 액세스 할 수 없다면 어떻게 마운트를 위해 구성 할 것입니까? – Benubird

+0

서버 구성이 필요하지 않습니다. 서버는 이미 FTP 용으로 구성되어 있습니다. 요점은 일을 더 빨리 만드는 것이 아니라 더 쉽게 만드는 것입니다. CurlFtpFS로 마운트 한 후에는 cp 및 rsync와 같은 표준 유닉스 유틸리티를 사용할 수 있습니다. 나는 그것이 좋은 연결로 잘 작동한다고 말했습니다. –

0

, 나는 여기에 내 노트를 게시합니다 : 난 항상 혼란에 도착

한 가지 구문입니다; 아래에는 bash 테스터 스크립트가 있습니다.이 임시 스크립트는 임시 디렉토리를 만든 다음 임시 FTP 서버를 시작하고 lftpftpsync으로 rsync (일반 로컬 파일 모드에서 ftp를 지원하지 않음)을 비교합니다.

rsync /path/to/local /path/to/remote/을 사용하면 rsync가 local 하위 디렉토리 (remote)를 만들고 싶다고 자동으로 결정합니다. 그러나 lftp 또는 ftpsync의 경우 을 수동으로 지정하여 ... /path/to/local /path/to/remote/local과 같이 대상 디렉토리를 수동으로 지정하십시오 (존재하지 않는 경우 생성됩니다).

ftpserver-cli.pyHow do I temporarily run an FTP server? - Ask Ubuntu에 있습니다. ftpsync은 여기에 있습니다 : FTPsync (단, 버그가 있음을 유의하십시오; Search/grep ftp remote filenames - Unix & Linux Stack Exchange도 참조하십시오); 여기

다른 경우에 재귀 넣어 동작을 보여주는 puttest.sh 스크립트의 단축 출력입니다 :

$ bash puttest.sh 
Recreate directories; populate loctest, keep srvtest empty: 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 

*NOTE, rsync can automatically figure out parent dir: 
+ rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/ 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ rm -rf /tmp/srvtest/loctest 

Start a temporary ftp server: 
+ sudo bash -c 'python /path/to/pyftpdlib/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &' 
+ sleep 1 
Using: user: user pass: 12345 port: 21 dir: /tmp/srvtest 
[I 14-03-02 23:24:01] >>> starting FTP server on 127.0.0.1:21, pid=21549 <<< 
[I 14-03-02 23:24:01] poller: <class 'pyftpdlib.ioloop.Epoll'> 
[I 14-03-02 23:24:01] masquerade (NAT) address: None 
[I 14-03-02 23:24:01] passive ports: None 
[I 14-03-02 23:24:01] use sendfile(2): False 
test with lftp: 

*NOTE, lftp syncs *contents* of local dir (rsync-like syntax doesn't create target dir): 
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest/; exit' -u user,12345 127.0.0.1 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ rm -rf /tmp/srvtest/tempa1.txt 

*NOTE, specify lftp target dir explicitly (will be autocreated): 
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/loctest 

*NOTE, ftpsync syncs *contents* of local dir (rsync-like syntax doesn't create target dir); also info mode -i is buggy (it puts, although it shouldn't): 

*NOTE, ftpsync --ignoremask is for older unused code; use --exclude instead (but it is buggy; need to change in source) 
+ /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:[email protected]/ 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/tempa1.txt 

*NOTE, specify ftpsync target dir explicitly (will be autocreated): 
+ /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:[email protected]/loctest 
show dirs: 
+ tree --noreport -a /tmp/srvtest /tmp/loctest 
/tmp/srvtest 
└── loctest 
    └── tempa1.txt 
/tmp/loctest 
├── .git 
│   └── tempa2.txt 
└── tempa1.txt 
cleanup: 
+ sudo rm -rf /tmp/srvtest/loctest 
+ sudo pkill -f ftpserver-cli.py 

을 그리고, 여기에 puttest.sh 스크립트입니다

ncftp에 대한
#!/usr/bin/env bash 
set -x 

# change these to match your installations: 
FTPSRVCLIPATH="/path/to/pyftpdlib" 
FTPSYNCPATH="/path/to/ftpsync" 

{ echo "Recreate directories; populate loctest, keep srvtest empty:"; } 2>/dev/null 

sudo rm -rf /tmp/srvtest /tmp/loctest 

mkdir /tmp/srvtest 

mkdir -p /tmp/loctest/.git 
echo aaa > /tmp/loctest/tempa1.txt 
echo aaa > /tmp/loctest/.git/tempa2.txt 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo -e "\n*NOTE, rsync can automatically figure out parent dir:"; } 2>/dev/null 

rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/ 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
rm -rf /tmp/srvtest/* 

{ echo -e "\nStart a temporary ftp server:"; } 2>/dev/null 

# https://askubuntu.com/questions/17084/how-do-i-temporarily-run-an-ftp-server 

sudo bash -c "python $FTPSRVCLIPATH/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &" 
sleep 1 

{ echo "test with lftp:"; } 2>/dev/null 
# see http://russbrooks.com/2010/11/19/lftp-cheetsheet 
# The -R switch means "reverse mirror" which means "put" [upload]. 
{ echo -e "\n*NOTE, lftp syncs *contents* of local dir (rsync-like syntax doesn't create target dir):"; } 2>/dev/null 

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest/; exit' -u user,12345 127.0.0.1 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, specify lftp target dir explicitly (will be autocreated):"; } 2>/dev/null 

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, ftpsync syncs *contents* of local dir (rsync-like syntax doesn't create target dir); also info mode -i is buggy (it puts, although it shouldn't):"; } 2>/dev/null 
{ echo -e "\n*NOTE, ftpsync --ignoremask is for older unused code; use --exclude instead (but it is buggy; need to change ` 'exclude=s' => \$opt::exclude,` in source)"; } 2>/dev/null 

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:[email protected]/ 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 

{ echo -e "\n*NOTE, specify ftpsync target dir explicitly (will be autocreated):"; } 2>/dev/null 

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:[email protected]/loctest 

{ echo "show dirs:"; } 2>/dev/null 
tree --noreport -a /tmp/srvtest /tmp/loctest 

{ echo "cleanup:"; } 2>/dev/null 
sudo rm -rf /tmp/srvtest/* 


sudo pkill -f ftpserver-cli.py 

{ set +x; } 2>/dev/null