libfuse / sshfs

A network filesystem client to connect to SSH servers
GNU General Public License v2.0
5.86k stars 493 forks source link

Cannot browse directories with Finder that have accented names #116

Closed Jo-Con-El closed 4 years ago

Jo-Con-El commented 6 years ago

There's a weird interaction here with Finder and SSHFS where I cannot access a directory with an accented letter, but I can chdir into it from the command line.

SSHFS version 2.10 OSXFUSE 3.7.1 FUSE library version: 2.9.7 fuse: no mount point

On the command line it seems to work fine:

ender@dibdib:~$ uname -a
Darwin dibdib.local 17.2.0 Darwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64
ender@dibdib:~$ echo $LANG
en_US.UTF-8
ender@dibdib:~$ sshfs cowcow.mooooo.com:/srv/data ~/cowcow/
ender@cowcow.mooooo.com's password:
ender@dibdib:~$ cd cowcow/tmp/
ender@dibdib:~/cowcow/tmp$ ls -l
total 0
drwxrwxr-x  1 ender  501  0 Mar  5 15:57 Documentación
ender@dibdib:~/cowcow/tmp/Documentación$ touch dibdib
ender@dibdib:~/cowcow/tmp/Documentación$ l
total 0
-rwxr-xr-x  1 ender  501  0 Mar  5 15:57 dibdib

But when I use Finder and click on the Documentación directory under ~/cowcow/tmp/, I see an empty directory. If I put sshfs in debug mode, I get a No such file or directory error:

ender@dibdib:~$ sshfs cowcow.mooooo.com:/srv/data ~/cowcow/ -d -o debug
FUSE library version: 2.9.7
nullpath_ok: 0
nopath: 0
utime_omit_ok: 0
unique: 2, opcode: INIT (26), nodeid: 0, insize: 56, pid: 44470
INIT: 7.19
flags=0xf8000008
max_readahead=0x00100000
   INIT: 7.19
   flags=0x00000010
   max_readahead=0x00100000
   max_write=0x02000000
   max_background=0
   congestion_threshold=0
   unique: 2, success, outsize: 40
unique: 3, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 142
unique: 2, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 0
statfs /
getattr /
   unique: 2, success, outsize: 96
   unique: 3, success, outsize: 136
unique: 2, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 142
unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 55, pid: 84

[...stripped for clarity...]

[ CLICKED ON tmp/ ]

access /tmp 00
   unique: 21, success, outsize: 16
unique: 22, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 827
getattr /
   unique: 22, success, outsize: 136
unique: 12, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 12, success, outsize: 16
unique: 25, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 25, success, outsize: 96
unique: 14, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 827
getattr /
   unique: 14, success, outsize: 136
unique: 35, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 35, success, outsize: 16
unique: 36, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 36, success, outsize: 96
unique: 34, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 34, success, outsize: 16
unique: 6, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 6, success, outsize: 16
unique: 18, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 18, success, outsize: 16
unique: 16, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 16, success, outsize: 16
unique: 37, opcode: GETATTR (3), nodeid: 40, insize: 56, pid: 827
getattr /tmp
   unique: 37, success, outsize: 136
unique: 23, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 23, success, outsize: 16
unique: 28, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 28, success, outsize: 16
unique: 2, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 2, success, outsize: 16
unique: 5, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 5, success, outsize: 16
unique: 13, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 13, success, outsize: 16
unique: 4, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 4, success, outsize: 16
unique: 32, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 04
   unique: 32, success, outsize: 16
unique: 15, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 01
   unique: 15, success, outsize: 16
unique: 3, opcode: GETXATTR (22), nodeid: 40, insize: 77, pid: 827
getxattr /tmp com.apple.FinderInfo 32 0
   unique: 3, error: -45 (Operation not supported), outsize: 16
unique: 10, opcode: LOOKUP (1), nodeid: 6, insize: 46, pid: 827
LOOKUP /._tmp
getattr /._tmp
unique: 29, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 29, success, outsize: 16
unique: 26, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 26, success, outsize: 16
unique: 9, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 9, success, outsize: 16
   unique: 10, error: -2 (No such file or directory), outsize: 16
