최근에는 이러저러한 기본 업무가 많다 보니 프로젝트 하나에 붙박이 개발자로 들어가지 않고 

본의 아니게 소방수(?) 해결사(?) 역할을 주로 하게 되는데, 때로는 엉겁결에 이런 일도 하게 된다.


뭐냐 하면,

"윈도우 서버에서 리눅스 서버의 특정 디렉터리 전체를 가져와서 동기화해야 하는 일" 정도?


예전에는 이런 문제를 해결하기 위해 리눅스에 samba를 설치해서 SMB를 활성화한 다음, 

윈도우에서 파일 공유(네트워크 드라이브)로 리눅스 서버에 연결하는 방식으로 해결했었는데, 

최근에는 같은 회사의 동일 네트워크간 통신이라 할 지라도 보안이 중요한 이슈가 되어

그런 방식을 권장하지 않을 뿐만 아니라 못하게 차단하는 경우가 대부분이다.


그래서 어쩔 수 없이 SSH/SFTP와 같은 일반적인 보안 연결을 사용할 수밖에 없는데,

예전이었으면 이걸 또 어떻게 개발하나... 하면서 한숨부터 쉬었을 테지만

(약 16~7년쯤 전까지만 해도 RFC문서만 보고 FTP 프로토콜을 분석해서 직접 만들었었다... 헐...)


지금은 21세기다! 인터넷에 널린 게 참고자료고, 오픈소스다.

이런 종류의 문제를 직접 코딩으로 맨땅에 헤딩부터 하려고 하면 당연히 안된다.


그래서 찾아봤더니,

SSH/SFTP 파일 전송용으로 요즘 일반적으로 널리 사용되고 있는 오픈소스 프리웨어 도구인 

WinSCP가 세상에! 커맨드라인 명령까지 지원하는 것을 발견하게 되었다.


>> 참고: http://winscp.net


>> 참고: https://winscp.net/eng/docs/commandline#session


이거다 싶었다.


특이하게도, 이 도구는 .NET assembly까지 제공해 줘서 마음만 먹으면 C#으로도 쉽게 코딩이 가능하다.

대단한 물건이다.



시간적인 여유가 있으면 C#으로 이런 유형의 도구를 하나 개발해놓는 것도 괜찮다 싶었지만

일단 현재 용도는 매일 특정 시간에 반복적으로 실행되는 배치작업이면 족하고,

특정 디렉터리 전체를 가져와서 동기화 하면 되는 비교적 단순한 작업이라서

그냥 커맨드라인 명령으로 만들어 윈도우 작업 스케줄러에 거는 것으로 처리하기로 했다.



처음엔 파일을 업로드하는 것이 아니라 다운로드하는 것이므로

get 명령어에 -neweronly 스위치를 붙여서 변경된 파일만 가져오도록 만들어 쓸까 했는데,


>> 참고: https://winscp.net/eng/docs/scriptcommand_get



좀 더 보니 synchronize 명령어가 따로 있었다!

게다가 robocopy에서나 볼 수 있던 미러링 옵션(-mirror 스위치)까지 있었다. 말 그대로 한방에 해결!


>> 참고: https://winscp.net/eng/docs/scriptcommand_synchronize



WinSCP는 더 놀랍고도 편한 것이,

접속부터 FTP 명령어 실행, 종료에 이르기까지의 그 복잡(?)한 절차를 

간단한 클릭 몇 번으로 만들어 주는 엄청난 편리 기능까지 제공해 주고 있었다!


>> 참고: https://winscp.net/eng/docs/ui_generateurl



WinSCP... 자주, 많이 써봤지만 이런 기능이 있는 줄은 이번에 처음 알았다.

완전 날로 먹었다.



날로 먹은 스크립트 코드를 기록해 둔다.(특정 서버 프라이버시 정보는 삭제...^^;)


@echo off


"C:\Program Files (x86)\WinSCP\WinSCP.com" ^

  /log="D:\FileShare\HRProfile_test.log" /ini=nul ^

  /command ^

    "open sftp://userid:password@serverip/ -hostkey=""ssh-ed25519 256 gPbCK......=""" ^

    "synchronize local D:\FileShare\HRProfile_test /home/userid/pic -mirror" ^

    "exit"


set WINSCP_RESULT=%ERRORLEVEL%

if %WINSCP_RESULT% equ 0 (

  echo Success

) else (

  echo Error

)


exit /b %WINSCP_RESULT%






Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]