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
적어도 무슨 일이 일어나고 있고 왜 일어나는지는 알고 있습니다.