unique: 30, opcode: GETATTR (3), nodeid: 6, insize: 56, pid: 827
getattr 
unique: 33, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 33, success, outsize: 16
unique: 31, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 31, success, outsize: 16
unique: 19, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 19, success, outsize: 16
unique: 8, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 8, success, outsize: 16
unique: 20, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 20, success, outsize: 16
unique: 7, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 7, success, outsize: 16
unique: 17, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 17, success, outsize: 16
unique: 27, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 27, success, outsize: 16
unique: 11, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 02
   unique: 11, success, outsize: 16
unique: 24, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 04
   unique: 24, success, outsize: 16
unique: 21, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 01
   unique: 21, success, outsize: 16
unique: 22, opcode: GETXATTR (22), nodeid: 40, insize: 77, pid: 827
getxattr /tmp com.apple.FinderInfo 32 0
   unique: 22, error: -45 (Operation not supported), outsize: 16
   unique: 30, success, outsize: 136
unique: 12, opcode: ACCESS (34), nodeid: 6, insize: 48, pid: 827
access  00
   unique: 12, success, outsize: 16
unique: 25, opcode: LOOKUP (1), nodeid: 6, insize: 46, pid: 827
LOOKUP /._tmp
getattr /._tmp
   unique: 25, error: -2 (No such file or directory), outsize: 16
unique: 14, opcode: ACCESS (34), nodeid: 6, insize: 48, pid: 827
access  00
   unique: 14, success, outsize: 16
unique: 35, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 04
   unique: 35, success, outsize: 16
unique: 36, opcode: OPENDIR (27), nodeid: 40, insize: 48, pid: 827
opendir flags: 0x0 /tmp
   opendir[0] flags: 0x0 /tmp
   unique: 36, success, outsize: 32
unique: 34, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 827
getattr /
   unique: 34, success, outsize: 136
unique: 6, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 05
unique: 18, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
   unique: 6, success, outsize: 16
access / 00
   unique: 18, success, outsize: 16
unique: 16, opcode: READDIR (28), nodeid: 40, insize: 80, pid: 827
readdir[0] from 0
unique: 37, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 37, success, outsize: 16
unique: 23, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 23, success, outsize: 16
unique: 28, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 28, success, outsize: 16
unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 2, success, outsize: 16
unique: 5, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 5, success, outsize: 16
unique: 13, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 13, success, outsize: 96
unique: 4, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 16, success, outsize: 120
unique: 32, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 01
   unique: 32, success, outsize: 16
unique: 15, opcode: LOOKUP (1), nodeid: 40, insize: 55, pid: 827
LOOKUP /tmp/Documentación
getattr /tmp/Documentación
   NODEID: 41
   unique: 15, success, outsize: 160
unique: 3, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 3, success, outsize: 16
unique: 29, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 02
   unique: 29, success, outsize: 16
unique: 26, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 04
   unique: 26, success, outsize: 16
unique: 9, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 01
   unique: 9, success, outsize: 16
unique: 10, opcode: GETXATTR (22), nodeid: 41, insize: 77, pid: 827
getxattr /tmp/Documentación com.apple.FinderInfo 32 0
   unique: 10, error: -45 (Operation not supported), outsize: 16
unique: 33, opcode: LOOKUP (1), nodeid: 40, insize: 57, pid: 827
LOOKUP /tmp/._Documentación
getattr /tmp/._Documentación
   unique: 4, success, outsize: 96
   unique: 33, error: -2 (No such file or directory), outsize: 16
unique: 31, opcode: READDIR (28), nodeid: 40, insize: 80, pid: 827
   unique: 31, success, outsize: 16
unique: 19, opcode: READDIR (28), nodeid: 40, insize: 80, pid: 827
   unique: 19, success, outsize: 16
unique: 8, opcode: READDIR (28), nodeid: 40, insize: 80, pid: 827
   unique: 8, success, outsize: 16
unique: 20, opcode: GETATTR (3), nodeid: 40, insize: 56, pid: 827
getattr /tmp
   unique: 20, success, outsize: 136
unique: 7, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 05
   unique: 7, success, outsize: 16
unique: 17, opcode: RELEASEDIR (29), nodeid: 40, insize: 64, pid: 827
releasedir[0] flags: 0x0
   unique: 17, success, outsize: 16
unique: 27, opcode: GETATTR (3), nodeid: 40, insize: 56, pid: 827
getattr /tmp
   unique: 27, success, outsize: 136
