주요 콘텐츠로 건너뛰기
마지막 블로그에서 FTP를 사용하여 파일 전송 자동화에 대해 이야기했습니다. FTP 사용에는 세 가지 문제가 있습니다. 첫째, 비밀번호는 명확한 텍스트로 네트워크를 통해 전송되므로 프로토콜 분석기를 사용하는 모든 사용자가 암호를 사용할 수 있습니다. 둘째, 데이터는 명확한 텍스트로 전송됩니다. 셋째, 매크로 또는 .netrc 파일에 있는 모듈 의 어딘가에 암호를 기록해야 합니다. 이러한 문제로 인해 많은 사이트가 SSH의 보안 FTP 하위 시스템인 SFTP를 FTP 대신 사용할 것을 의무화하거나 의무화할 생각입니다. 그러나 FTp를 명령 매크로(그림 1)의 Sftp로 대체할 수 없으며 작동할 것으로 예상할 수 없습니다(그림 2).

 

&attach_input
sftp 172.16.1.116
nd
MYPASSWORD
put foo
&if (command_status) ^= 226 &then &goto ERROR1
get bar
&if (command_status) ^= 226 &then &goto ERROR2
quit
&
&label ERROR1
..display_line Could not put file
quit
&return
&
&label ERROR2
..display_line Could not get file
quit
&return

그림 1 – sftp1.cm - ftp 명령을 명령 매크로의 sftp로 대체

 

sftp1
Connecting to 172.16.1.116...
dup2: Bad file number.
Error on line 3 of sftp1.
command_processor: Object not found. nd. In command macro
%phx_vos#m15_mas>SysAdmin>Noah_Davids>sftp1.cm
ready  12:39:59

 

그림 2 – 실행 sftp1.cm
문제는 네이티브 VOS명령과 POSIX 오픈 소스가 입력을 처리하는 방식 간의 비호환성입니다. 그러나 FtP와 같은 SFTP를 사용하면 자동으로 실행되는 요청 목록(그림 3)이 있는 파일을 만들 수 있습니다(그림 4).

 


put foo
get bar

 

그림 3 – sftp2.input – Sftp 실행 요청이 포함된 파일

 


sftp -b sftp2_input nd@172.16.1.116
nd@172.16.1.116's password:
sftp> put foo
Uploading foo to /SysAdmin/Noah_Davids/foo
sftp> get bar
Couldn't stat remote file: No such file or directory
File "/SysAdmin/Noah_Davids/bar" not found.
Ready  13:06:45

 

그림 4 – 요청 입력 파일 및 암호 프롬프트가 있는 실행
그림 4에서 sftp가 암호를 묻는 메시지가 표시됩니다. 입력 파일에 암호를 넣을 수 있는 방법은 없습니다. 암호 프롬프트를 우회하는 유일한 방법은 공개 키 인증을 사용하는 것입니다(그림 5).

 

sftp -b sftp2_input nd@172.16.1.116
sftp> put foo
Uploading foo to /SysAdmin/Noah_Davids/foo
sftp> get bar
Couldn't stat remote file: No such file or directory
File "/SysAdmin/Noah_Davids/bar" not found.
Ready  13:12:28

 

그림 5 – 공개 키 인증을 사용하여 암호 프롬프트를 제거하려면 요청 입력 파일이 있는 실행

 

여기에서 공개 키 인증을 설정하는 방법에 대한 문서를 찾을 수 있습니다http://members.cox.net/ndav1/self_published/publickey_authentication_setup.html

안타깝게도 Sftp는 입력 파일의 모든 요청을 차례로 실행하며 전송이 작동하는지 여부에 대한 테스트 메커니즘이 없습니다.

명령 매크로를 사용할 수 없기 때문에 대안이 있습니까? gnu_tools 제품은 기대라는 프로그램과 함께 제공됩니다. 명령을 보내고, 여러 가지 응답을 기다리며, 출력 스트림에서 보는 내용에 따라 무언가를 수행하는 데 사용할 수 있습니다. 나는 전문가를 기대하지 않지만 그림 6의 스크립트는 당신이 시작하는 데 도움이 될 것입니다. 웹에서 "스크립트 기대"를 검색하면 간단한 예제를 사용자 지정하는 데 도움이 되는 많은 참조를 찾을 수 있습니다.

 

