이 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_hosts후 rm -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.