크론 작업이 실행 중이지만 터널을 설정하지 않음

크론 작업이 실행 중이지만 터널을 설정하지 않음

끝점에 역방향 터널을 설정하는 스크립트가 있습니다 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.shHostB에서 해당 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]

어떤 이유에서 인지 and not -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

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

해결 방법: 키가 있는 사용자에 대해 스크립트에서 HOME을 정의하십시오.

HOME=/home/tom

관련 정보