Tarefa Cron executando mas não estabelecendo túnel

2

Eu tenho um script que estabelece um túnel reverso em um endpoint HostB . Parece assim:

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

quando eu o executo manualmente, como ./tun.sh funciona, e eu posso ver no HostB, que o userA está logado. Se eu rodá-lo novamente no HostA, mas a partir de outro console, ele funciona como esperado - ele não inicia um segundo túnel.

Tudo até agora é bom.

Agora edito meu crontab para ficar assim:

crontab -l

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

Ele executa o script a cada minuto. Isso deve ficar bem, já que o script termina se o túnel já estiver estabelecido.

No entanto, agora o userA não é logado como quando eu o executo manualmente a partir do console.

O código de teste na parte superior do script confirma que o script está sendo chamado e que tem permissão para executar /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]

Por algum motivo, -V escreve para stderr e não stdout , mas isso é um detalhe. O ponto principal é que o script está sendo executado a cada minuto.

Minha pergunta é: por que o túnel SSH não está estabelecido?

    
por Einar 14.05.2014 / 14:54

2 respostas

0

Obrigado a @Andrew por apontar para ssh-agent . Tanto quanto eu posso ver, se alguém quiser ser capaz de estabelecer o túnel sem ter que digitar uma senha a cada vez, a senha deve ser armazenada ou removida. Eu escolhi removê-lo. Para o registro, aqui estão algumas limpezas com base nos comentários que recebi:

#!/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

crontab:

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

copie o seu ID de túnel para o vps:

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

espere até que o túnel esteja rodando (veja sudo watch grep CRON /var/log/syslog ) e copie seu id normal se você ainda não entrou em ~/.ssh/authorized_keys

ssh-copy-id vps.com -p 2200

O ideal é que o túnel seja executado como usuário dedicado tanto no vps quanto no laptop.

    
por 17.06.2016 / 08:55
-2

Eu tive um problema semelhante - o ssh tunnel funciona se executado a partir do script, mas não do crontab. O ssh procura chaves e known_hosts em $ HOME / .ssh. Se você estiver executando o script do bash em user tom, $ HOME será / home / tom. Se o script for executado a partir do crontab, o usuário será root e $ HOME será / home / root (ou indefinido).

Solução: defina HOME em seu script para o usuário que possui as chaves.

HOME=/home/tom
    
por 28.02.2018 / 14:47