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


13

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

명령 줄에서이 스크립트를 수동으로 실행하면 정상적으로 작동하지만 /etc/cron.hourly에 배치하면 Permission denied, please try again.오류 가 발생하여 실패 합니다.

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

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

왜 이런 일이 발생하는지 또는 어떻게 고칠 수 있습니까?

최신 정보

내가 잘못 알고 ssh 키 가 암호로 보호되어 (ssh-agent를로드하는 키 체인 사용) 스크립트에서 실패했지만 bash 세션에서 실행되지 않는 이유는 무엇입니까? . ~/.keychain/$HOSTNAME-sh내 스크립트에 추가 하면 문제가 해결되었습니다 (@grawity 덕분에 올바른 방향으로 나를 가리키고 포괄적 인 답변을 제공했습니다).


특정 키를 수동으로 사용 하시겠습니까? 설정 해제 SSH_AUTH_SOCK및 KRB5CCNAME환경 변수 후에 다시 테스트하십시오 .
— user1686

제안 해 주셔서 감사합니다. 그래도 나는 당신을 완전히 이해하지 못합니다. 수동으로 실행할 때 원격 호스트에서 명령을 연결 / 실행할 수 있기 때문에 특정 키를 사용하고 있다고 확신합니다. 해당 변수를 설정 해제 한 후 정확히 무엇을 다시 테스트해야합니까?
— Yoav Aner

또한-나는 ssh-agent를 사용하지 않기 때문에 어떻게 SSH_AUTH_SOCK관련 되어 있는지 확실하지 않습니다 (물론 시도해도 행복합니다). 키 파일에 직접 액세스하고 있으며 키 파일이 비밀번호로 보호되어 있지 않습니다. KRB5CCNAME빠른 검색에서 보았 듯이 이것은 Kerberos와 관련이 있습니다. 다시 –이 문제와의 관련성은 보이지 않지만 여기서 뭔가
— 빠졌을 수도

물론 스크립트를 테스트하십시오. cron 작업은 대화식 명령과 다른 환경에서 실행되기 때문에 "특정 키를 사용하고 있다고 확신 할 수 없습니다". -v해당 ssh명령에 옵션을 추가하면 더욱 좋습니다 .
— user1686

그러나 나는 그렇게한다. ssh -i두 경우 모두 명령을 사용하여 키를 명시 적으로 사용합니다 ... 스크립트에서 해당 변수를 설정 해제하고 참조하십시오. 좋은 제안 추가 -v-나도 추가하겠습니다.
— Yoav Aner

답변:


11

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

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

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

나는 당신의 환경에 대해 아무것도 모르지만,이 두 가지 가능성을 모두 쉽게 확인할 수 있습니다 :

  1. 추가 unset SSH_AUTH_SOCK및 unset KRB5CCNAME전과 ssh명령, 다음 수동으로 수정 된 스크립트를 실행합니다.

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

  2. 에 -v옵션을 추가하십시오 ssh. 인증 방법에 대한 자세한 내용이 표시됩니다.

또한 추가 할 수 있습니다 -oIdentitiesOnly=yes받는 ssh명령; 이것에 의해 지정된 키를 사용하게됩니다 .


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

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

"Keychain"을 언급했습니다. 이것이 OS X 프로그램입니까, 아니면 Linux 스크립트입니까? (Mac OS X의 아키텍처에 대해서는 잘 모르지만 AFAIK 는 cronjob에서 사용자의 ssh-agent에 액세스하는 것을 훨씬 어렵게 만듭니다 ...)


1
SSH 키를 노출시키지 않고 SSH 에이전트를 사용하여 ssh-cron을 사용하여 예약 된 SSH 연결을 보안 서버에 설정할 수 있습니다. superuser.com/questions/463540/…
— Luchostein

5

이 문제에 대한 또 다른 해결 방법은 cron을 로컬 상자로 ssh로 설정하여 로컬 절대 경로로 파일 또는 명령을 실행하는 대신 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

1

SSH 키를 노출시키지 않고 SSH 에이전트를 사용하여 ssh-cron 을 사용하여 예약 된 SSH 연결을 보안 서버에 설정할 수 있습니다 .


Homebrew에서는 종속성을 사용할 수 없으므로 설치가 복잡해 보입니다. 암호가없는 열쇠 같아요… :-/
— Charlie Gorichanaz

-1

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

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

또는

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


1
OP는 이미 다음을 통해 스크립트를 실행하려고합니다 cron. 그래서 이것은 실제로 대답을하지 않는 것 같습니다.
— bertieb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.