이 rsync + ssh cron 작업에서 'Permission denied (publickey)'오류가 발생하는 이유는 무엇입니까?


20

매일 원격 서버와 동기화하려는 로컬 드라이브에 자주 백업합니다.

대상 서버는 SSH 키 (암호 없음) 액세스 전용으로 구성되어 있습니다. 해당 서버의 기본 SSH 키가 암호로 보호되어 있기 때문에 무인 백업에 사용할 두 번째 SSH 키 (암호로 보호되지 않음) + 사용자를 만들었습니다. 이 방법으로 cron이 실행될 때 암호를 입력 할 필요가 없습니다 .

cron과 rsync를 사용하고 있으며 모든 명령이 개별적으로 작동하지만 결합하면 실패합니다.

문제 해결이 진행되는 동안 가장 먼 곳

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"

어떤 오류를 반환

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]

이 문제를 해결하는 방법에 대한 팁이 있습니까?


지금까지 시도한 아이디어는 다음과 같습니다.

  1. 크론은 확실히 실행 중입니다 ps aux | grep cron
  2. / var / log / syslog에 이상한 것은 없습니다 Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. 백업 사용자가 작업 할 때 터미널에서 원격 서버로 SSH ssh backups-user@XX.XX.XX.XX

  4. 터미널에서 명령을 실행하면 완벽하게 작동합니다 rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
  5. backups-user 키의 경로를 수동으로 지정해도 효과가 없습니다. rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/

  6. 작동하지 않는 명령을 간단한 테스트 명령으로 바꾸면 작동합니다. echo "Hello world" > ~/Desktop/test.txt

  7. 컴퓨터에서 소리를 지르거나 맹세해도 아무런 효과가 없었습니다 (그러나 일시적으로 기분이 좋아졌습니다).


편집 1 :

여기 내 crontab 파일과 그것이 호출하는 스크립트가 있습니다.

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/

편집 2 :

명확히하기 위해 /var/log/auth.log대상 서버에 줄 Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root이 포함되어 있습니다. 더 이상 매분마다 cron을 로컬로 실행하지 않기 때문에 혼란 스럽지만 매분마다 새 항목이 서버 로그에 나타납니다. 모든 Crontab 파일서버의 사용자 (루트 포함)의 이 비어 있으며 아무 것도 수행하지 않습니다.

또한 사용자 '백업 전용'은 전용 SSH 키가 내 데스크탑 시스템에 복사 된 상태로 서버에서만 작성되었으며 제한된 권한으로 작성되었습니다. 명령을 수동으로 실행할 때 모든 것이 작동하기 때문에 이것이 갈 길이라고 가정합니다.

위에 게시 된 crontab 파일은 내 데스크탑 컴퓨터의 사용자 'tom'입니다. 내 의도는 사용자 '백업 전용'으로 서버에 로그인 해야하는 스크립트를 호출하는 것입니다. 방금 백업 스크립트를 실행하려고 시도했지만 성공적으로 연결되고 작동했습니다. 작동하지 않는 크론 작업을 작성한 동일한 사용자 인 사용자 'tom'으로 데스크탑에서 실행했습니다. 성공적인 로그인에 해당하는 서버 로그의 출력은 다음과 같습니다.

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only

3. 키 파일을 사용하여 작동하고 6. 또한 작동한다면, err ... 수신 측의 sshd 로그 파일은 무엇을 말합니까?
Jan

@Jan I getSep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Tom Brossman

그것은 잘못된 로그 라인이거나 ssh를 통해 연결하려는 사용자가 루트입니다 ... 또는 백업을 시작하는 머신의 것입니까?
1

1
Tom, 2 가지 질문 확인 첫 번째 의견에서 로그 라인에는 CRON [...]이 있지만 다음과 같이 표시 Sep 7 16:06:02 <hostname> sshd[6747]...됩니다. 이 로그 라인이 서버 에서 왔으며 올바른 라인 인지 100 % 긍정적 입니까? 게시 한 crontab은 백업 전용 ? 또한 ID 파일을 수동으로 추가하십시오.rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
Jan

1
또한 auth.logEdit 2에 게시 된 해당 줄 은 서버에서 실행되는 cron을위한 것이며 로그인 시도와 관련이 없습니다. tail -f /var/log/auth.logcron을 통해 스크립트를 실행하는 동안 서버에서 시도해 볼 수 있습니까 ? 또한 이것이 작동하는지 확실하지 않지만 더 많은 오류가 발생하는지 확인하기 위해 첫 번째 env명령 을 시도 할 수 rsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...있습니까?
Alaa Ali

