왜 SSH가 Crontab에서 실패했지만 명령 줄에서 실행될 때 성공합니까?

StackOverflow https://stackoverflow.com/questions/869589

  •  22-08-2019
  •  | 
  •  

문제

원격 시스템에 SSH를 수행하고 다음과 같은 명령을 실행하는 Bash 스크립트가 있습니다.

ssh -nxv user@remotehost echo "hello world"

명령 줄에서 명령을 실행하면 정상적으로 작동하지만 Crontab의 일부로 실행될 때 실패합니다 (ErrorCode = 255- SSH 연결을 설정할 수 없습니다). 세부:

...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...

로컬로 실행할 때 루트 역할을하는 Crontab은 루트로도 작동합니다. Crontab 및 Command Line에서 'ID'를 실행하면 정확히 동일한 결과가 나타납니다.

$ id
> uid=0(root) gid=0(root) groups=0(root),...

나는 일부 로컬 기계에서 crond를 실행하는 기계까지 SSH를 수행합니다. SSH 키와 SSH에서 Crond Machine 및 스크립트가 연결하는 다른 시스템에 대한 자격 증명이 있습니다.

추신. 루트로 실행하는 것이 나쁘거나 잘못되었다고 요청/불평/의견을 요청하지 마십시오.이 질문의 목적이 아닙니다.

도움이 되었습니까?

해결책

일반적으로 로컬 머신에서 Crond를 실행하는 기계로 SSH에있을 때 개인 키가 SSH 에이전트에로드되어 연결을 통해 전달된다고 생각합니다. 따라서 명령 줄에서 명령을 실행하면 SSH-Agent에서 개인 키를 찾아 원격 시스템에 로그인하는 데 사용합니다.

Crond가 명령을 실행하면 SSH 에이전트에 액세스 할 수 없으므로 개인 키를 사용할 수 없습니다.

Crond를 실행하는 기계에 루트에 대한 새로운 개인 키를 만들고 공개 부분을 적절한 부분에 복사해야합니다. authorized_keys Crond가 로그인하려는 원격 시스템에 파일을 파일하십시오.

다른 팁

keychain

이것을 고통스러운 방식으로 해결합니다. 데비안/우분투의 저장소에 있습니다.

sudo apt-get install keychain

그리고 아마도 다른 많은 배포판 (Gentoo에서 유래 한 것처럼 보입니다).

이 프로그램은 시작됩니다 ssh-agent 아무것도 실행 중이 아니라면 쉘 스크립트를 제공하는 경우 sourceD와 현재 쉘을이 특정에 연결하십시오 ssh-agent.

을 위한 bash, 개인 키라는 이름의 개인 키가 있습니다 id_rsa, 다음을 당신에게 추가하십시오 .profile:

keychain --nogui id_rsa

이것은 시작됩니다 ssh-agent 그리고 추가하십시오 id_rsa 재부팅 후 첫 로그인의 키. 키가 암호로 보호되면 암호를 요구합니다. 더 이상 보호되지 않은 키를 사용할 필요가 없습니다! 후속 로그인의 경우 에이전트를 인식하고 다시 암호를 요구하지 않습니다.

또한 다음을 마지막 줄로 추가하십시오. .bashrc:

. ~/.keychain/$HOSTNAME-sh

이렇게하면 SHOL이 관리하는 SSH 에이전트에 도달 할 위치를 알려줍니다. keychain. 그것을 확인하십시오 .bashrc 공급됩니다 .profile.

그러나 그것은 것 같습니다 cron 일자리는 여전히 이것을 보지 못합니다. 치료법으로, 위의 선을 포함하십시오. crontab, 실제 명령 직전 :

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command

패스 프레이즈없이 SSH 키를 노출시키지 마십시오. 사용 SSH-Cron 대신 SSH 에이전트를 사용하여 작업을 예약 할 수 있습니다.

그래서 비슷한 문제가있었습니다. 나는 여기에 와서 다양한 답변을 보았지만 여기서 약간의 실험으로 Passphrase, SSH-Agent 및 CRON이있는 SSHKeys와 함께 작동하는 방법이 여기에 있습니다.

먼저 SSH 설정은 Bash Init 스크립트에서 다음 스크립트를 사용합니다.

# JFD Added this for ssh
SSH_ENV=$HOME/.ssh/environment

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
        echo succeeded
        chmod 600 "${SSH_ENV}"
        . "${SSH_ENV}" > /dev/null
        /usr/bin/ssh-add
    }


    if [ -f "${SSH_ENV}" ]; then
         . "${SSH_ENV}" > /dev/null
         ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
            start_agent;
        }
   else
        start_agent;
   fi

로그인하면 패스 프레이즈를 한 번 입력 한 다음 SSH-Agent를 사용하여 자동으로 인증됩니다.

SSH 에이전트 세부 사항은 .ssh/환경에 보관됩니다. 다음은 그 스크립트의 모습입니다.

SSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2091; export SSH_AGENT_PID;
#echo Agent pid 2091;

CRON과 관련하여 다양한 방식으로 일반 사용자로 작업을 설정할 수 있습니다. Crontab -e를 루트 사용자로 실행하면 루트 사용자 Cron을 설정합니다. Crontab -u Davis -e로 실행되면 userid davis로 cron 작업을 추가합니다. 마찬가지로, 사용자 Davis로 실행하고 Crontab -e를 수행하면 userId Davis로 실행되는 Cron 작업을 만듭니다. 다음 항목으로 확인할 수 있습니다.

30 *  *   *   *     /usr/bin/whoami

이것은 30 분마다 Whoami의 결과를 사용자 Davis에게 우송합니다. (나는 Crontabe -e를 사용자 Davis로했다.)

사용자 Davis로 사용되는 키를 보려고하면 다음을 수행하십시오.

36 *  *   *   *     /usr/bin/ssh-add -l

실패 할 것입니다. 우편으로 보낸 로그는 말할 것입니다.

To: davis@xxxx.net
Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l

Could not open a connection to your authentication agent.

해결책은 위의 SSH 에이전트에 대한 ENV 스크립트를 공급하는 것입니다. 결과 CRON 항목은 다음과 같습니다.

55 10  *   *   *     . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh

이것은 스크립트가 10:55에 실행됩니다. 선두를 주목하십시오. 대본에서. .Bash init 스크립트에있는 것과 유사한 내 환경 에서이 스크립트를 실행한다고 말합니다.

어제 비슷한 문제가있었습니다 ...

하나의 서버에서 Cron 작업이 있는데 SSH를 사용하여 다른 서버에서 일부 작업을 시작합니다 ... 문제는 사용자 권한과 키였습니다 ...

Crontab에서 나는했다

* * * * * php /path/to/script/doSomeJob.php

그리고 그것은 단순히 작동하지 않았습니다 (권한이 없었습니다). 다른 서버에 연결된 특정 사용자로 CRON을 실행하려고했습니다.

* * * * * user php /path/to/script/doSomeJob.php

그러나 효과가 없습니다.

마지막으로 스크립트로 Navicate를 한 다음 PHP 파일을 실행하면 작동했습니다.

* * * * * cd /path/to/script/; php doSomeJob.php
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top