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_SOCKKRB5CCNAME환경 변수 후에 다시 테스트하십시오 .
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_SOCKunset 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.