unique: 11, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 01
   unique: 11, success, outsize: 16
unique: 24, opcode: LOOKUP (1), nodeid: 41, insize: 51, pid: 827
LOOKUP /tmp/Documentación/.localized
getattr /tmp/Documentación/.localized
   unique: 24, error: -2 (No such file or directory), outsize: 16
unique: 21, opcode: LOOKUP (1), nodeid: 40, insize: 51, pid: 827
LOOKUP /tmp/.localized
getattr /tmp/.localized
   unique: 21, error: -2 (No such file or directory), outsize: 16
unique: 22, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 04
   unique: 22, success, outsize: 16
unique: 30, opcode: LOOKUP (1), nodeid: 40, insize: 50, pid: 827
LOOKUP /tmp/.DS_Store
getattr /tmp/.DS_Store
   unique: 30, error: -2 (No such file or directory), outsize: 16
unique: 12, opcode: GETXATTR (22), nodeid: 40, insize: 92, pid: 827
getxattr /tmp com.apple.metadata:_kMDItemUserTags 0 0
   unique: 12, error: -45 (Operation not supported), outsize: 16
unique: 25, opcode: LOOKUP (1), nodeid: 6, insize: 46, pid: 827
LOOKUP /._tmp
getattr /._tmp
unique: 14, opcode: LOOKUP (1), nodeid: 40, insize: 50, pid: 827
LOOKUP /tmp/.DS_Store
getattr /tmp/.DS_Store
   unique: 14, error: -2 (No such file or directory), outsize: 16
   unique: 25, error: -2 (No such file or directory), outsize: 16
unique: 35, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 35, success, outsize: 16
unique: 36, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 36, success, outsize: 96
unique: 34, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827

[ CLICKED ON tmp/Documentación ]

access /tmp/Documentación 00
   unique: 34, success, outsize: 16
unique: 6, opcode: LOOKUP (1), nodeid: 40, insize: 56, pid: 827
LOOKUP /tmp/Documentación
getattr /tmp/Documentación
   unique: 6, error: -2 (No such file or directory), outsize: 16
unique: 18, opcode: LOOKUP (1), nodeid: 40, insize: 56, pid: 827
LOOKUP /tmp/Documentación
getattr /tmp/Documentación
   unique: 18, error: -2 (No such file or directory), outsize: 16
unique: 37, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 02
   unique: 37, success, outsize: 16
unique: 23, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 23, success, outsize: 16
unique: 28, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 02
   unique: 28, success, outsize: 16
unique: 2, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 02
   unique: 2, success, outsize: 16
unique: 5, opcode: GETATTR (3), nodeid: 41, insize: 56, pid: 827
getattr /tmp/Documentación
   unique: 5, success, outsize: 136
unique: 13, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 13, success, outsize: 16
unique: 16, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 16, success, outsize: 16
unique: 32, opcode: LOOKUP (1), nodeid: 40, insize: 56, pid: 827
LOOKUP /tmp/Documentación
getattr /tmp/Documentación
unique: 15, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 15, success, outsize: 16
unique: 3, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 3, success, outsize: 16
unique: 29, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 00
   unique: 29, success, outsize: 16
   unique: 32, error: -2 (No such file or directory), outsize: 16
unique: 26, opcode: GETATTR (3), nodeid: 40, insize: 56, pid: 827
getattr /tmp
   unique: 26, success, outsize: 136
unique: 9, opcode: LOOKUP (1), nodeid: 40, insize: 56, pid: 827
LOOKUP /tmp/Documentación
getattr /tmp/Documentación
   unique: 9, error: -2 (No such file or directory), outsize: 16
unique: 10, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 10, success, outsize: 16
unique: 4, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 00
   unique: 4, success, outsize: 16
unique: 33, opcode: GETATTR (3), nodeid: 6, insize: 56, pid: 827
getattr 
   unique: 33, success, outsize: 136
unique: 31, opcode: ACCESS (34), nodeid: 6, insize: 48, pid: 827
access  00
   unique: 31, success, outsize: 16
unique: 19, opcode: ACCESS (34), nodeid: 6, insize: 48, pid: 827
access  00
   unique: 19, success, outsize: 16
unique: 8, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 827
getattr /
   unique: 8, success, outsize: 136
unique: 20, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 20, success, outsize: 16
unique: 7, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 7, success, outsize: 16
unique: 17, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 01
   unique: 17, success, outsize: 16
