sshfs를 통한 git(idmap 포함): '.git/logs/HEAD'에 연결할 수 없습니다: 권한이 거부되었습니다.

sshfs를 통한 git(idmap 포함): '.git/logs/HEAD'에 연결할 수 없습니다: 권한이 거부되었습니다.

질문:

sshfs를 통해 마운트된 git 저장소가 있는데 다음 오류 메시지와 함께 변경 사항을 커밋할 수 없습니다.

fatal: cannot update the ref 'HEAD': unable to append to '.git/logs/HEAD': Permission denied

가능하니 참고해주세요

cp -a .git/logs/HEAD .git/logs/HEAD.bu
printf foo > .git/logs/HEAD
mv .git/logs/HEAD.bu .git/logs/HEAD

문제없지만

printf foo >> .git/logs/HEAD

또한 "권한이 거부되었습니다"를 표시했습니다.

질문:

내 로컬 컴퓨터에서 원격 저장소에 커밋하려면 어떤 구성을 변경해야 합니까?

내가 시도한 것:

위의 증상을 보면 파일 추가에 문제가 있는 것 같습니다. 내가 찾은SSHFS의 Git 저장소: '.git/logs/HEAD'에 연결할 수 없습니다: 잘못된 인수이는 다음을 가리킨다.https://github.com/libfuse/sshfs/issues/82제안된 문제(약간 다른 오류 메시지 참고)는 를 사용하여 해결할 수 있습니다 writeback_cache=no. 후자의 소스는 man다음 경고/해결 방법을 인용하는 페이지를 인용합니다.

CAVEATS / WORKAROUNDS
[...]
   O_APPEND
       When  writeback  caching is enabled, SSHFS cannot reliably support the O_APPEND open
       flag and thus signals an error on open.  To enable support for  unreliable  O_APPEND
       (which  may  overwrite  data if the file changes on the server at a bad time), mount
       the file system with -o unreliable_append.

그러나 이 섹션은 내 매뉴얼 페이지에 없습니다.

sshfs -V
SSHFS version 3.7.0
FUSE library version 3.9.1
using FUSE kernel interface version 7.31
fusermount3 version: 3.9.1

쓰기 저장 캐싱 기능을 비활성화하려고 시도한 것을 발견했습니다.실제로 삭제되었습니다(나중에는장애가 있는그리고다시 활성화 한 번 이상앞으로). 그래서 내 생각엔~해야 한다괜찮습니다. 하지만 분명히 (여전히) 문제가 있습니다.

제가 언급해야 할 또 다른 문제는 원격 시스템의 사용자 이름 및 ID가 로컬 시스템의 사용자 이름 및 ID와 일치하지 않으므로 해당 기능을 사용해야 한다는 것입니다 idmap.

해당 fstab항목은 다음과 같습니다.

<remote-user>@<remote-machine>: /mnt/ssh/<remote-machine>  sshfs  _netdev,user,idmap=user,allow_other  0 0

또한 내 /etc/fuse.conf내용에는

user_allow_other

배경:

답변을 피하려면 다음과 같이 하지 말라고만 말씀해 주세요.

  • 나는 Git이 어떻게 작동하는지 알고 있습니다.
  • 저장소를 로컬로 복제하고 커밋한 다음 SSH를 통해 원격 저장소로 푸시할 수 있다는 것을 알고 있습니다.

나는 왜 그것을 하지 않는가? - 원격 머신에서만 테스트할 수 있는 코드를 추적하고 있기 때문에 커밋하기 전에 반드시 테스트해보고 싶습니다. 따라서 어느 정도는 피해야 할 "단지" 편의상의 문제입니다.

  1. 로컬 복사본에서 코드를 편집합니다.
  2. 로컬 복사본에 대한 변경 사항을 커밋합니다.
  3. 원격 복제본으로 푸시합니다.
  4. SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
  5. 원격 시스템에서 코드를 테스트합니다.
  6. 다른 분기를 확인하세요(강제 푸시를 허용하려면).
  7. SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
  8. 코드를 편집하세요.
  9. 로컬 복사본에서 이전 커밋을 수정합니다.
  10. 원격 복제본으로 강제 푸시합니다.
  11. SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
  12. 강제로 밀린 분기를 확인하십시오.
  13. 만족스러울 때까지 5~11단계(7단계!)를 반복합니다.

대신에 나는 다음을 원한다:

  1. SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
  2. 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
  3. 원격 시스템에서 코드를 테스트합니다.
  4. 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
  5. 만족스러울 때까지 3~4단계(2단계!)를 반복합니다.
  6. SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
  7. 로컬 머신의 변경 사항을 원격 복제본에 커밋합니다.

원격 시스템에서 직접 제출하지 않는 이유는 무엇입니까? - 커밋에 서명하고 싶지만 개인 키를 원격 컴퓨터에 위임할 수 없기 때문입니다. 그래서 제가 생각할 수 있는 최선의 선택은 다음과 같습니다.

  1. SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
  2. 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
  3. 원격 시스템에서 코드를 테스트합니다.
  4. 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
  5. 만족스러울 때까지 3~4단계(2단계!)를 반복합니다.
  6. 원격 시스템의 원격 복사본에 대한 변경 사항을 커밋합니다.
  7. 다른 분기를 확인하세요(강제 푸시를 허용하려면).
  8. SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
  9. 원격 복사본에서 가져옵니다.
  10. 로컬 복사본에서 이전 커밋을 수정(서명)합니다.
  11. 원격 복제본으로 강제 푸시합니다.
  12. SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
  13. 강제로 밀린 분기를 확인하십시오.

