2014-07-20 8 views
0

init.d를 사용하여 안드로이드 장치에서 백그라운드로 나를 위해 ssh 터널을 유지하는 스크립트를 작성하려고합니다. 이 & 검사를 계속 SSH 줄을 실행 닫으면 $ REMSERV/$ REMSERVPORT에 활성 연결이있는 경우 내가 필요로 무엇SSH 열을 유지하기 위해 포트/연결이 닫혀있는 동안 루프를 실행하는 명령

#!/system/xbin/bash 

. /system/etc/sshd.conf 

while ! ping -c1 www.google.com &>/dev/null; do:; 
done 

ssh -T -K 120 -i "$KEYFILE" -R "$REVPORT":localhost:"$PORT "$REMUSER"@"$REMSERV" -p "$REMSERVPORT" -y 

는 지속적으로 모든 X의 초를 확인하는 루프입니다. 내가 처분 할 수있는 제한된 CLI 도구 모음이 있다는 것을 명심하십시오. 대신 autossh를 조사하고 있었지만 플랫폼에 맞는 컴파일 된 바이너리를 찾을 수 없었습니다. netstat이 도움이 될지 궁금합니다. 코드 작동 방식에 대한 의견은 모두 &입니다.

답변

1

(난 항상/선호 until foo 대신 while ! foo하지만 두 작품을 사용). 스크립트의

#!/system/xbin/bash 

. /system/etc/sshd.conf 

until ssh -N -g -T -K 180 -i "$KEYFILE" -R "$REVPORT":localhost:"$PORT" "$REMUSER"@"$REMSERV" -p "$REMSERVPORT" -y 
do 
sleep 1; ssh -T -i "$KEYFILE" "$REMUSER"@"$REMSERV" -p "$REMSERVPORT" -y ssh localhost -p "$REVPORT" 
done 

첫 번째 줄은 & 읽기 나오지 사용하는 스크립트에 의해 기록됩니다 내 "설정"파일에 지시합니다. 루프에서 첫 번째 부분은 .conf 파일의 변수를 사용하여 역 ssh 터널을 설정합니다. &은 0을 반환 할 때까지 계속 수행합니다. 두 번째 부분은 ssh 서버에 연결하고 ssh 명령을 실행하여 연결 끊김으로 인해 연결된 포트를 해제합니다.

2

나는 당신이 단순히 당신의 ssh 명령 (또는 나는 무엇인가 놓쳤다) 루프를 돌릴 필요가 있다고 생각한다.. 에러 SSH 종료하면,이 고리는 1 초 잘되지만 until ssh<the-options> do sleep 1 done

다음 시도. 이 내가있는 init.d & 안드로이드에 bash는 스크립트를 사용하여 내 지속적인 SSH 터널을 생성 해 완성하는 방법이다

+0

SSH 명령을 계속 실행하면 연결이 끊어지면 다시 연결됩니다. – Geofferey

+0

@Geofferey'until' ('while')은'until foo bar' (foo : command, bar : parameter)를 사용할 때 명령의 반환 값을 대기합니다. 'foo'가 0을 반환하면'do'는 do-done 섹션을 수행 한 다음'foo' 명령을 다시 시작합니다. 그것은'until'과 정확히 반대입니다 (do-done을 실행 한 다음 명령을 다시 실행하는 반면 명령은 0을 반환하지 않습니다). 'ssh' (다른 명령과 마찬가지로)는 그 끝에 ** 종료 코드 **를 반환합니다. 연결에 실패하면 0을 반환하지 않습니다 (예를 들어). – syme

+0

자, 이제 알았습니다. 한 가지 문제가 있습니다. 연결이 끊어지면 내 라우터는 역방향 포트를 열어두고 역방향 연결을 설정할 수 없습니다. ssh가 ssh를 출력 할 때 어떻게 명령을 다시 시도하도록 할 수 있습니까? 원격 TCP 전달 요청이 실패했습니다 (포트 10000 -> localhost : 22). 작동하지만 연결을 설정하고 다음 손실까지 시도를 중지합니다. 나는 그 반대를 연결하려고하면 그쪽으로 알면 라우터가 포트를 닫고 터널이 다시 설정되지만 스크립트 때문에 ssh 연결이 이미 시작된 경우에는 실패합니다. – Geofferey