Cron 작업이 실행 중이지만 터널이 설정되지 않았습니다.

Cron 작업이 실행 중이지만 터널이 설정되지 않았습니다.

끝점에 역방향 터널을 설정하는 스크립트가 있습니다 HostB. 다음과 같습니다.

cat tun.sh

#!/usr/bin/env bash

# Test code
/usr/bin/ssh -V 1> /home/userA/bin/tun.stdout 2> /home/userA/bin/tun.stderr

# Establish tunnel
createTunnel() {
    /usr/bin/ssh -R *:19999:localhost:22 userB@hostB
}

# Do nothing if tunnel is already established
/usr/bin/ssh -p 19999 userA@hostB true
if [[ $? -ne 0 ]]; then
    createTunnel
fi

수동으로 실행하면 ./tun.sh정상적으로 작동하며 HostB에서 userA가 로그인된 것을 볼 수 있습니다. HostA에서 다시 실행하지만 다른 콘솔에서 실행하면 예상대로 작동합니다. 즉, 두 번째 터널이 시작되지 않습니다.

여태까지는 그런대로 잘됐다.

이제 crontab을 다음과 같이 편집합니다.

crontab -l

# m h  dom mon dow   command
*/1 *   *   *   *   /home/userA/bin/tun.sh

매분마다 스크립트를 실행합니다. 터널이 이미 설정된 경우 스크립트가 종료되므로 괜찮습니다.

그러나 이제 userA는 콘솔에서 수동으로 실행할 때처럼 로그인되지 않습니다.

스크립트 상단의 테스트 코드는 스크립트가 호출되고 실행 권한이 있는지 확인합니다 /usr/bin/ssh.

~/bin$ ls

tun.sh  tun.stderr  tun.stdout

~/bin$ cat tun.stderr

OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 Mar 2009

~/bin$ cat tun.stdout

[empty]

무슨 이유에서 인지 글을 쓰는 대신 -V글을 쓰는 것인데 , 그게 디테일이다. 여기서 중요한 점은 스크립트가 1분마다 실행된다는 것입니다.stderrstdout

내 질문은 다음과 같습니다SSH 터널이 설정되지 않은 이유는 무엇입니까?

답변1

지적해 주신 @Andrew에게 감사드립니다 ssh-agent. 제가 아는 한, 매번 비밀번호를 입력하지 않고도 터널을 설정하려면 비밀번호를 저장하거나 삭제해야 합니다. 저는 삭제를 선택했습니다. 기록을 위해 제가 받은 의견을 바탕으로 정리한 내용은 다음과 같습니다.

#!/usr/bin/env bash

# Establish tunnel
createTunnel() {
    /usr/bin/ssh -i /home/laptopuser/.ssh/id_rsa_tunnel -R 2200:localhost:22 [email protected]
}

# Do nothing if tunnel is already established
/usr/bin/ssh -i /home/user/laptopuser/.ssh/id_rsa_tunnel -p 2200 [email protected] true
if [[ $? -ne 0 ]]; then
    createTunnel
fi

예약 된 일들:

# m h  dom mon dow   command
*/1 *   *   *   *   /home/laptopuser/bin/establishTunnel.sh

터널 ID를 vps에 복사합니다.

ssh-copy-id -i /home/user/laptopuser/.ssh/id_rsa_tunnel vps.com

터널이 실행될 때까지 기다리고( 참조 sudo watch grep CRON /var/log/syslog), 아직 터널에 있지 않은 경우 일반 ID를 복사하세요.~/.ssh/authorized_keys

ssh-copy-id vps.com -p 2200

이상적으로는 터널이 vps와 노트북에서 전용 사용자로 실행되는 것입니다.

답변2

비슷한 문제가 있었습니다. crontab 대신 스크립트에서 실행하면 SSH 터널링이 작동했습니다. ssh는 $HOME/.ssh에서 키와 Known_hosts를 찾습니다. 사용자 tom으로 bash에서 스크립트를 실행하면 $HOME은 /home/tom이 됩니다. 스크립트가 crontab에서 실행되면 사용자는 루트가 되고 $HOME은 /home/root(또는 정의되지 않음)가 됩니다.

해결 방법: 키를 소유한 사용자에 대해 스크립트에서 HOME을 정의하십시오.

HOME=/home/tom

관련 정보