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

ダブランとTRPGを愛する、社会不適合者ぎりぎりのweb会社員が、
仕事の技術碌を書き連ねたり夢を叶えようとしたり趣味にいそしんだりする場末のブログ。

HN 餅。
好きなポケモン ダブラン / バタフリー / ピンクの悪魔ラッキー / ナマコブシ
SV初見草縛りした人。ワタッコはいいぞ。

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

Web > PHP 2024年7月5日

どもです。
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)