답변:


15

명령 행에서 모든 것이 제대로 작동하므로 오류 Permission denied (publickey)는 SSH 부분이rsync 이 지정된 사용자 이름과 다른 ID 파일을 사용하고 .

에서 월의 코멘트 원래의 질문에, 우리는의 ID 파일을 지정할 수 있습니다 rsync사용하여 명령을 -e 'ssh -i /path/to/identity.file' ....

아래 명령을 사용하여 cron의 새로운 환경에서 시작하고 파일의 전체 경로를 지정하면 분명히 문제가 해결됩니다.

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"

나는 여전히이 발견에 관심이있다. 아마도 크론, 환경 변수가 최소이고 ssh-agent로 시작한다는 사실과 관련이 있습니다. 며칠 안에 동일한 시나리오를 설정하여 테스트하고 다시보고 할 것입니다.


1
당신은 당신이 실행을 의미합니까env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
qazwsx

@Problemania 무려 고정.
Alaa Ali

답변이 있지만 루트 cron 인 'sudo crontab -e'를 실행하고 있는지 궁금합니다. "백업"사용자로 로그인 한 상태에서 'crontab -e'를 수행하면 어떻게됩니까?
wlraider70

나는 당신이 질문을 한 사람에게 이것을 의미한다고 생각합니다. 그러나 그는 루트가 아닌 사용자 이름의 crontab을 사용하고 있었고 백업 사용자의 crontab을 사용하고 싶지 않다고 생각합니다.
Alaa Ali

사용자와 비슷한 스크립트를 실행하면 X11을 통해 ssh 키가 필요하므로 로컬 키 if 키가 필요하고 위의 파일과 올바른 소유자 및 권한이 있는지 확인하십시오.
Sverre

1

나는 단지 나를 바쁘게하는이 문제를 해결했다 ..

SSH에 대한 ID를 규정했지만 SSH를 통해 RSYNC에 연결할 수 없습니다. 이 유형"

그러나 나는 crontab이 루트와 다른 자체 환경을 가지고 있다고 설명하는 게시물을 읽었습니다. 이미 알고 있지만 SSH-AGENT를 사용할 때 SSH에 미칠 수있는 영향을 이해하지 못했습니다.

그러나 내 SSH 키 교환은 PassPhrase로 수행됩니다 ... 따라서 환경이 다르고 SSH를 통한 RSYNC가 입력 할 수없는 암호를 입력하면 => SSH 디버그 정보도 오류를 나타냅니다.

"debug1 : read_passphrase : / dev / tty를 열 수 없습니다 : 해당 장치 나 주소가 없습니다"=> 예 예 아니요 TTY = 암호 없음 = 허용되지 않습니다

내 컴퓨터에서 "키 체인"을 사용하여 SSH 에이전트를 시작하므로 원격 연결을 시도 할 때마다 암호를 다시 입력 할 필요가 없습니다. 키 체인은 다음 정보를 포함하는 파일을 생성합니다

SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; SSH_AUTH_SOCK 내보내기; SSH_AGENT_PID = 18893; SSH_AGENT_PID 내보내기;

==> SSH-AGENT 명령은 동일한 정보를 반환합니다.

결국, 이미 이전에 수행하고 암기했기 때문에 암호 문구를 입력 할 필요없이 현재 세션과 관련된 이러한 정보가 현재 세션의 향후 인증을 허용합니다 ...

==> 해결책이 있습니다 ... crontab에 의해 시작된 스크립트에서 충분하며이 정보가 포함 된 파일을 "소스"하거나 명령 행 ds crontab에 수행하면됩니다 ...

예 : 14 09 * * *. /home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh foo@my-server.fr :. >> / var / log / check_connexion.log 2> & 1 또는 SSH를 사용하여 연결을 시작하는 스크립트에서 "source /home/foo/keychain/foo.server.org-sh"명령을 사용하십시오.

=>이 소싱으로 더 이상 걱정할 필요가 없습니다. SSH_AUTH_SOCK 및 SSH_AGENT_PID의 정보는 Crontab 환경에로드되므로 알려진 RSYNC over SSH는 문제없이 작동합니다.

그것은 나를 바쁘게했지만 지금은 작동합니다 :)


1

SSH 에이전트 전달을 사용하는 사람들을위한주의 사항 :

원격 호스트에서 스크립트를 디버깅 할 때이 동작이 표시되면 -e "ssh -i /path/to/key"플래그를 사용 하더라도 ssh가 서버의 로컬 키 대신 로컬 (전달 된) 키를 사용하기 때문입니다.