# If we get an end-of-file (eof) it means that the sftp process
# terminated. Report the last command that was sent.
#
proc goteof {cmd} {
puts "sftp connection unexpectedly closed n"
puts "last text received wasn"
puts "<<"
puts $cmd
puts ">>nnn"
exit
}
# 이 절차는 키 문자열을 찾는 정규 식 일치를 수행합니다.
# 실행된 명령에서 수집된 출력입니다. 이 경우
# 난 그냥 오류의 유형을보고하지만 다른 일을 할 수 있습니다
#뿐만 아니라. 나는 또한 2 개의 오류만 확인합니다. 다른 사람들이 있습니다. 당신은
# 당신이 그들을 찾을 때 그들을 추가합니다.
#
프로크 검사 오류 {buf cmd} {
[regexp {.*찾을 수 없는} $buf] {
"$cmd 실패 : 미인"
반환 1
}
[regexp {.*권한 거부} $buf] {
"$cmd 실패 : 액세스 문제 nnn"을 넣습니다.
반환 1
}
반환 0
}#시간 시간을 -1로 설정하여 시간 제전에 대한 시간이 없습니다. 기본값은 10초입니다.
# 대부분의 파일 전송은 그보다 더 오래 걸린다. 나는 아니오를 설정하기로 결정
# 시간 시간, 당신은 그것을 변경할 수 있습니다.
설정 시간 -1

# 시작 sftp
스폰 sftp nd@172.16.1.116

# Sftp 프롬프트를 기다리지만 인증 프롬프트가 발생하면
# 예/ 아니요 보안 문제를 보고하고 종료합니다.
예상 {
"네/아니오?" { 풋
"nnnWe가 잘못된 서버에 연결했거나 서버가 다시 로드되었습니다."
박 았
"이 스크립트를 다시 실행하려면 먼저 서버 키의 유효성을 검사해야 합니다."
종료 }
sftp>
}

# 테스트를 위한 간결한 디렉터리 변경
"cd sftp_testr" 보내기
예상 {
eof { 고테of "cd sftp_test" }
sftp>
}

# 모든 수집 된 문자를 전달 하는 오류에 대 한 호출 확인
# sftp> 프롬프트. 또한 sftp에 전송 된 명령입니다.
# 검사 오류 절차는 스크립트를 종료 1 을 반환합니다. 다시 말하지만, 당신은 할 수 있습니다
# 다른 일을.
{[체크포어 $expect_out(버퍼) "cd sftp_test"] == 1} {종료}

"푸를 넣어" 보내기
예상 {
eof { goteof "푸 넣어"}
sftp>
}
{[검사 오류 $expect_out(버퍼) "foo 넣기"] == 1} {종료}

"바 받기" 보내기
예상 {
eof { goteof "바 받기" }
sftp>
}
{[검사 오류 $expect_out(버퍼) "바"] == 1} {종료}

"종료자"를 보내십시오.
eof를 기대
"스크립트 도넨"을 넣습니다.

 

그림 6 – sftp3.exp – 스크립트가 SFTP를 자동화할 것으로 예상

 

expect sftp3.exp
spawn sftp nd@172.16.1.116
Connecting to 172.16.1.116...
The authenticity of host 172.16.1.116(172.16.1.116)' can't be established
+.
RSA key fingerprint is 37:f4:1a:56:64:af:ab:8a:7c:0b:36:47:c5:6c:1d:1a.
Are you sure you want to continue connecting (yes/no)?
잘못된 서버에 연결했거나 서버가 다시 로드되었습니다.
이 스크립트를 다시 실행하려면 서버 키의 유효성을 검사해야 합니다.준비 된 10:41:10

 

그림 7 – sftp3.exp의 실행은 보안 경고와 스크립트를 기대

 

expect sftp3.exp
spawn sftp nd@172.16.1.116
Connecting to 172.16.1.116...
sftp> cd sftp_test
sftp> put foo
Uploading foo to /SysAdmin/Noah_Davids/sftp_test/foo
sftp> 바 받기
원격 파일을 통계할 수 없음: 그러한 파일이나 디렉토리없음
파일 "/SysAdmin/Noah_Davids/sftp_test/bar"를 찾을 수 없습니다.
sftp> 바 실패를 얻을 : 찾을 준비가 되지 않은 10:42:11

 

그림 8 – sftp3.exp의 실행경고없이 스크립트를 기대하지만 실패 전송을 wiuth

마지막으로 FTP 블로그에서 FTP가 여전히 열려있는 파일을 읽을 수 있었고 경우에 따라 불완전한 파일이 전송되는 것을 언급했으며 FTP 매크로가 파일에 표시될 때까지 기다렸다가 파일을 전송하는 경우 매크로가 더 이상 잠겨 있지 않은지 확인해야한다고 제안했습니다. SFTP에서도 동일한 문제가 발생할 수 있으며 솔루션은 동일합니다. 파일 잠금 체크를 명령 매크로(그림 9)에 배치한 다음 파일이 더 이상 잠긴 경우 적절한 스크립트로 예상되는 호출을 기대할 수 있습니다.

&label AGAIN
&if (exists new_file) = 1 & (locked new_file) = 0 &then &goto EXPECT
display_line new_file not ready for transfer as of (time)
sleep -seconds 15
&goto AGAIN
&
&
&label EXPECT
expect sftp3.exp

 

그림 9 – 호출 하기 전에 파일 잠금에 대 한 매크로 테스트를 명령