* 서버에서 자동화를 위해 expect 쉘스크립트를 작성하면서 겪은 문제입니다.


[스크립트 예시]


#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof

echo "hahaha"


[실행 결과]


test@TEST_SERVER> exit 


Connection closed by foreign host.

invalid command name "echo"

    while executing

"echo "hahaha""



[원인]

- 위 방식은 expect 사용방식 중 HEREDOC 사용할 경우 시작과 끝을 잘 표시해줘야 한다.

(vscode 에서는 문서 형식을 shell script 로 하면 이상함을 바로 느낄 수 있다.)


expect << EOL   # 시작

...

EOL                 # 끝


- 위 스크립트는 끝부분을 표시해 주지 않아서 expect 관련 명령어로 인식되어 오류가 발생했다.



[수정]

#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof
EOL

echo "hahaha"


test@TEST_SERVER> exit 


Connection closed by foreign host.

hahaha



- 정상적으로 expect 종료 후 echo 명령어가 실행된다.




'Programming > Server' 카테고리의 다른 글

[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14
[CentOS 7] iptables 로그 남기기  (0) 2018.12.14
[FCM] 서버측 UnknownHostException  (0) 2018.10.01
[CentOS 7] systemd 기본 설정  (0) 2018.09.30

리눅스에서 현재 열려 있는 포트를 확인하는 방법


열려 있는 모든 포트를 표시하기

netstat -nap

n:host명으로 표시 안함a:모든소켓 표시p:프로세스ID와 프로그램명 표시


LISTEN중인 포트를 표시하기

netstat -nap | grep LISTEN)



상대방 포트가 열려 있는지를 확인하는 방법

상대방 머신에 접속이 되지 않을 때 혹시 포트가 막혀 있는지를 확인해 보자.
netcat(nc) 네트워크 유틸리티를 이용하면 된다. 


특정 호스트의 특정 포트가 열려 있는지를 확인하기

nc -z 호스트주소 포트


ex) nc -z www.google.com 80


<결과예>

Connection to www.google.com 80 port [tcp/http] succeeded!

z: 포트 검색


특정 머신의 포트 범위를 지정하여 열린 포트를 확인하기

nc 호스트주소 -z 시작포트-끝포트


ex) nc 10.20.30.40 -z 19-21

<결과 예>

Connection to 10.20.30.40 21 port [tcp/ftp] succeeded!Connection to 10.20.30.40 22 port [tcp/ssh] succeeded!Connection to 10.20.30.40 23 port [tcp/telnet] succeeded!



포트를 열기

위의 방법으로 호스트의 포트가 LISTEN중임을 확인하였는데 상대방 호스트에서 포트가 열려있지 않다고 나온다면, 호스트의 포트가 막혀 있을 가능성이 있다.

포트를 열려면 iptables를 사용하면 된다. iptables는 리눅스 방화벽을 설정하는 명령어이다.

특정 포트를 외부에서 접속할 수 있도록 열기

iptables -I INPUT 1 -p tcp --dport 12345 -j ACCEPT 

I: 새로운 규칙을 추가한다.

p: 패킷의 프로토콜을 명시한다.

j: 규칙에 해당되는 패킷을 어떻게 처리할지를 정한다.

이 명령은 외부에서 들어오는(INBOUND) TCP포트 12345의 연결을 받아들인다는 규칙을 방화벽 1번 방화벽 규칙으로 추가한다는 의미이다.

이렇게 추가한 규칙은 조회나 삭제가 가능하다.


추가한 설정 조회하기

조회하기

iptables -L -v

L: 규칙을 출력

v: 자세히


추가한 설정 삭제하기

규칙을 삭제하려면 추가한 규칙의 번호로 삭제하는 방법과 추가했을 때의 명령어에서 "-I"를 "-D"로 바꾸어 주는 방법이 있다.

규칙번호로 삭제하기iptables -D INPUT 1

추가한 규칙으로 삭제하기

iptables -D INPUT -p tcp --dport 12345 -j ACCEPT 

D: 규칙을 삭제


'Programming > Server' 카테고리의 다른 글

[FCM] 서버측 UnknownHostException  (0) 2018.10.01
[CentOS 7] systemd 기본 설정  (0) 2018.09.30
크롤링 robots.txt 주의점  (0) 2018.09.19
[Linux] lsof  (0) 2018.09.17
리눅스 터미널 명령어 종류  (0) 2018.09.17

+ Recent posts