Linux] 패스워드 입력없이 sftp 원격 접속 하기

2017. 8. 25. 07:00



sftp로 접속하는 shellscript를 만들면서...


이전에 만들어져있던 ftp용 쉘스크립트를 참고하려고 했더니 패스워드 입력 문제 부분은 도움이 안되네. 헐...



 ftp 파일 다운로드 스크립트


ftp 접속 쉘스크립트 파일을 참고해보니 아래 내용과 같다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
today=`date +%Y%m%d`
tempfile="/tmp/mget_link-sync-put.$$"
 
cd /mget/
mkdir $today
cd $today
 
trap "/bin/rm -f $tempfile" 0 1 15  
 
echo "open 192.168.100.170" > $tempfile
echo "user userpaswd" >> $tempfile
echo "cd $today" >> $tempfile
echo "bin" >> $tempfile
echo "mget *.txt" >> $tempfile
echo "quit" >> $tempfile
 
ftp -< $tempfile 
cs


위 ftp 다운로드용 쉘스크립트를 간단히 해석해보면 오늘 날짜에 해당하는 today 변수를 선언하고

/mget 디렉토리 아래 오늘 날짜의 디렉토리를 만들고

ftp로 접속할 서버(192.168.100.170)로 보낼 명령어들을 tempfile에 파이프( >, >>)로 차곡차곡 보내두었다가 ftp -n 옵션으로 자동 로그인을 하는 방식이다.



sftp 패스워드 자동입력


ftp의 보안 취약성 때문에 sftp를 사용해야 하는데 ftp의 -n 같은 자동 로그인을 허용하지 않기 때문에 스크립트에 패스워드를 입력해서 사용하는 방법은 불가능하다. 


해결방법은

1) expect를 사용해서 대화식처럼 입력하는 방법

(이것은 당연하지만  expect가 설치되어 있어야 가능하다)

1
2
3
4
5
6
7
#!/usr/bin/expect -f
 
spawn sftp host
expect "password:" { send "PASSWORD\r" }
expect "sftp>" { send "put *.txt\r" }
expect "sftp>" { send "quit\r" }
interact
cs



2) ssh에서 사용할 키를 생성


ssh 키를 이용하는 방법은 

가) 클라이언트의 ssh키 생성

나) 서버 쪽에 클라이언트의 ssh키를 복사

다) 클라이언트에서 패스워드 없이 sftp 접속

즉, 클라이언트 쪽에서 ssh키를 생성하고 이 키를 서버쪽에 복사해두면 별도의 패스워드 입력과정 없이 sftp로 접속 할 수 있다. 


실제 입력 예는 아래와 같다. 


가) sftp로 접속하려는 클라이언트에서 ssh키를 생성한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@OEL73:~/.ssh]$ ssh-keygen -t rsa -2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
58:86:24:35:96:fe:bf:62:91:09:3b:ef:c9:7e:d5:00 root@OEL73
The key's randomart image is:
+--[ RSA 2048]----+
|    ..=.         |
|     +.o  E      |
|     .. o  .     |
|      o+    .    |
|      .+So   o   |
|      o =   . .  |
|       o o .     |
|       .+.o      |
|       +=o..     |
+-----------------+
cs


ssh키는 홈디렉토리(~) 아래 .ssh에 생성된다. 


나) 키 복사


클라이언트에 생성된 ~/.ssh/id_rsa.pub 파일을 sftp 서버측으로 복사한다. 

이 과정에서 서버측 계정의 패스워드를 입력한다. 

1
2
3
4
5
6
7
8
9
10
 
[root@OEL73:~/.ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.100.170
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.170's password: 
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '192.168.100.170'"
and check to make sure that only the key(s) you wanted were added.
cs



다) 이제 클라이언트에서 sftp서버(192.168.100.170)로 패스워드 입력없이 접속할 수 있다. 

1
2
3
[root@OEL73:~/.ssh]$ sftp 192.168.100.170
Connected to 192.168.100.170.
sftp> exit
cs


참고로 클라이언트의 키 파일은 서버 쪽 홈디렉토리(~) 아래 .ssh/authorized_key라는 이름으로 복사된다.

- sftp 클라이언트쪽

1
2
3
4
5
6
7
[root@OEL73:/]$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtF01Xu3
UoBTOpZn2M5qpiFRVxn5tLIRTRSkMzL0w2JbTYOtghsRkr
(중략)
qpdfI0ajzVT6UQ6qooprK2MDwvPJKUv49K4f1sOyuTiJQ
ujPXPxvjEU3 root@OEL73
 
cs


- sftp 서버쪽

1
2
3
4
5
6
[root@centdb16 /]cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtF01Xu3
UoBTOpZn2M5qpiFRVxn5tLIRTRSkMzL0w2JbTYOtghsRkr
(중략)
qpdfI0ajzVT6UQ6qooprK2MDwvPJKUv49K4f1sOyuTiJQ
ujPXPxvjEU3 root@OEL73
cs


또루아빠 Linux, Unix , , , , , , ,