コマンドを実行した。エラーが出た。
Bad permissions. Try removing permissions for user: UNKNOWN\\UNKNOWN (Errno: 13 - Permission denied)
PowerShellからEC2へのSCPでファイルを転送しようとしたときのことだ。接続できない、というより「鍵のパーミッションに問題がある」というエラーだ。
このエラーはSSHキーのファイルパーミッションに関するものだ。
Linuxでは、SSHの秘密鍵は所有者だけが読めるパーミッション(600)でないといけない。他のユーザーに読める状態だと「安全でない」として弾かれる。
Windowsでも同じ発想だが、実装が違う。Windows標準のOpenSSHは「このキーファイルにアクセスできるユーザーが自分だけか」をチェックする。Dropboxフォルダに置いたpemキーは、Dropboxのプロセスや管理者アカウントが読める状態になっていて、チェックに引っかかっていた。
エラーメッセージのUNKNOWN\\UNKNOWNはWindowsがアクセス権を持つユーザーをうまく解決できなかったときの表示だ。
Windowsでこのエラーを解消するには、pemキーのACL(アクセス制御リスト)から不要なユーザーを削除する必要がある。
icacls "C:\Users\itoh\claude\dxgame\dxgame-key.pem" /inheritance:r /grant:r "$env:USERNAME:R"
このコマンドを実行すると自分だけがアクセスできるようになる。ただし、一時的にDropboxの同期が外れることがある。毎回確認が必要だ。
別の方法を試した。Bashツールから同じSCPコマンドを実行した。
成功した。
Claude CodeはWindowsのPowerShellとBashの両方を持っている。Bashはwsl(Windows Subsystem for Linux)またはGit Bashのsshクライアントを使う。これらはWindowsのACLチェックではなく、Linuxのパーミッションチェックで動作する。
Dropboxフォルダ内のpemキーは、Linuxの視点では「読める」状態だ。chmod 600に相当する状態かを確認するのではなく、読めるかどうかだけを見ている。
詳しく調べるより先に切り替えた方が速い、と判断した。
もう一つの問題が日本語パスだった。
転送元のパスはD:/シンプルシステム株式会社 Dropbox/伊藤勝彦/000claude/1cto/articles/だ。日本語が含まれる。
SCPのコマンドラインではパスをシングルクォートで括った。
scp -i 'C:/Users/itoh/claude/dxgame/dxgame-key.pem' -r \
'D:/シンプルシステム株式会社 Dropbox/伊藤勝彦/000claude/1cto/articles/' \
ubuntu@(サーバー):/home/ubuntu/1cto/articles_import/
日本語文字はUTF-8で扱われる。Bashのsshクライアントはこれを問題なく処理した。
Windowsで開発するときのSSH/SCP周りは、ツールの選択でつまずきやすい。
PowerShell標準のSSHクライアント、Git Bash、WSL、それぞれ挙動が微妙に違う。pemキーのパーミッション問題はPowerShellに固有のことが多い。日本語パスの問題はツールによって変わる。
毎回調べて解決するより、「これが動く」という組み合わせを覚えておく方が実用的だ。私の場合はBashツール(Git Bash経由のssh/scp)が信頼できる選択肢になっている。
問題が起きたら、まず別のツールで試す。それが最も早い解決策になることが多い。
次回は、インタビューエンジンが写真を2枚受け取れるようにした話を書く。
シンプルシステム株式会社 代表 伊藤勝彦