그래서 한편으로는 이러한 추가 단계를 제거하고 싶습니다(기능 브랜치를 추가할 때 상황이 더 복잡해집니다. 왜냐하면 이러한 브랜치는 두 복제본 모두에서 제대로 확인되고 올바른 추적으로 구성되어야 하기 때문입니다). 왜 "그냥 작동"하지 않는지 이해하고 싶습니다(tm).


고쳐 쓰다:

후속 조치코멘트통과@투칸, 디버그 출력으로 오류를 재현했습니다.

  1. 디버그 출력을 사용하여 리모컨을 설치합니다.
 mount -o sshfs_debug MOUNTPOINT
SSHFS version 3.7.0
executing <ssh> <-x> <-a> <-oClearAllForwardings=yes> <-2> <USER@SERVER> <-s> <sftp>
USER@SERVER's password:
Server version: 3
Extension: versions <2,3,4,5,6>
Extension: [email protected] <1>
Extension: [email protected] <1>
Extension: [email protected] <2>
Extension: [email protected] <2>
Extension: [email protected] <1>
remote_uid = 0
  1. 다른 터미널에서 마운트된 공유에 액세스합니다.
cd MOUNTPOINT/DIR_WITH_WRITE_PERMISSIONS
[00002] LSTAT
  [00002]          ATTRS       45bytes (188ms)
  1. 정기적인 글쓰기 작업 확인:
echo foo > foobar
[00003] LSTAT
  [00003]         STATUS       38bytes (46ms)
[00004] LSTAT
  [00004]         STATUS       38bytes (32ms)
[00005] LSTAT
  [00005]          ATTRS       45bytes (242ms)
[00006] OPENDIR
  [00006]         HANDLE       29bytes (31ms)
[00007] READDIR
[00008] READDIR
  [00007]           NAME      668bytes (58ms)
[00009] READDIR
[00010] READDIR
  [00008]           NAME      483bytes (65ms)
[00011] READDIR
[00012] READDIR
  [00009]         STATUS       37bytes (27ms)
  [00010]         STATUS       37bytes (27ms)
[00013] CLOSE
[00014] LSTAT
  [00011]         STATUS       37bytes (27ms)
  [00012]         STATUS       37bytes (27ms)
  [00013]         STATUS       28bytes (26ms)
  [00014]         STATUS       38bytes (31ms)
[00015] OPEN
[00016] LSTAT
  [00015]         HANDLE       29bytes (153ms)
  [00016]          ATTRS       45bytes (158ms)
[00017] FSTAT
  [00017]          ATTRS       45bytes (29ms)
[00018] WRITE
  [00018]         STATUS       28bytes (28ms)
[00019] CLOSE
  [00019]         STATUS       28bytes (28ms)
  1. 연결하려고 하면 오류가 발생합니다.
echo bar >> foobar
[00020] LSTAT
  [00020]         STATUS       38bytes (74ms)
[00021] LSTAT
  [00021]         STATUS       38bytes (57ms)
[00022] LSTAT
  [00022]          ATTRS       45bytes (52ms)
[00023] OPENDIR
  [00023]         HANDLE       29bytes (53ms)
[00024] READDIR
[00025] READDIR
  [00024]           NAME      668bytes (68ms)
[00026] READDIR
[00027] READDIR
  [00025]           NAME      597bytes (77ms)
[00028] READDIR
[00029] READDIR
  [00026]         STATUS       37bytes (47ms)
[00030] CLOSE
  [00027]         STATUS       37bytes (47ms)
[00031] OPEN
[00032] LSTAT
  [00028]         STATUS       37bytes (47ms)
  [00029]         STATUS       37bytes (47ms)
  [00030]         STATUS       28bytes (26ms)
  [00031]         STATUS       43bytes (28ms)
  [00032]          ATTRS       45bytes (29ms)
zsh: permission denied: foobar

이것이 내 문제의 근본 원인을 찾는 데 도움이 되기를 바랍니다.


참고: 기준답변통과@devidas(몇 주 동안 필사적으로 관심을 끌고 노력한 후에도 솔루션이 부족함)해당 GitHub 문제에 교차 게시했습니다..

답변1

정말 크고 상세한 질문입니다. 이 문제를 단계별로 해결해 보겠습니다. 오류는 "권한이 거부되었습니다"입니다.

Linux error code
EACCES          13      /* Permission denied */

sshfs 저장소를 검색했을 때 EACCES파일에 두 개의 인스턴스만 있는 것을 발견했습니다.[sshfs.c][1]

하나는 로컬 컨텍스트의 파일 권한에 관한 것입니다. 당신이 보여준 것.

SSH_FX_PERMISSION_DENIED 다른 것들은 SSH 권한 거부로 인한 오류 입니다 .

제가 가지고 있는 데이터를 토대로 거의 확실하게 말할 수 있습니다. 로컬 컴퓨터에 대한 권한이 있는 경우

사례

printf foo >> .git/logs/HEAD

이는 대신 권한이 거부된 이유를 제공합니다.

printf foo > .git/logs/HEAD

원격 컴퓨터에 대한 권한이 없거나 참조된 O_APPEND원격 서버가 지원하지 않습니다.117호

strace를 사용하여 확인할 수 있습니다.

그 이유 부분입니다. 이 문제가 해결되는 방법은 귀하의 응답에 따라 다릅니다. 어떤 상황인가요?

더 많은 도움을 드릴 수 있도록 알려주세요.

동의하지 않으시면 자유롭게 댓글을 남겨주세요.

관련 정보