성공 후 연결을 올바르게 종료하지 못하는 FTP 서버에 파일을 보내는 방법은 무엇입니까?

성공 후 연결을 올바르게 종료하지 못하는 FTP 서버에 파일을 보내는 방법은 무엇입니까?

(SO에서 이동)

내 목표는 임베디드 장치의 FTP 서버에 파일을 업로드하는 것입니다. 이 파일은 구성 파일입니다. 파일이 승인되면 서버가 다시 시작됩니다. 이 문제는 내장된 장치가 소켓을 열어두거나 FTP 연결을 적절하게 종료하지 못하기 때문에 발생합니다.

서버는 "수락됨"을 의미하는 응답 코드 150으로 응답합니다. 그런 다음 다시 시작되지만 소켓은 열린 상태로 유지됩니다.

나는 해결책을 찾고 있습니다. 한 가지 해결책은 FTP 클라이언트를 C로 수동으로 작성하는 것이고, 또 다른 해결책은 Bash 스크립트를 통해 UNIX에 내장된 FTP 클라이언트를 사용하는 것입니다. 아래 댓글에서 누군가가 컬이나 wget/wput 사용을 제안했습니다.

첫 시도

첫 번째 시도에서는 C로 FTP 클라이언트를 작성하는 것을 고려했습니다. 사용할 수 있는 라이브러리가 있나요? 주위를 둘러보면 쓰레기 라이브러리가 많이 보이지만 좋은 라이브러리가 누락되었을 수도 있습니다.

두 번째 시도

또 다른 시도에서는 Bash 스크립트를 사용하여 FTP 클라이언트를 작동해 보았습니다.

다음 프로그램은 파일을 업로드한 후 중단됩니다.

#!/bin/bash
HOST=192.168.1.10
USER='blah'
PASSWD='blah'
FILE='file1.conf'

ftp -n -i -v $HOST << EOT
ascii
user $USER $PASSWD
put $FILE myconfig.conf
bye
EOT

이것이 말하는 내용입니다:

Connected to 192.168.1.10 (192.168.1.10).
220 FTP server ready.
530 access denied.
331 Password required.
230 User logged in.
local: somefile.txt remote: newname.txt
227 Entering Passive Mode (192,168,1,10,208,169)
150 ready to take file.
150 Accepting XML configuration file for upload.
818 bytes sent in 4.1e-05 secs (19951.22 Kbytes/sec)
<it hangs here>

Ctrl-Z를 누르면 종료됩니다. Ctrl-C 또는 Ctrl-X를 보내는 경우에는 그렇지 않습니다. Ctrl-Z를 누르면 하위 프로세스가 중단되므로 이를 jobs -p | xargs kill -9정리해야 합니다.

세 번째 시도

다음으로 다음 아이디어를 시도했습니다 curl.

$ curl -T file1.xml ftp://username:[email protected]/myfile.conf -v

응답은 다음과 같습니다.

*   Trying 192.168.1.10...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 192.168.1.10 (192.168.1.10) port 21 (#0)
< 220 FTP server ready.
> USER admin
< 331 Password required.
> PASS PASS
< 230 User logged in.
> PWD
< 257 "/" is current directory
* Entry path is '/'
> EPSV
* Connect data stream passively
* ftp_perform ends with SECONDARY: 0
< 500 command not supported.
* Failed EPSV attempt. Disabling EPSV
> PASV
< 227 Entering Passive Mode (192,168,1,10,96,232)
*   Trying 192.168.1.10...
* Connecting to 192.168.1.10 (192.168.1.10) port 24808
* Connected to 192.168.1.10 (192.168.1.10) port 21 (#0)
> TYPE I
< 200 command okay
> STOR myfile.conf
< 150 ready to take file.
} [583 bytes data]
* We are completely uploaded and fine
* Remembering we are in dir ""
< 150 Accepting XML configuration file for upload.
* server did not report OK, got 150
100   583    0     0  100   583      0   4827 --:--:-- --:--:-- --:--:--  4858
* Connection #0 to host 192.168.1.10 left intact
curl: (18) server did not report OK, got 150

이것이 조금 더 좋습니다. 컬을 죽일 때 클라이언트와 같은 것을 남기지 않습니다 ftp.

네 번째 시도

이번 시도에서는 wput. 놀랍게도 세그폴트를 받았습니다.

wput file1.conf ftp://username:[email protected]/myconfig.conf
--09:37:50-- `file1.conf'
    => ftp://admin:[email protected]:21/myconfig.conf
Connecting to 192.168.1.10:21... connected! 
Logging in as admin ... Logged in!
==> LIST ... done.
Segmentation fault (core dumped)

답변1

expect이 줄이 감지될 수 bytes sent있으며 이 시점에서 스크립트가 종료됩니다.

#!/usr/bin/env expect

set HOST 192.168.1.10
set USER blah
set PASSWD blah
set FILE file1.conf

spawn -noecho ftp -n -i -v $HOST
# TODO possibly some error checking or prompt detection here...
send "ascii\r"
send "user $USER $PASSWD\r"
send "put $FILE myconfig.conf\r"
send "bye\r"
set timeout 60
expect {
    # if paranoid confirm that the amount matches the size of file...
    -ex "bytes sent" { exit }
    timeout { exit 1 }
    eof { exit 1 }
}

관련 정보