ど素人から毛を生やす。<延>

ssh2_scp_send()でパーミッション0777が設定できなかった話。

Web > PHP 2024年7月5日(最終更新:4月前)

どもです。
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のユーザを同一にして親ディレクトリのパーミッションに従え??

それができれば苦労しないのが会社というものなんだよなあ!!
いやまあ本件はローカルネットワーク上の処置なのでヨシ!としておきましょ。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)