ssh cron 작업에서만 권한이 거부되었습니다.

ssh cron 작업에서만 권한이 거부되었습니다.

매우 이상한 문제가 있습니다. SSH를 통해 (공개 키 인증을 사용하여) 원격 호스트에서 명령을 실행하는 작은 bash 스크립트를 만들었습니다.

명령줄에서 이 스크립트를 수동으로 실행하면 제대로 작동하지만 /etc/cron.hourly에 배치하면 Permission denied, please try again.오류와 함께 실패합니다.

  • ; 를 사용하여 스크립트에 키를 명시적으로 설정했습니다 ssh -i /root/.ssh/id_rsa user@remote "command".
  • 스크립트가 루트로 실행 중입니다( echo `id` > /tmp/whoami.log다시 확인하기 위해 a를 추가했습니다). 그리고
  • SSH 키는 비밀번호로 보호되어 있지 않습니다.

시스템은 Ubuntu 12.04 서버이므로 문제 해결을 위해 원격 측에 액세스할 수 있는 권한이 많지 않지만 앞서 말했듯이 ssh를 수동으로 실행하거나 명령줄에서 동일한 bash 스크립트를 실행하면 작동합니다.

왜 이런 일이 발생하는지 또는 어떻게 해결하는지 아시나요??

업데이트

내가 착각한 것으로 밝혀졌고 SSH 키는~였다비밀번호로 보호되어 있습니다(ssh-agent를 로드하는 키체인 사용). 따라서 스크립트에서는 실패했지만 bash 세션에서 실행할 때는 실패했습니다. 내 스크립트에 추가하면 . ~/.keychain/$HOSTNAME-sh문제가 해결되었습니다(나에게 올바른 방향을 알려주고 포괄적인 답변을 제공한 @grawity에게 감사드립니다).

답변1

대화형 명령과 크론 작업은 다양한 환경에서 실행됩니다. 특히,대화형 세션에는 SSH 에이전트가 실행 중이거나 Kerberos TGT가 저장되어 있을 수 있습니다.ssh인증 방법을 주문하는 방식 때문에할 수 없다옵션 을 추가했기 때문에 키가 사용되었는지 확인하세요 -i.

  • SSH 에이전트가 실행 중인 경우 ssh클라이언트는 항상 에이전트 키를 시도합니다.~ 전에명시적으로 지정된 키를 사용합니다.

  • 네트워크가 Kerberos를 사용하고 Kerberos TGT가 존재하는 경우 OpenSSH는 이를 사용합니다.~ 전에공개 키 인증을 시도 중입니다.

나는 귀하의 환경에 대해 아무것도 모르지만 다음 두 가지 가능성을 모두 쉽게 확인할 수 있습니다.

  1. 명령 앞에 unset SSH_AUTH_SOCK및를 추가하고 ,unset KRB5CCNAMEssh그 다음에수정된 스크립트를 수동으로 실행합니다.

    이렇게 하면 스크립트가 에이전트나 Kerberos 티켓을 볼 수 없으며 명시적으로 지정된 키만 사용됩니다.

  2. -v에 옵션을 추가합니다 ssh. 그러면 인증이 어떻게 이루어지는지에 대한 자세한 내용이 표시됩니다.

-oIdentitiesOnly=yes명령 에 추가할 수도 있습니다 ssh. 이것은 것이다지정된 키를 사용하도록 강제.


cron에서 에이전트에 액세스하는 방법에 대한 팁을 추가하면 더욱 좋습니다.

상담원은 일반적으로 대화형 로그인 세션과 밀접하게 연결되어 있으므로 이는 일반적으로 권장되지 않습니다. 특히 로그인할 때만 시작되고 로그아웃할 때 종료됩니다. SSH 키를 실제로 잠금 해제하려면 비밀번호가 필요합니다(비밀번호로 보호되어 있다고 가정).

"키체인"을 언급하셨는데요. 이것이 OS X 프로그램인가요, 아니면 Linux 스크립트인가요? (나는 Mac OS X의 아키텍처에 대해 잘 모르지만 AFAIK는 그것을 만듭니다.많이cronjob에서 사용자의 ssh-agent에 액세스하기가 더 어렵습니다...)

답변2

이 문제에 대한 또 다른 해결 방법은 로컬 절대 경로로 파일이나 명령을 실행하는 대신 로컬 상자에 대한 ssh로 cron을 설정하여 차례로 ssh 명령을 실행하는 것입니다. 이는 KRB5CCNAME을 캐시하고 /path/command가 작동하지 않는 곳에서 작동합니다.

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

답변3

당신이 사용할 수있는SSH-크론SSH 키를 노출하지 않고 SSH 에이전트를 사용하여 보안 서버에 대한 예약된 SSH 연결을 설정합니다.

답변4

다음과 같이 crontab에서 스크립트나 명령을 실행할 수 있습니다.

0 * * * * bash -c -l "/home/user/sshscript.sh"

또는

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"

관련 정보