구체적인 예 : dev 서버에 rsync over ssh를 사용하여 "데이터 서버"에서 데이터를 가져 오는 스크립트가 있습니다. dev 서버에 로그인하여 실행하면 모든 것이 잘되지만 cron에서 실행할 때 권한이 거부됩니다. SSH 프로세스 (flag -vv)에 자세한 정보를 추가 하면 다음을 알았습니다.

debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
debug1: Authentication succeeded (publickey).

여기서 나를 막은 것은 순전히 로컬 호스트 ( "nighty")와 dev 서버 ( "juanr")와는 다른 사용자 이름을 갖게된다는 것입니다.

이 방법이 dev 서버의 키를 "명시 적"으로 표시하지만 여전히 랩톱에서 전달 된 키를 사용하여 로그인합니다. ssh-copy-id이 시점에서을 수행하면 아무 것도 해결되지 않습니다. 단순히 전달 된 키가 개발자의 키가 아닌 다시 설치되기 때문입니다. 섬기는 사람. 에이전트 전달과 함께 ssh-copy-id를 사용하는 경우 -i 플래그로 설치할 키를 지정해야합니다 ssh-copy-id -i ~/.ssh/id_rsa.pub user@host.


0

호스트 파일을 정리하는 오래된 트릭을 이미 시도 했습니까? 내말은:

rm ~/.ssh/known_hosts

ssh가 그것을 재 구축하고 오래된 물건을 제거 할 때 시도해 볼 가치가 있습니다. 주어진 IP / 호스트에 속하는 부품을 제거 할 수도 있습니다.

추가 질문 : cron 작업이 UID에서 실행 중입니까, 아니면 사용자 cron 또는 루트로 실행 중입니까?


1
각 명령은 개별적으로 작동하므로 삭제 ~/.ssh/known_hosts가 어떻게 변경 되는지 알 수 없습니까? 그리고 cron은 데스크탑에서 내 사용자 'tom'으로 실행되며 사용자 tom 's에있는 해당 (암호가없는) SSH 키를 사용하여 서버에 사용자 '백업 전용'으로 로그인하려고합니다 ~/.ssh.
Tom Brossman

3
@ runlevel0 -r또는 -f플래그 모두 삭제하는 데 필요 known_hosts하지 않습니다. 디렉토리가 아닌 일반 파일이며 읽기 전용이 아닙니다. rm .ssh/known-hosts실수 사이에 공간을 추가 - 단일 문자 오타 점을 고려, 상당히 안전 할 것입니다 .ssh/known_hostsrm -rf(또는 rm -r일반적으로 사용자의 홈 폴더의 전체 내용을 삭제할 것)!
Eliah Kagan

안녕 Eliah, 정말로 훌륭한 포인트!! 나는 -rf 플래그를 반사 ​​동작으로 사용하지만 당신은 절대적으로 옳습니다. 나빠
runlevel0

0

rrsync다음과 같이 스크립트를 전용 ssh 키와 함께 사용하십시오 .

원격 서버

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

지역 컴퓨터

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub devel@10.10.10.83:/home/devel/.ssh

원격 컴퓨터

cat id_remote_backup.pub >> authorized_keys

새로 추가 된 줄 앞에 다음을 추가하십시오.

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

결과는 다음과 같습니다

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

현지

허가를 crontab받아 다음 스크립트를 작성 하십시오 x.

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP devel@10.10.10.83:/ /home/user/servidor 

출처 : http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/


0

이 방법으로 ssh 부분 "ssh -v"에 add를 시도하고 디버그하려면 몇 가지 유용한 정보를 사용하여 상세 모드를 얻을 수 있습니다.

편집 : 매뉴얼 페이지에서 :

-v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
             authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.

-1

sshd_config 파일을 올바르게 구성하지 않았다고 생각합니다. 있는지 확인 PermitRootLogin yes하고 PubkeyAuthentication yes 원격 유지.


1
루트로 로그인하지 않고 터미널에서 백업 명령을 ssh하고 실행할 수 있기 때문에 공개 키 인증 설정이 올바르게되어있을 것입니다.
Alaa Ali

1
충고에 감사드립니다. 그러나 나는 그것을 가능하게하지 않았고 PermitRootLogin그것을 바꿀 계획이 없습니다. 모범 사례는 비활성화하고 일반 사용자로만 ssh하고 (필요한 경우 'sudoers'에 추가) 루트로 절대 사용하지 않는 것입니다.
Tom Brossman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.