2013年5月15日

Cygwinからネットワークドライブ・シェアをアクセス

Windowsでネットワークドライブとしてマウントしてあるネットワークシェアは、Cygwinからは/cygdrive/<ドライブレター>としてアクセスできる(はず)。
h@cygwin:~$> ls -l /cygdrive
total 0
drwxrwxr-x+ 1 Administrators root     0 2013-05-14 04:13 c/
drwxrwxr-x+ 1 ????????       ???????? 0 2013-05-14 03:02 r/
ここは、//readynas312/backup-cygwin というNASのシェアをR:にネットワークドライブとしてマウントしてある。

ところで、このネットワークドライブ(シェア)はパス(UNC)を明示的に使ってアクセスすることもできる。
h@cygwin:~$> ls -l //readynas312
total 0
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 21:33 Backup/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-13 13:28 Documents/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 20:42 Music/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 20:42 Pictures/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-14 03:02 backup-cygwin/
-rw-r--r--  1 h        None     0 2006-11-30 16:00 backup-garlic

実はこのNASにはbackup-cygwin以外にも、上に見られるように
  • Backup
  • Documents
  • Music
  • Pictures
  • backup-cygwin
  • backup-garlic
というシェアがあるのだが、これらのうち、BackupDocumentsMusicPicturesは「guest」のオーナシップで誰でもアクセスでき、backup-cygwinbackup-garlicはそれぞれ同じ名前のアカウントがオーナである。ところが、backup-garlicはこのホスト(cygwin)からアクセスのためのクレデンシャルを設定していないので本来ならディレクトリに見えるはずが通常ファイルに見えている
 
ただしguestがオーナでないネットワークドライブが/cygdrive/<ドライブレター>あるいはUNCでアクセスできるのは、Cygwinの走るホスト上でローカルに実行した場合のみ

sshでリモートから同じことをしようとしても上手く行かない
h@linux:~$ ssh cygwin
Last login: Tue May 14 11:26:08 2013 from linux
Fanfare!!!
You are successfully logged in to this server!!!
h@
cygwin:~$> ls -l /cygdrive
total 0
drwxrwxr-x+ 1 Administrators root     0 2013-05-14 04:13 c/
h@cygwin:~$> ls -l //readynas312
total 0
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 21:33 Backup/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-13 13:28 Documents/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 20:42 Music/
drwxrwxr-x+ 1 ???????? ???????? 0 2013-05-09 20:42 Pictures/
-rw-r--r--  1 h        None     0 2006-11-30 16:00 backup-cygwin
-rw-r--r--  1 h        None     0 2006-11-30 16:00 backup-garlic
/cygdriveからはR:が消え、//readynas312上のguestがオーナでないシェアはディレクトリとして見えない。

sshでCygwinにログインすると、ネットワークシェアにアクセスクレデンシャルを渡せないようだ

そんならcronからはどうか、とジョブを登録してみたが、やはりクレデンシャルが必要な、guestがオーナでないシェアはディレクトリとして見えないようだ。残念!

Cygwinでパス名を扱うときはスラッシュの扱いに気をつけなければならない。通常、Linuxではスラッシュがいくつ重なっていても単一のスラッシュと同じに扱われ、例えば「//aa/bb/cc」と「/aa/bb/cc」は同じことで、「ルートディレクトリの中のディレクトリaaの下のサブディレクトリbbの下のcc」だが、CygwinではWindowsのUNCと同じ解釈をして「ホストaaのシェアbbのトップディレクトリcc」をアクセスしようとする(そして失敗してもLinux風の重複スラッシュ無視にはフォールバックしない)。実はここで使ったNETGEARのNASは、ssh経由のrsyncで外部パスを指定するとホスト名とファイルパスを無造作に「:/」で結合していたので、例えば「host」の「/dir」を指定すると「host://dir」がrsyncに渡され、「:」の後ろがそのままCygwinに渡されるのでUNCと解釈されおかしなことになっていた(バグとして修正済み)。

0 件のコメント:

コメントを投稿