bash: o uso do scp no trabalho cron falha, mas é executado com êxito quando executado na linha de comando


8

Estou tentando usar o scp em um script bash executado pelo cron (estou executando isso no Ubuntu 10.0.4 LTS).

O script funciona bem (ou seja, transfere e copia arquivo1 e arquivo2 para / do servidor remoto, quando eu o executo na linha de comando. No entanto, quando eu executo o script como um trabalho cron, ele falha.

É assim que o script se parece:

#!/bin/bash

cd /home/oompah/scripts/tests/
scp -P 12345 file1 oompah@someserver.com:~/uploads

if scp -P 12345 oompah@someserver.com:/path/to/file2.dat local.dat >&/dev/null ; then 
    echo "INFO: transfer OK" ; 
else 
    echo "ERROR: transfer failed" ; 
fi

A mensagem de erro recebida (redirecionada para um arquivo de log) quando executada como uma tarefa cron é:

ERROR: transfer failed

A mensagem de erro que recebo na minha caixa de entrada é:

Permission denied (publickey).
lost connection

Por que está acontecendo e como posso corrigi-lo?

[Editar]

Modifiquei o 1º comando scp com um comando -i (como sugerido por M Jenkins), também adicionei -v para mensagens de depuração. Aqui está o log completo da mensagem de depuração. Felizmente, pode esclarecer o que está acontecendo:

Executing: program /usr/bin/ssh host 12.34.56.78, user oompah, command scp -v -t ~/uploads
OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 12.34.56.78 [12.34.56.78] port 12345.
debug1: Connection established.
debug1: identity file /home/oompah/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3p1 Debian-3ubuntu3
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '[12.34.56.78]:12345' is known and matches the RSA host key.
debug1: Found key in /home/oompah/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/oompah/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: No more authentication methods to try.
Permission denied (publickey).
lost connection
Permission denied (publickey).

3
Que saída você obtém se não redireciona stdout e stderr para / dev / null?
— BMK

@ BMK: sem o redirecionamento stdout, recebo as seguintes mensagens: Permissão negada (publickey). conexão perdida Permissão negada (chave pública).
— oompahloompah

Sugestão: nunca descarte o stderr em scripts como este. É mais útil do que ter uma única mensagem "ERRO".
— user1686

1
pode ser que a.) você use um agente ao executar o comando interativamente, b.) execute-o como um usuário diferente sem o próprio par de chaves (ou pasta inicial) ou c.) que as teclas_autorizadas no destino restrinjam a origem do comando conexão ...?
— 0xC0000022L 31/03

Respostas:


7

Meu palpite:

Você tem um par de chaves SSH protegido por senha, que é carregado automaticamente pelo GNOME Keyring quando você faz login. No entanto, cronnão tem acesso ao chaveiro e sshtambém não pode solicitar uma senha (devido à falta de um tty).

Para citar o sshlog que você adicionou:

debug1: Oferecendo chave pública : /home/oompah/.ssh/id_rsa
debug1: O servidor aceita chave: pkalg ssh-rsa blen 277
debug1: PEM_ read_PrivateKey falhou
debug1: leia a chave privada PEM feita: digite
debug1: read_passphrase: não pode abrir / dev / tty : Não existe esse dispositivo ou endereço


@ grrawity: Obrigado pela informação. Como eu resolvo o problema?
— oompahloompah

@oompah: remova a senha do seu par de chaves. (Se você quiser, você pode criar um segundo puramente para uso automatizado, e dai-a scp -i.)
— user1686

@ grrawity: Obrigado pelo feedback. Não me sinto confortável removendo uma senha do meu Keypair (eu não saberia como fazer isso em nenhum caso). Você mencionou a criação de um "segundo" - presumivelmente você quer dizer um segundo par de chaves - mas este sem senha - para que eu possa usá-lo para logins automatizados. BTW, você quer dizer PASSPHRASE quando diz a senha?
— oompahloompah

@oompah: Se a sua máquina CentOS estiver fisicamente segura, tudo bem. A segunda sugestão de par de chaves provavelmente só será útil se você tiver o par de chaves principal em muitos sistemas. (OpenSSH chama de "senha", mas não muitas pessoas realmente usar todo um frase de suas chaves.)
— user1686

Finalmente consegui que isso funcionasse, depois de muito brincar com chaveiros etc. No final, resolvi sugerir que você criasse um par de chaves sem senha para o cron e passe-o para scp no shell script. Ele não deveria ter que ser tão difícil realmente ... SMH
— oompahloompah

3

Parece que o scp não está pegando seu par de chaves pública / privada no seu diretório ~ / .ssh.

Tente adicionar

HOME=/home/oompah

na parte superior do seu arquivo crontab (ele já deve estar configurado de qualquer maneira automaticamente)

Você também pode tentar adicionar

echo "DEBUG: My home dir is $HOME"

no seu script para garantir que está obtendo o valor certo.

Outra opção é especificar o parâmetro -i para scp para forçar um par de chaves específico a ser usado:

scp -i /home/oompah/.ssh/id_rsa ...

por exemplo.


Eu tentei sua sugestão (usando a opção -i). Por favor, veja minha pergunta atualizada
— oompahloompah 31/03

3

Qual usuário está executando o cron? Parece que esse usuário não tem acesso à sua chave pública.


0

Embora não seja o problema nesse caso, o cron interpreta o sinal de porcentagem ( %) como caractere de nova linha, portanto, ele precisa ser escapado ( \%) ou você terminará com meio comando se perguntando por que o cron simplesmente não faz nada (apesar de reclamar no syslog).

Isso pode causar problemas se você estiver trabalhando /bin/dateno seu crontab.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.