sudo로 실행되는 Python 스크립트에서 ssh를 사용할 때 rsync 오류 발생

sudo로 실행되는 Python 스크립트에서 ssh를 사용할 때 rsync 오류 발생

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 포럼에 답변을 게시하는 것이 가장 좋습니다.

관련 정보