Запуск SCP через системный вызов Perl при работе в качестве службы

Я создал сервис в стиле Debian, который отслеживает базу данных и копирует файлы на удаленный компьютер в зависимости от данных в базе данных.

Когда это работает "автономно", весь процесс работает чудесно, однако, когда я запускаю его как службу /etc/init.d/MonDB start (который работает должным образом), как служба, scp не будет работать с кодом ошибки 256, который я сдвигаю, чтобы получить код 1. Согласно документации, это просто "общая ошибка" и ничего не говорит мне, почему не сработает

Я искал в интернете и не могу найти ответ.

Где я:

  • Запросы пароля отключены, потому что я уже настроил scp для входа без пароля. Работает.
  • Я пытался использовать -i чтобы указать это на мой файл личности.
  • Я пытался получить больше данных от процесса с помощью -v, но ничего больше не возвращается.
  • Я удалил строгую проверку хоста, думая, что что-то там, но я сомневался, что это проблема.

Он работает автономно нормально, поэтому синтаксис и значения хороши.

Я использую форму LIST system() (вызов perl system()) Все записи находятся в отдельных элементах. (опять же, все это работает автономно.)

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");
}

Мой журнал показывает: (отредактированы ключевые части для безопасности.)

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

Я не думаю, что это проблема Perl, поэтому SCP не запускается, когда STDIN, STDOUT и STDERR обрезаются, а также не из оболочки, а как служба.

Что нужно scp для работы в контексте службы (или из процесса сервера)?

1 ответ

Решение

Ответ: настройте логин без ключа для scp и ssh под локальной учетной записью root, чтобы войти в удаленную учетную запись пользователя.

Понял!

когда я тестировал его, я вошел в систему как мой идентификатор пользователя, но когда он работал как служба, он работал от имени пользователя root.

Я изменил команды открытия, которые открывают STDOUT и STDERR на /dev/null, и записал их в файл. Когда я сделал это, я получил форму вывода -v от scp. Происходило то, что scp запускал ssh, но не передавал мой файл идентификации -i, поэтому он получал отказ в доступе, потому что эффективный идентификатор пользователя был root, а root не имел ключа на удаленной машине для моей учетной записи пользователя на эта машина для ssh для использования.

Я прошел шаги по настройке входа без пароля, но локально как root, к моей удаленной учетной записи обычного пользователя.

Итак, мой удаленный вход в систему (не root) имел оба ключа для моей локальной учетной записи обычного пользователя и локальной учетной записи root, после этого он начал работать.

Теперь процесс работает отлично, используя scp в качестве службы сервера. scp не передает опцию -i ssh - вот что вызвало этот беспорядок.

Надеюсь, это поможет любому, кто пытается использовать scp form cron или другой скрипт типа серверной службы.

Другие вопросы по тегам