반응형

OS: Ubuntu 14.04 Desktop



scp 명령으로 IP주소를 알고 있는 원격 리눅스 머신에 파일을 전송할 수 있는데, 이 때 콘솔 창 마지막에 실시간으로 전송 현황이 갱신되어 출력된다. 보통은 지금 전송하고 있는 파일명, 전송률(%), 전송 속도(KB/s, MB/s 등), 남은 시간 등의 정보가 출력된다.


ping의 경우에는 RTT 측정 결과가 새로운 라인으로 찍히기 때문에 콘솔 화면에 이전의 기록을 모두 볼 수 있는 반면, scp는 그런 것 없이 마지막으로 갱신된 정보가 이전 라인에 계속 덮어써지는 구조라서 이전 기록을 확인할 수 없다.


scp를 통해 전송중인 정보를 ping과 유사하게 line-by-line으로 기록으로 남기기 위해서는 다른 도구와 조합해서 써야 하는데, script가 유용하다고 한다 [1]. Script는 콘솔 창에서 변화가 생기는 것(?? 적당한 표현을 찾지 못함...)을 모두 기록하는 도구이다.


인용한 StackOverflow에 달린 두 번째 답변에 의하면, 아래와 같이 할 수 있다:


$ script -c "아웃풋을 기록하고자 하는 명령어" [아웃풋을_저장할_파일]


예를 들어,

$ script -c "scp [sending_file_location] [receiving_host_and_location]" scplog.txt


맨 끝에 아웃풋을 저장할 파일을 지정하지 않으면, 

콘솔의 현재 위치에 typescript라는 파일을 자동으로 생성해서 저장한다.



123.yuv라는 20MB짜리 파일을 Remote host에 전달했을 때, 

예제로 생성된 로그파일(scplog.txt)은 아래와 같다:


Script started on 2016년 05월 13일 (금) 오전 03시 30분 26초


123.yuv                                         0%    0     0.0KB/s   --:-- ETA

123.yuv                                        34% 7072KB   6.9MB/s   00:01 ETA

123.yuv                                        59%   12MB   6.7MB/s   00:01 ETA

123.yuv                                        84%   17MB   6.6MB/s   00:00 ETA

123.yuv                                       100%   20MB   6.7MB/s   00:03    


Script done on 2016년 05월 13일 (금) 오전 03시 30분 30초



Script로 ping 명령을 테스트해 보면 그냥 콘솔에서 보는 것과 똑같이 찍힌다. 자세한 원리는 모르겠지만 실제로 변화가 생긴 라인을 기록하는 것 같은데, 여러 라인에 변화가 생기면 여러 라인이 동시에 기록되는지는 아직 모르겠다.


어쨌든 SCP도 그때그때 눈으로 보고 속도를 메모하던 안습한 짓을 하지 않아도 돼서 다행이다. (=_=)



<참고자료>

[1] How to best capture and log scp output? http://stackoverflow.com/questions/202432/how-to-best-capture-and-log-scp-output



반응형
블로그 이미지

Bryan_

,
반응형

OpenWRT version: 14.07 (Barrier Breaker)

Tested device: Buffalo WZR-600DHP

외부 머신: Ubuntu 12.04 (64-bit)


*목적: 인터넷에 접속할 수 있는 OpenWRT 라우터에서 특정 리눅스 머신에 SSH 또는 SCP를 사용할 때, 비밀번호 입력 절차 없이 자동으로 인증되도록 하고 싶다.


일반적으로 리눅스에서 쓰는 잘 알려진 방법을 활용하면 (openssh를 쓴다는 가정 하에):

1. OpenWRT 기기에서 ssh-keygen 도구를 이용하여 RSA key를 생성하고,

2. OpenWRT에는 private key 파일을 보관하고,

3. 접속할 원격 머신에는 public key 파일을 $HOME/.ssh/authorized_keys 파일에 추가한다.

(참고: OpenTutorials에 있는 egoing님의 글: SSH Key - 비밀번호 없이 로그인)


그런데 위와 같이 하고 아래와 같이 RSA key를 이용한 로그인을 시도하면 에러가 뜬다.

root@OpenWrt:~# ssh -i /root/.ssh/id_rsa [원격 머신 계정 아이디]@[원격 머신 주소]

ssh: Exited: String too long

root@OpenWrt:~# 


이 경우 일반적인 ssh-keygen 대신 dropbearkey를 활용해야 한다.