unique: 27, opcode: ACCESS (34), nodeid: 6, insize: 48, pid: 827
unique: 11, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access  01
access / 00
   unique: 27, success, outsize: 16
   unique: 11, success, outsize: 16
unique: 24, opcode: ACCESS (34), nodeid: 40, insize: 48, pid: 827
access /tmp 01
   unique: 24, success, outsize: 16
unique: 21, opcode: ACCESS (34), nodeid: 41, insize: 48, pid: 827
access /tmp/Documentación 04
   unique: 21, success, outsize: 16
unique: 22, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 22, success, outsize: 16
unique: 30, opcode: GETXATTR (22), nodeid: 41, insize: 92, pid: 827
getxattr /tmp/Documentación com.apple.metadata:_kMDItemUserTags 0 0
   unique: 30, error: -45 (Operation not supported), outsize: 16
unique: 12, opcode: LOOKUP (1), nodeid: 40, insize: 57, pid: 827
LOOKUP /tmp/._Documentación
getattr /tmp/._Documentación
unique: 14, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 14, success, outsize: 16
unique: 25, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 25, success, outsize: 16
unique: 35, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 35, success, outsize: 16
unique: 36, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 827
access / 00
   unique: 36, success, outsize: 16
unique: 34, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 12, error: -2 (No such file or directory), outsize: 16
   unique: 34, success, outsize: 96
unique: 6, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 827
statfs /
   unique: 6, success, outsize: 96

I sent the output to a file and inspected it, and what I see is a UTF-8 string.

Thanks!

Nikratio commented 6 years ago

Thanks for the report, and apologies for not responding for so long! I am afraid I have no idea what to do here. I don't use MacOS and have no idea find Finder may be bothered by. So unless someone with Mac skills shows up to work on this, I'm afraid this won't be fixed..

Nikratio commented 6 years ago

@bfleischer Would you be able to help?

myxal commented 5 years ago

@Nikratio I'm probably having a similar issue as the reporter - I have a file with Japanese characters in the name. The name is displayed properly, but Finder won't make a preview, and won't properly launch associated application. Using the open command also results in "No such file or directory" error.

unique: 3, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 23366 access / 01 unique: 3, success, outsize: 16 unique: 4, opcode: ACCESS (34), nodeid: 13, insize: 48, pid: 23366 access /_michal 01 unique: 4, success, outsize: 16 unique: 6, opcode: ACCESS (34), nodeid: 169, insize: 48, pid: 23366 access /_michal/NicoVideo 01 unique: 6, success, outsize: 16 unique: 7, opcode: LOOKUP (1), nodeid: 169, insize: 133, pid: 23366 LOOKUP /_michal/NicoVideo/【Kagamine Rin & Len】Electric・Angel えれくとりっく・えんじぇぅ-720p.mp4 getattr /_michal/NicoVideo/【Kagamine Rin & Len】Electric・Angel えれくとりっく・えんじぇぅ-720p.mp4 unique: 7, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 169, insize: 133, pid: 23366 LOOKUP /_michal/NicoVideo/【Kagamine Rin & Len】Electric・Angel えれくとりっく・えんじぇぅ-720p.mp4 getattr /_michal/NicoVideo/【Kagamine Rin & Len】Electric・Angel えれくとりっく・えんじぇぅ-720p.mp4 unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 1064 statfs / unique: 5, success, outsize: 96

I suspect this may be due to Mac-specific unicode normalization requirements, see:

EDIT: More useful links regarding normalization on macOS:

What's interesting, is that using cp in Terminal works to copy the file over to local storage, and VLC can play the file as long as it's dragged into the app from Finder - using VLC' Open dialog doesn't work. Is there a way to determine what the actual (hexdump-style) file name is on server (Linux), client? I'm expecting to find a mismatch somewhere here.

Nikratio commented 5 years ago

You could try to add a few printf into sshfs.c, probably in the readdir handler function.

dbogdanov commented 5 years ago

Any updates on this? I am having the same problem

dbogdanov commented 5 years ago

This solution fixes my problem: https://github.com/osxfuse/osxfuse/issues/71#issuecomment-12762017

Nikratio commented 4 years ago

Seems this was an issue in osxfuse then, rather than SSHFS. Thanks for following up!