저는 여러 개의 Raspberry Pi가 센서 데이터를 수집하여 하루에 여러 번 여러 파일에 기록하는 프로젝트를 진행하고 있습니다. 나는 하루가 끝나면 crontab을 사용하여 모든 파일을 FTP 서버에 업로드하는 작은 스크립트를 작성하고 싶었습니다. 그래서 처음에는 작동했지만 나중에 오류가 표시되기 시작한 lftp를 사용하여 스크립트를 작성했습니다.
아래는 스크립트와 자세한 출력입니다. 어떻게 해결할 수 있나요?
#!/bin/bash
HOST='ftp://xyz.com'
USER='xxxxxx'
PASS='xxxxxx'
TARGETFOLDER='/home/xxxx'
SOURCEFOLDER='/home/pi/yyyy'
lftp -f "
open $HOST
user $USER $PASS
debug -o lftp_debug.txt
lcd $SOURCEFOLDER
mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER
bye
"
산출:
---- Connecting to xyz.com (xx.xx.xx.xx) port 21
<--- 220 (vsFTPd 3.0.3)
---> FEAT
<--- 211-Features:
<--- EPRT
<--- EPSV
<--- MDTM
<--- PASV
<--- REST STREAM
<--- SIZE
<--- TVFS
<--- 211 End
---> USER XXXX
<--- 331 Please specify the password.
---> PASS XXXX
<--- 230 Login successful.
---> PWD
<--- 257 "/home/XXXX" is the current directory
---> MKD /home
<--- 550 Create directory operation failed.
---> MKD /home/XXXX
<--- 550 Create directory operation failed.
---- CWD path to be sent is `/home/XXXX'
---> CWD /home/XXXX
<--- 250 Directory successfully changed.
---> PASV
**** control-socket: Connection reset by peer
---- Closing data socket
---- Closing control socket
##업데이트 2##
재미있는 점은 동일한 사용자로 'FTP' 명령을 통해 동일한 FTP 서버에 로그인하고 전달하면 매력처럼 작동하지만 동일한 사용자로 로그인하고 lftp
전달하면 서버에 로그인할 수 있었지만 곧 명령을 내리면 ls
다음 출력이 표시됩니다.
lftp [email protected]:~> ls
`ls' at 0 [Delaying before reconnect: 24]
##업데이트 3##
대신 SFTP를 사용해 보았는데 제대로 작동했습니다. 이것이 누군가의 시간을 절약해주기를 바랍니다.
답변1
FTP를 사용하지 마십시오. 귀하가 겪고 있는 문제는 FTP의 연결 방향에 대한 일반적인 혼란과 관련이 있을 수 있습니다. FTP는 명령 연결과 데이터 연결이라는 두 개의 포트를 사용합니다. 전통적으로 명령 연결은 클라이언트에서 서버로, 데이터 연결은 서버에서 클라이언트로 이루어졌습니다!
PASV는 그 반대입니다. 이는 서버에게 클라이언트의 데이터 연결을 수신하도록 지시하고 클라이언트에게 포트 번호를 알려줍니다. 이러한 (많은 사람들이 예상하지 못한) 행동이 당신을 괴롭히는 것 같습니다.
그러나 제 생각에는 FTP를 계속 사용하는 것은 오늘날 좋은 대안이 아닙니다. 단순히 구식이고 보안이 현명하며 프로토콜이 현명합니다.
FTP에 대한 몇 가지 대안이 있습니다. 인증을 사용하는 경우 scp/sftp가 좋은 대안입니다. 정확히 하나의 포트가 필요하며 인증 및 암호화됩니다.
익명 제출이 필요한 경우 http(s)가 좋은 대안입니다. POST 요청을 통해 또는 WebDAV를 통해. HTTP 수또한인증을 사용하도록 설정되어 있으며 TLS(https)로 암호화될 수 있습니다. 또한 데이터와 명령 모두에 대해 단일 채널만 열립니다.
FTP는 40년 된 프로토콜입니다. 더 이상 사용되지 않고 있으며 결과적으로 소프트웨어는 널리 사용되는 웹 서버 및 SSH 서버만큼 많은 관심을 받지 못하므로 소스 코드에 심각한 취약점이 남아 있을 가능성이 더 높습니다.
또한 SCP'ing 명령은 훨씬 더 간단합니다. scp * $user@$host:$targetfolder
- 키 기반 인증을 사용하여 스크립트에서 비밀번호를 피할 수 있습니다!