Raspberry Pi의 Debian Linux에서는 비밀번호를 제공할 필요가 없도록 ssh 키를 사용하여 Python 스크립트에서 rsync를 실행해 보았습니다. Python 스크립트를 서비스로 실행할 계획입니다. 내가 사용하는 스크립트 myScript.py에서
def syncImageFiles(remoteUser, src, dest):
runssh = f"'ssh -i /home/{remoteUser}/.ssh/id_rsa'"
syncCmd = ['rsync', '-zr', '--bwlimit=400', '--delete', '-e', runssh, src, dest]
subprocess.run(syncCmd)
...
syncImageFiles('pi', '[email protected]:/home/pi/images/', '/home/user1/images')
내 로컬 Raspberry Pi에서 스크립트를 실행하면 아래와 같이 user1로 로그인됩니다.
sudo python3 myScript.py
다음 오류가 발생합니다.
rsync: Failed to exec ssh -i /home/user1/.ssh/id_rsa: No such file or directory (2)
그러나 다음과 같이 명령줄에서 sudo로 rsync 명령을 실행하면
sudo rsync -zr --bwlimit=400 --delete -e 'ssh -i /home/user1/.ssh/id_rsa' [email protected]:/home/pi/images/ '/home/user1/images'
그것은 아주 잘 작동합니다. 전체 경로 /usr/bin/ssh를 제공하려고 시도했지만 소용이 없었습니다. 다음에 추가
fullCmd = ' '.join(syncCmd)
logging.info(fullCmd)
결과가 "sudo"를 제외하고 명령줄에 입력한 것과 정확히 일치하는지 확인했습니다. 그렇다면 내가 무엇을 놓치고 있는 걸까요?
업데이트: 다른 웹 검색에서 몇 가지 단서를 얻었습니다. 파일을 찾을 수 없음 오류가 발생하는 이유는 rsync가 -e 옵션에 전달된 전체 문자열을 파일로 처리하기 때문인 것 같습니다. 나는 syncCmd를 사용하여 subprocess.run()에 개별 인수를 제공하는 방법과 유사하게 -e 옵션이 개별 인수를 보도록 강제하는 방법이 필요하다고 생각합니다. 내 추측이 정확하다면 Python 포럼에 답변을 게시하는 것이 가장 좋습니다.