SFTP経由でファイルへの変更をアップロードしようとするとPermission deniedエラーが発生しますが、同じユーザーとしてSSHを直接使用する場合は問題なく動作します。
アップロードしようとしているファイルは/srv/www/website/current/app/AppKernel.php
です(現在、このエラーはプロジェクト内のすべてのファイルに当てはまりますが、単純にするために1つのファイルを使用します)。
私の最初の呼び出しポートは、同じユーザーとしてサーバーにSSH接続し、権限が機能していることを確認することでした。
SSHでログインした後、自分が誰であるかを確認します
$ whoami
cp5w
ls -l
は、次の権限を明らかにします(関連する行に転送されます)
$ ls -l
-rwxrwxr-x 1 deploy nginx 1523 Nov 11 12:51 AppKernel.php
ファイルの所有者はdeploy
で、グループはnginx
です。ユーザーcp5w
がグループnginx
にいることを確認できます:
$ groups
opsworks nginx
理論的には、私はAppKernel.php
に書き込むことができるはずですか?それを試してみましょう:
$ tail -n 3 AppKernel.php
$loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
}
}
$ echo "# add line to end of file" >> AppKernel.php
$ tail -n 3 AppKernel.php
}
}
# add line to end of file
うん、うまくいきます。エラーはありません。私は怒っていません。
いくつかの可能な解決策は、提案します 親ディレクトリにグループ実行可能ファイルがあることを確認する これを次のように再確認しました(ここでも関連する行に切り詰めています)。
$ ls -l ..
drwxrwxr-x 6 deploy nginx 4096 Nov 11 15:31 app
システムが所有するディレクトリの問題 もチェックしましたが、子ディレクトリwebsite
にも取り組んでおり、プロジェクトの残りの部分と同じ権限パターンを共有しています。
deploy
が所有nginx
次に、ワークステーションからSFTPを使用してファイルをアップロード(別名:変更)します。同じユーザー。同じSSHキー。同じワークステーション。同じサーバー。同じファイルをターゲットにしています。 SSHではなくSFTPを使用してください。
psftp> open myserver
login as: cp5w
psftp> cd /srv/www/website/current/app
Remote directory is now /srv/www/website/releases/20151111145342/app
psftp> lcd C:\Users\chris\Source\website\app
New local directory is C:\Users\chris\Source\website\app
psftp> put AppKernel.php
/srv/www/website/releases/20151111145342/app/AppKernel.php: open for write: permission denied
何が出るの?!
考えるためのもう少し食べ物:
TODO:
[〜#〜]編集[〜#〜]
SSHログをチェックして、意味のある何かを追加できるかどうかを確認しました。これは、アップロードの試行によって発生した出力です(%のプレースホルダーで一部のデータが隠されています)。
$ tail -f /var/log/secure
Nov 11 17:46:58 %server% sshd[22455]: Accepted publickey for cp5w from %ip% port %port% ssh2: RSA %fingerprint%
Nov 11 17:46:58 %server% sshd[22455]: pam_unix(sshd:session): session opened for user cp5w by (uid=0)
Nov 11 17:46:58 %server% sshd[22455]: pam_unix(sshd:session): session closed for user cp5w
また、sshd_configを変更し、-l INFO
を次のように追加して、SFTPログを有効にしました。
Subsystem sftp internal-sftp -l INFO
/var/log/messages
を次のようにフォローしました:
$ tail -f /var/log/messages
Nov 11 18:06:57 %server% internal-sftp[23002]: session opened for local user cp5w from [%ip%]
Nov 11 18:06:57 %server% internal-sftp[23002]: opendir "/srv/www/."
Nov 11 18:06:57 %server% internal-sftp[23002]: closedir "/srv/www/."
Nov 11 18:06:57 %server% internal-sftp[23002]: open "/srv/www/website/current/app/AppKernel.php" flags WRITE,CREATE,TRUNCATE mode 0666
Nov 11 18:06:57 %server% internal-sftp[23002]: sent status Permission denied
Nov 11 18:06:57 %server% internal-sftp[23002]: session closed for local user cp5w from [%ip%]
中心的な問題は、SFTPサーバーが適切に接続を許可するためにSSHキー認証を必要とすることです。あなたはFileZillaで言及したので、私はこの答えをそのように書きました。
場合によっては、パスワードで保護されていないSSHキーにこれを使用できます。
Selinuxを実行していて、これが問題と関係があるのではないかと思います。 getenforceまたはsestatusは何を示していますか?強制を実行している場合、寛容に切り替えるとどうなりますか?
そうでない場合、あなたに代わってsftpがファイルの書き込みに使用しているユーザーアカウントをテストして証明できますか?原則としてcp5wである必要がありますが、それは実際のケースですか?
最後に、chrootがボールをプレーしていないことに気付くかもしれません。 chrootなしで動作しますか?
幸運を祈るウィルモットさん。