ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unix/Linux] scp / expect 이용한 파일 전송 스크립트
    case Computer : 2009. 9. 10. 19:02


     1. 개요
     여러 서버를 운영하면서 항상 유희 깊게 봐야갈게 각 파티션에 대한 용량이다.
     그렇지만 서버가 몇십대가 넘어간다면 미치도록 짜증날다.
     CS프로그램을 만들어 관리하면 좋겠지만.. 그렇만한 상황 혹은 기술이 없다면..
     리눅스에서 제공하는 편리한 프로그램들을 사용해야한다.
     내가 만든것은 A서버에서 B서버로 특정 파일을 보내는 것이다.

     파일을 보내는 방법에는 여러가지가 있다 FTP, SFTP, rsync, scp 등...
     FTP나 SFTP는 받는곳에 서버서 항상열려 있어야 한다.
     그리고 FTP는 보안에 취약하기때문에 더더욱 사용이 곤란하다. 포트를 변경하여 사용하면 되겠지만..
     또 rsync 역시 r계열에 명령어는 취약하기로 유명하기때문에 별로 추천하기 싫다.
     그렇기때문에 여기에서 사용할 명령어는 scp이다.


     2. SCP 명령어
     ssh환경에서 사용할수있는 원격파일 복사 명령어입니다.
     즉, ssh환경안에서 네트웍으로 통신이 가능한 원격지서버의 파일을 복사할수 있는 명령어입니다.
     rsync등과같이 원격백업을 위한 용도로도 사용됩니다.
     명령어 위치는 /usr/bin/scp 입니다.

     scp는 원하는 파일 전송을 위해서 ssh를 이용하고 ssh와같은 보안과 인증방식을 사용한다는점을 기억
     인증이 필요한경우에는 패스워드 또는 passphras의 입력을 요구합니다.
     원격파일 복사병령어들 통신데이터보호라는 관점에서 가장안전한방법입니다.


     기본 적인 사용법
     scp [from] [to]
     ex.1) A에서 /home/visu4l.txt를  /tmp/ 로 가져올 경우
          scp root@A:/home/visu4l.txt /tmp/
     ex.2) A에 /tmp/에  /home/visu4l.txt 를 넣을 경우
          scp /home/visu4l.txt root@A:/tmp


    3. EXPECT
     위에 scp를 설명할때 "인증이 필요한경우에는 패스워드 또는 passphras의 입력을 요구합니다" 라고 말했다.
     예를 들면 telnet 접속시에
     telnet 192.168.x.x
     user:
     password:
     이런식으로 유저 이름과 패스워드를 입력하라고 요구한다. 이것을 단순 쉘 스크립트로 만들기면 이름 혹은 패스워드
     입력부분에 내용을 쓸수가 없다.
     하지만 expect라는 명령을 사용하면 간단히 할 수 있다.

      [ expect 관련 링크 ]


     4. 예제
     아래에 예제는 scp를 이용하여 원격 host에 있는 $file을 현재 접속중인 서버에 $directory로 전송하는 스크립트이다.

    #!/usr/bin/expect -f

    set directory /root/tmp
    set file /tmp/test.txt
    set timeout 3600
    set passwd "PASSWORD"

    spawn -noecho scp root@host:/$file $directory

    expect {
        default {
            send_user "Fail\n";
            exit;
        }
        -nocase "Are you sure you want to continue connecting" {
            send "yes\n";
            expect {
                default {
                    send_user "Fail\n";
                    exit;
                }
                -nocase "password:" {
                    send "$passwd\n";
                }
            }
        }
        -nocase "password:" {
            send "$passwd\n";
            interact;
       }
    }


     

    반응형

    댓글

Designed by Tistory.