(참고: https://forum.openwrt.org/viewtopic.php?id=14148)


root@OpenWrt:~# dropbearkey -t rsa -f /root/.ssh/id_rsa

Generating key, this may take a while...

Public key portion is:

ssh-rsa AAAAB3NzaC1yc2EAAADAQAB...(중략) root@OpenWrt

Fingerprint: md5 7e:aa:9b:...(생략)


위의 화면에서 "ssh-rsa ..."로 시작하는 내용은 public key이므로 복사해서 따로 파일로 저장해 두자. (예: id_rsa.pub) dropbearkey에서는 ssh-keygen과는 달리 화면상에 출력만 하고 별도로 .pub 파일로 저장하지 않는다. 그리고 이 내용을 원격 머신의 $HOME/.ssh/authorized_keys 파일에 추가해야 한다.


참고로 dropbearkey를 생성하기 전에 이미 같은 위치에 id_rsa 파일이 있으면 덮어쓰기가 안되므로, 새로 만들 파일 이름을 다르게 하거나, 기존의 id_rsa 파일을 지우도록 하자. (어차피 OpenWRT 기기에서 쓸 수 없으니까 지워도 무방함. 정 필요하면 나중에 ssh-keygen으로 다시 만들면 된다.)


이제 dropbearkey로 새로 만든 private key를 사용해서 비밀번호 입력 없이 SSH, SCP에 접속할 수 있다.


root@OpenWrt:~# scp -i /root/.ssh/id_rsa [보낼 파일] [원격 머신 계정 아이디]@[원격 머신 주소]:[파일 받을 경로]



반응형
블로그 이미지

Bryan_

,
반응형


* 여러 파일을 포함하는 디렉토리 전체를 원격 컴퓨터에 전송하기

"-r" 옵션을 주면 디렉토리를 전송할 수 있다.

$ scp -r [디렉토리_이름] [원격지_아이디]@[원격지_주소]:[경로]


예제:

$ scp -r /home/usera/test/ cdsn@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 원격지 컴퓨터의 exp 디렉토리 안에 test 디렉토리가 복사된다.




* 원격 컴퓨터로부터 여러 파일을 포함하는 디렉토리 전체를 받기

$ scp -r [원격지_아이디]@[원격지_주소]:[보내는_디렉토리_경로] [경로]


예제:

$ scp -r remoteuser@192.168.2.8:/home/remoteuser/exp/ /home/usera/

이렇게 하면 로컬 컴퓨터의 usera 디렉토리 안에 exp 디렉토리가 복사된다.




* 여러 개의 파일을 원격 컴퓨터로 보내기

여러 개의 파일을 보낼 때는 그냥 띄어쓰기로 구분해서 파일 이름을 나열하면 모두 전송된다. 만약 공백이 있는 파일 여러개를 보내고 싶다면 파일 하나씩 쌍따옴표(")로 둘러싸면 된다.

$ scp [파일명1] [파일명2] [원격지_아이디]@[원격지_주소]:[받는_위치]


예제:

$ scp /home/usera/111.txt /home/usera/222.txt  remoteuser@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 원격지 컴퓨터의 exp 디렉토리 안에 111.txt와 222.txt가 복사된다.


$ scp "tcp 1111.txt" "tcp 9999.txt" remoteuser@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 띄어쓰기가 포함된 두 개의 파일(tcp 1111.txt, tcp 9999.txt)이 원격지 컴퓨터의 exp 디렉토리 안에 복사된다.




* 원격 컴퓨터에 있는 여러 개의 파일을 로컬 컴퓨터에 받기

하나의 원격지 컴퓨터에 있는 여러 개의 파일을 받을 때는 원격지 주소까지 쓰고 나서 콜론(:) 뒤에 쌍따옴표(")로 둘러싼 영역 안에 여러 개의 파일명을 써주면 된다. 만약 보내는 파일명이 공백을 포함하는 경우에는 그냥 따옴표(')로 해당 파일명을 둘러싸도록 한다.

$ scp [원격지_아이디]@[원격지_주소]:"[파일명1] [파일명2] [파일명3]" [받는 위치]


예제:

$ scp remoteuser@192.168.2.8:"/home/remoteuser/111.txt /home/remoteuser/222.txt" /home/usera/

이렇게 하면 원격지에 있는 111.txt, 222.txt 파일들이 usera 디렉토리 안에 복사된다.


$ scp remoteuser@192.168.2.8:"'/home/remoteuser/tcp 1111.txt' '/home/remoteuser/tcp 9999.txt'" /home/usera/

이렇게 일반 따옴표를 써서 공백이 있는 파일 두 개를 받을 수 있다.




* 아직 되는지 알 수 없는 부분

한 개의 파일을 받을 때 받는 쪽에서 파일이름을 바꿔서 지정할 수는 있지만, 여러 개의 파일을 받을 때 파일 이름을 각각 바꿀 수 있는 방법은 찾지 못했다. 즉, 명령어 한 줄로 여러 개의 파일을 보낼 수는 있지만, 받는 쪽에서 그 여러 개의 파일 이름을 고치고 싶은데 어떻게 해야할 지 아직 모르겠다.

아무래도 scp 명령을 통해서 일단 파일들을 모두 받은 이후에 mv 명령으로 수정하는 방법이 현실적이라고 생각된다.




반응형
블로그 이미지

Bryan_

,