Executando o SCP através da chamada do sistema Perl () ao executar como um serviço

2

Eu criei um serviço de estilo Debian que monitora um banco de dados e copia arquivos para uma máquina remota, dependendo dos dados no banco de dados.

Quando isso funciona "autônomo", todo o processo funciona maravilhosamente, no entanto, quando eu o executo como um serviço /etc/init.d/MonDB start (que funciona corretamente), como um serviço, o scp não funciona com o código de erro 256 para obter um código de 1. De acordo com os documentos, isso é apenas um "Erro Geral" e não me diz nada por que não funciona.

Eu tenho vasculhado a internet e não consigo encontrar uma resposta.

Onde estou:

  • prompts de senha estão desabilitados porque eu já configurei o scp para fazer login sem senha. funciona.
  • Eu tentei usar -i para apontá-lo para o meu arquivo de identidade.
  • Tentei recuperar mais dados do processo com -v, mas nada adicional volta.
  • Eu removi a verificação de host estrita pensando em algo, mas duvidei que isso fosse um problema.

Ele é executado de maneira independente, portanto, a sintaxe e os valores são bons.

Eu uso o formulário LIST de system() (perl system () call) Todas as entradas estão em elementos separados. (novamente, tudo isso funciona de forma independente.)

system (@PostCMD) == 0 or logEntry ("system @PostCMD failed: $?, $!");
if ($? == -1) {
    logEntry ( "failed to execute: $!\n" );
} elsif ($? & 127) {
    logEntry ( "child died with signal %d, %s coredump\n",
     ($? & 127),  ($? & 128) ? 'with' : 'without' );
} else {
    my $err = $? >> 0;
    logEntry ("child exited with value $err\n");
}

Meu log mostra: (partes da chave redigidas para segurança.)

2015-02-11 22:08:32 system /usr/bin/scp -v -i /home/*****/.ssh/id_rsa 
  -o StrictHostKeyChecking=no /*********file-to-copy******.ext
  [email protected]:/xxx/dest/xxx failed: 256, 
2015-02-11 22:08:32 child exited with value 256

Eu não acho que este é um problema Perl, é por isso que não será executado SCP quando STDIN, STDOUT e STDERR são cortados, e também não executado a partir de um shell, mas como um serviço.

O que o scp precisa para operar em um contexto de serviço (ou de um processo de servidor)?

    
por Quade2002 12.02.2015 / 04:27

1 resposta

1

Resposta: configure o login sem chave para scp e ssh na conta raiz local, para a conta de usuário remoto que está sendo conectada.

Entendi!

quando eu estava testando, eu estava logado como meu ID de usuário, mas quando ele estava rodando como um serviço, ele estava rodando como root.

Alterei os comandos abertos que abrem STDOUT e STDERR para / dev / null e os escrevi em um arquivo. Quando fiz isso, recebi o formulário de saída -v do scp. O que estava acontecendo era, scp estava rodando ssh, mas não estava passando o meu comando identity file -i, então ele estava tendo acesso negado, porque o id efetivo era root, e root não tinha chave na máquina remota para minha conta de usuário essa máquina para o ssh usar.

Eu passei pelas etapas para configurar o login sem senha, mas localmente como raiz, para minha conta de usuário normal remota.

Assim, meu login remoto (não-raiz) tinha as duas chaves para minha conta de usuário normal local e a conta raiz local; depois disso, ele começou a funcionar.

O processo agora está funcionando perfeitamente usando o scp como um serviço de servidor. scp não passando a opção -i para o ssh é o que causou essa bagunça.

Espero que isso ajude alguém tentando usar o cron do formulário scp ou outro script de tipo de serviço do servidor.

    
por Quade2002 12.02.2015 / 17:13