- 참고 : 블로그
▪︎ Command
- raspi command
pi@drone:~$ sudo ssh -f -N -T -R 2222:localhost:22 uhyeong@210.11*.*.* -p 5001
📌 -f : Requests ssh to go to background just before command execution.
-N : Do not execute a remote command. This is useful for just forwarding ports.
⇒ 원격지에 로그인하지 않고 백그라운드로 터널 생성
-T : Disable pseudo-terminal allocation.
-R : Reverse SSH option
💡 1. 2222 is the port we'll use to remote into the computer
2. 22 is the port listening to SSH trafic on the pi
3. 5001 is the SSH port on desktop GCS
4. uhyeong is the username of the GCS computer
5. 210.11*.. is the router IP address (where the GCS computer is)
- win-ubuntu command
uhyeong@DESKTOP-R39GAN6:~$ ssh pi@localhost -p 2222
▪︎ Shell script + Crontab
- reverseSSH.sh
#!/bin/bash
mobileInterfaceName="usb0"
routerIp="210.115.229.207" # my router ip
# get dynamic mobile ip address from ifconfig
mobileIpAddress=$(ifconfig | grep -A2 $mobileInterfaceName | grep "inet " | awk -F' ' '{print $2}')
# run ssh command
# "11111111" is desktop GCS password
sshpass -p 11111111 ssh $mobileIpAddress -f -N -T -R 2222:localhost:22 uhyeong@$routerIp -p 5001
- setIpTable.sh
#!/bin/bash
routerIp="210.115.229.207" # my router ip
interfaceName="usb0"
# get dynamic mobile gateway ip address from ifconfig
mobileGateway=$(ifconfig | grep -A2 $interfaceName | grep "inet " | awk -F' ' '{print $2}' | awk -F'.' '{print $1"."$2"."$3".1"}')
#sudo ip route add 210.115.229.207 via *.*.*.* dev usb0
setRoute=$(sudo ip route add $routerIp via $mobileGateway dev $interfaceName 2>&1)
- crontab -e
@reboot sleep 20 && /home/pi/drone/reverseSSH/reverseSSH.sh
@reboot sleep 30 && /home/pi/drone/reverseSSH/setIpTable.sh
❗ Trouble Shooting
- crontab을 사용해서 라즈베리파이 재부팅 시 쉘 스크립트를 자동으로 실행시킨다.
- 새로 받은 LTE 사설 IP 정보를 가져와 라우팅 테이블 정보 갱신과 reverse ssh 명령을 수행시키고자 하였다.
- 사용자 권한 수정
- 재부팅을 하여도 쉘 스크립트가 실행이 안되는 것을 확인
- chmod 700으로 사용자에게 권한을 부여
- 재부팅 후 crontab으로 두 개의 쉘 파일이 자동 실행되는 것을 확인
- 정상적으로 셀룰러 모드인 드론에 무선으로 원격 접속 되는 것을 확인
- ifconfig 명령어 디렉토리 오류
- linux에서 ifconfig 명령어의 디렉터리 위치는 /usr/sbin 으로 확인함
- 하지만 지금 드론 라즈베리파이에 /usr/sbin 또는 /usr/bin에서 찾을 수 없었음
- 그래서 shell script의 bash 명령어를 수행할 때 경로에서 파일을 찾을 수 없다는 오류 발생
- shell script 안의 bash 명령어에서 경로를 지우고 ifconfig 명령어만 남기며 수정
- 스크립트 파일 정상 작동 확인
- 참고 : 블로그
- ssh 최초 접근시 접근 여부를 물어보는 핑거프린트(FingerPrint) yes or no 발생으로 인해 crontab이 실행시키는 ssh 명령이 완벽하게 실행되지 않는 상황
1. SSH Config 파일 수정
2. /etc/ssh/ssh_config
-
3. StrictHostKeyChecking no 추가pi@drone:~/drone/reverse_ssh $ cat /etc/ssh/ssh_config | grep StrictHostKeyChecking # StrictHostKeyChecking ask
- 참고 : 블로그
pi@drone:~ $ cat /etc/ssh/ssh_config | grep StrictHostKeyChecking # StrictHostKeyChecking ask StrictHostKeyChecking no
- password 치라는 문구가 나오는 경우 생김
pi@drone:~/drone/reverse_ssh $ ./reverseSSH.sh
Warning: Permanently added '192.168.225.40' (ECDSA) to the list of known hosts.
pi@192.168.225.40's password:
1. 처음 한번은 password 입력하여 터널링 해줌
2. 계속 password 입력해야 한다는 명령이 나옴
3. 그래서 계속 안됨
4. sshpass 도구로 미리 ssh 접속 비밀번호를 특정 파라미터 값으로 정의하여 자동 로그인 구현
pi@drone:~/drone/reverse_ssh $ sudo apt install sshpass
5. reverseSSH.sh 수정
...[생략]...
# run ssh command
sshpass -p 11111111 ssh $mobileIpAddress -f -N -T -R 2222:localhost:22 uhyeong@$routerIp -p 5001
- GCS의 우분투에서 ssh가 실행이 안된 상황
uhyeong@DESKTOP-R39GAN6:~$ sudo service ssh status
* sshd is not running
uhyeong@DESKTOP-R39GAN6:~$ sudo service ssh start
* Starting OpenBSD Secure Shell server sshd [ OK ]
uhyeong@DESKTOP-R39GAN6:~$ sudo service ssh status
* sshd is running
성공!