どもです。
PHPを使用してSFTP接続でディレクトリとファイルをパーミッション0777で設置。
$connection = ssh2_connect('192.168.00.00', 22);
if(ssh2_auth_password($connection, 'root', '*****')){
$sftp = ssh2_sftp($connection);
//ディレクトリの存在を確認
$stat = @ssh2_sftp_stat($sftp, '/directory/');
if($stat==false){
//ディレクトリがない場合、ディレクトリを設置
ssh2_sftp_mkdir($sftp, '/directory/', 0777);
}
//ファイルを設置
$put = @ssh2_scp_send($connection, './putFile.txt', '/directory/putFile.txt', 0777);
if(!$put) {
echo 'ファイルの設置に失敗しました。';
return false;
}
}else{
echo 'SSH接続ができません。';
return false;
}
ssh2_exec($connection, "exit");
これで、ディレクトリとファイルの設置が完了しました。
が、
パーミッション0777で設置したはずなのに、ファイル・ディレクトリの操作に制限がかかってしまいました。
ssh2_scp_send($connection, './putFile.txt', '/directory/putFile.txt', 0777);
↓
file_put_contents('ssh2.sftp://'.$sftp.'/directory/putFile.txt', file_get_contents('./putFile.txt'));
に変更してみましたが、これも結果は同じでした。
どうやらディレクトリ・ファイル共に設置階層のパーミッションが優先されてしまうよう。
今回の場合、0777パーミッションの/directory/が既存であれば、putFile.txtは0777で設置できます。
しかし/directory/が新規なら親ディレクトリのパーミッションに従って作成しまい、putFile.txtも0777で設置できなくなってしまうようです。
で、この問題の解決法がこちら。
$connection = ssh2_connect('192.168.00.00', 22);
if(ssh2_auth_password($connection, 'root', '*****')){
$sftp = ssh2_sftp($connection);
//ディレクトリの存在を確認
$stat = @ssh2_sftp_stat($sftp, '/directory/');
if($stat==false){
//ディレクトリがない場合、ディレクトリを設置
ssh2_sftp_mkdir($sftp, '/directory/');
//設置したディレクトリのパーミッションを強制変更
ssh2_sftp_chmod($sftp, '/directory/', 0777);
}
//ファイルを設置
$put = @ssh2_scp_send($connection, './putFile.txt', '/directory/putFile.txt', 0777);
if(!$put) {
echo 'ファイルの設置に失敗しました。';
return false;
}
}else{
echo 'SSH接続ができません。';
return false;
}
ssh2_exec($connection, "exit");
ssh2_sftp_mkdir()、ssh2_scp_send()はchmodにどうしても引き摺られてしまうため、生成したディレクトリ・ファイルに対して再度ssh2_sftp_chmod()を実行する。
これで0777の/directory/が生成でき、その下に0777のputFile.txtを設置できました。
え、そもそも0777はセキュリティ的に危険だから、PHPのユーザとSSH2のユーザを同一にして親ディレクトリのパーミッションに従え??
それができれば苦労しないのが会社というものなんだよなあ!!
いやまあ本件はローカルネットワーク上の処置なのでヨシ!としておきましょ。