SFTP 클라이언트가 NFS 마운트 홈 디렉터리에서 파일 이름을 바꿀 수 없는 이유는 무엇입니까?

SFTP 클라이언트가 NFS 마운트 홈 디렉터리에서 파일 이름을 바꿀 수 없는 이유는 무엇입니까?

SSH를 SFTP 서버로 실행하는 Amazon Linux 인스턴스가 있습니다. 클라이언트가 로그인하고 NFS 마운트 디렉토리로 루트가 지정됩니다. 사용자는 파일을 읽고, 쓰고, 삭제할 수 있지만 파일 이름을 바꾸면 불특정 "프로토콜 오류"가 발생하면서 실패합니다.

내 파일의 복사본은 다음과 같습니다 sshd_config.

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 1024

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin prohibit-password
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

PasswordAuthentication yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

AcceptEnv LANG LC_*

# Subsystem sftp /usr/lib/openssh/sftp-server -u 0002
Subsystem sftp internal-sftp -l DEBUG -u 002 -d %u

UsePAM yes
Match Group sftpusers
    ChrootDirectory /autohome
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand internal-sftp -l DEBUG -u 002 -d %u

소스와 대상이 다른 파일 시스템에 있을 때 sftp rename이 작동하지 않는다는 참조를 본 적이 있지만 여기서는 그렇지 않습니다. 또한 하드 링크를 지원하지 않는 파일 시스템에서는 sftp rename이 작동하지 않는 것을 보았지만 NFS 서버(AWS File Storage Gateway)는 괜찮을 것이라고 생각합니다. 나는 헤매고 있으며 도움을 주시면 감사하겠습니다.

답변1

@Kenster의 팁 덕분에 이 문제를 발견했습니다. 설명서에 명시된 대로 AWS File Storage Gateway NFS 마운트가 하드 링크를 지원한다고 잘못 가정했습니다.특별히 정의된그러나 그것은 진실이 아니다.

나는 그것이 사실이라고 확신했기 때문에 결국 strace를 사용하여 시스템 호출을 추적하게 되었습니다. 서버에 SSH를 연결하는 동안 SFTP 클라이언트를 서버에 연결하는 경우 현재 SFTP 프로세스의 pid를 가져옵니다 ps -eaf | grep sftp. 그런 다음 strace를 사용하여 시스템 호출을 추적하고 다음을 사용하여 출력을 파일에 저장할 수 있습니다. strace -ff -p 2116 -o sftp_rename.log여기서 -ff는 하위 프로세스를 추적하고, -p는 pid, -o는 출력 파일입니다.

이렇게 하면 정말 보기 흉한 결과가 나올 것입니다. 하지만 제가 발견한 흥미로운 점은 다음과 같습니다.

write(7, "\0\0\0L\0\0\0\3\0\0\0Drename old \"/testuse"..., 80) = 80
lstat("/testuser/test/asdfasdf.txt", {st_mode=S_IFREG|0664, st_size=159, ...}) = 0
link("/testuser/test/asdfasdf.txt", "/testuser/test/as.txt") = -1 ENOTSUPP (Unknown error 524)

그런 다음 간단한 링크 명령을 사용하여 하드 링크를 생성하도록 테스트했지만 실패했습니다.

# ln asdfasdf.txt link.txt
ln: failed to create hard link ‘link.txt’ => ‘asdfasdf.txt’: Unknown error 524
#

이제 AWS 설명서로 돌아갑니다. 하지만 그게 전부는 아닙니다. 분명히 SFTP 이름 변경~ 할 것이다Paramiko와 같은 일부 구현별 공급업체별 고객과 협력합니다 CMD_EXTENDED.정말 파라미코:

    oldpath = self._adjust_cwd(oldpath)
    newpath = self._adjust_cwd(newpath)
    self._log(DEBUG, 'posix_rename({!r}, {!r})'.format(oldpath, newpath))
    self._request(
        CMD_EXTENDED, "[email protected]", oldpath, newpath
    )

모든 클라이언트가 이 옵션을 사용하도록 강제할 수 있는 방법은 없는 것 같지만 posix-rename적어도 무슨 일이 일어나고 있고 왜 일어나는지는 알고 있습니다.

관련 정보