Запуск 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 или другой скрипт типа серверной службы.