crontab을 통해 ssh 에이전트를 사용하여 ssh에서 rsync 명령 실행


18

나는 cronjob이 있습니다.

0 9 * * * rsync -a mydir remote_machine:

'crontab -e'로 이것을 설치했습니다. ssh-agent가 실행 중이며 rsync 명령 자체를 실행하면 사용자 상호 작용이나 암호 입력없이 작동하지만 cronjob은 다음 메시지와 함께 실패합니다.

Date: Wed,  9 Dec 2009 11:11:00 -0600 (CST)
From: Cron Daemon <me@my_machine.my_domain>
To: me@my_machine.my_domain
Subject: Cron <me@my_machine> rsync -a /home/me/mydir remote_machine:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-35.2/rsync/io.c(452)
[sender=2.6.9]

왜 작동하지 않습니까? 나는 cronjobs가 사용자로 나와 함께 실행된다는 것을 알고 있습니다 ( '* * * * * touch / tmp / a'를 실행하면 파일을 소유합니다) 그래서 rsync가 개인 키를 사용하여 저로 로그인한다고 가정합니다 ...

답변:


10

cron 세션 쉘에는 ssh 에이전트에 대한 지식이 없으므로 대화 할 수 없습니다.

에이전트가 시작되면 cron 세션을 수집하기 위해 에이전트에 필요한 정보를 넣을 수 있습니다.

예:

AGENT="ssh-agent -s"
if [ ! -d $HOME/.ssh/agent ]; then
        mkdir -p $HOME/.ssh/agent
fi
#
# Start an agent if there isn't one running already.
#
pid=`ps -u$LOGNAME | grep ssh-age | awk '{print $1}'`
if [ -z "$pid" ]; then
        $AGENT | grep -v echo > $HOME/.ssh/agent/$HOST & pid=$!
        sleep 1 # Let it fork and stuff
fi

그런 다음 에이전트에 키를 추가하십시오.

ssh-add $HOME/.ssh/id_dsa

이제 ssh를 사용하기 전에 cron 작업 에서이 작업을 수행해야합니다.

#
# Get our parent to pick up the required SSH env vars.
#
. $HOME/.ssh/agent/$HOST

... 그 후 ssh 세션이 정상적으로 진행되어야합니다.


따라서 모든 에이전트 항목을 스크립트에 rsync 명령 다음에 넣거나 cron이 cronjob의 쉘을 시작할 때 자동으로로드되는 일부 .profile 또는 .bashrc 파일에 넣을 수 있습니까?
aaron

에이전트 항목을 rsync 명령을 실행하는 스크립트에 넣었습니다.
David Mackintosh

3
필요한 것은 SSH_AUTH_SOCK 및 SSH_AGENT_PID env 변수를 소싱하는 것입니다 (.ssh / agent / 대신 .ssh-agent에 넣음). "0 9 * * *. $ HOME / .ssh -agent && rsync -av $ HOME / mydir remote_machine : "
aaron

1
이 모든 불필요한 키 체인을 사용하십시오
cmcginty

@cmcginty 누가 키 체인을 사용할 수 있거나 설치할 수 있다고 말합니까?
zb226

19

키 체인 이 필요합니다! 그냥 설치하고 다음 코드를 .bash_profile(또는 이와 동등한) 추가하십시오 .

if [ -x /usr/bin/keychain ]; then
  /usr/bin/keychain --quiet --clear $HOME/.ssh/id_rsa
fi

config.fish ( 2 )의 경우 :

if not status --is-interactive
   keychain --eval --quiet --quick $HOME/.ssh/id_rsa
end

그런 다음 스크립트에서 아래 코드를 사용하여 ssh-agent 환경 변수를로드하십시오.

. ~/.keychain/`/bin/hostname`-sh

물고기의 경우 :

source $HOME/.keychain/(hostname)-fish

키에 암호 문구가 있으면 키 체인이 한 번 묻습니다 (시스템을 재부팅하거나 ssh-agent를 종료 할 때까지 유효 함).

참고 : 키 체인은 코드 cshfish쉘 도 생성 하므로 접미사 "-sh"를 "-csh"또는 "-fish"로 바꾸십시오.


1
$ HOSTNAME은 cron 환경에 정의되어 있지 않지만 그 외에는 최상의 솔루션입니다
cmcginty

rsa 키를 사용하는 경우 키 체인 ~ / .ssh / id_dsa를 키 체인 ~ / .ssh / id_rsa로 변경합니까?
Katafalkas

@Katafalkas 정확히!
semente

@Casey 내 답변을 업데이트했습니다. 이제 cron과 호환됩니다.
semente

나는 물고기에 대한 더 나은 지침을 추가했습니다.
Elijah Lynn

2

첫 번째 답변에 투표 할 충분한 담당자가 없지만 문제가 해결되었습니다. ssh-agent와 관련하여 이미 실행 중일 수 있습니다. 다음은 ssh-agent 시작시 저장할 추가 항목없이 환경에서 SSH_AGENT_PID 및 SSH_AUTH_SOCK를 추출하는 스크립트입니다. (펄이 있다고 가정)

다음을 스크립트에 넣으십시오. (예 : findagent.pl)

그리고 cron 스크립트 안에 다음 줄을 추가하십시오 :

eval`{스크립트 경로} ​​/ findagent.pl`


\#!/usr/bin/perl -w
use strict;
my $agents = `ls -tr /tmp/ssh-*/*`;
my @agents;
(@agents) = split/\n/,$agents;

my $sshpid = `ps aux|grep ssh-agent|grep -v grep|awk '{print \$2}'|head -1`;
chomp($sshpid);
my @parts;
for (@agents) {
  chomp($_);
  if (!$_) { next; }
  my $agentfile = $_;
  (@parts) = split/\./,$agentfile;
  my $masterpid = `ps aux|grep $parts[1]|grep enlightenment`;
  if ($agentfile =~ m/$parts[1]/) {
    my $line1 = "SSH_AUTH_SOCK=" . $agentfile . '; export SSH_AUTH_SOCK';
    my $line2 = 'SSH_AGENT_PID=' . $sshpid . '; export SSH_AGENT_PID;';
    my $line3 = 'echo Agent pid ' . $sshpid . ';';
    print("$line1\n$line2\n$line3\n");
    last;
  } else {
    next;
  }
}

1

키 기반 인증을 사용하여 원격 컴퓨터에서 자신을 인증한다고 가정합니다. 아래 줄을보십시오 :

rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir user@host.tld:~/backupDir

여기서 .ssh / id_rsa는 개인 키의 경로입니다. 이것은 백업을 수행하는 데 사용하는 정확한 라인이며 항상 잘 작동합니다.

소원,
Fabian


0

대안으로, ssh 에이전트를 사용하는 대신 스크립트에서 rsync를 호출하기 전에 RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa"설정 해제 SSH_AGENT_PID 설정 해제 SSH_AUTH_SOCK를 내보냈습니다. '-e ...'를 사용하는 대신 RSYNC_RSH에 넣으면 호스트를 기반으로 사용되는 id 파일을 쉽게 조정할 수 있습니다.

이것이 도움이 되었기를 바랍니다. B


열쇠에 암호가 있으면 이것이 효과가 없다고 생각합니다
cmcginty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.