리눅스2023. 8. 11. 13:21

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/623186 (2019.1.3)

예전에 expect를 이용해서 ssh 자동접속하는 방법을 정리한 적이 있는데(여기로), ssh 접속후에 실행할 명령이 한줄 짜리라면 expect로 복잡하게 스크립트를 만드는 것보다 sshpass를 사용하는 것이 더 편리하다.

 

우선 sshpass 패키지를 설치한다. 데비안/우분투 계열 기준으로 아래와 같이 작업.

# S/W 저장소 정보 갱신
sudo apt-get update

# sshpass 패키지 설치
sudo apt-get install sshpass

사용 형식은 대략 아래와 같다. 암호는 -p 옵션으로 지정하면 접속할 때 자동으로 입력된다. -p와 접속암호 문자열 사이에 공백이 없음에 유의.

sshpass -p'접속암호' ssh 계정@서버주소

예를 들어 server.net에 john 계정으로 접속하는 상황을 생각해 보자. 접속암호는 my_password라고 가정하면, 터미널창에서 아래와 같이 작업하면 된다.

# john@server.net 접속, 접속암호 자동입력
sshpass -p'my_password' ssh john@server.net

같은 예시에서 ssh 접속후 특정 명령어를 실행한 후에 종료하려면 아래와 같이 작업할 수 있다. 접속한 후 "ls -l" 명령을 실행하는 경우다.

# john@server.net 접속, ls -l 실행
sshpass -p'my_password' ssh john@server.net 'ls -l'

간단한 명령어를 여러대의 호스트에 접속해서 실행해야 할 경우, 좀 더 간편하게 작업할 수 있다는 장점이 있다.

반드시 유의해야 할 점은 인자(argument)에 접속암호가 있으므로 프로세스 목록(ps) 또는 과거 명령어 이력(history) 등에 의해 노출될 수 있다는 점이다. 편하다고 막 쓰지 말고, 사용해도 괜찮은 안전한 상황인지 반드시 확인하자.

리눅스 민트 17 이후 버전에서 확인해 본 결과, ps에서는 sshpass의 -p 옵션 이후의 문자열이 "zzz..." 이런식으로 처리되어 표시되긴 하지만 문자열 길이를 짐작할 수 있다. 명령어 이력에는 접속암호가 그대로 노출된다.

따라서, ssh 자동접속으로 계속 접속상태를 유지하는 것보다는 위의 "ls -l" 실행 예시처럼 ssh 접속후 특정 명령어 하나만 실행하는 상황에서만 sshpass를 사용하는 것이 좋겠다. 또한, 작업한 후에 되도록 과거 명령어 이력을 삭제하는 것이 좋을 듯.

 

# 명령어 이력 삭제
history -c

728x90
Posted by 반달가면