4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPで公開鍵&秘密鍵を使用してSFTP接続する方法

Last updated at Posted at 2018-10-05

PHPで公開鍵&秘密鍵を使用してSFTP接続する方法

phpseclib というライブラリを使うこともできますが、
ライブラリを入れるほど複雑なことをしたい訳ではなく、
単純にファイルをアップロードするだけなら、
PHPの標準関数を使用して、以下のように実装できます。

    $conn = ssh2_connect($host, $port);
    $ret = ssh2_auth_pubkey_file($conn, $user, $pubkey, $privkey);
    // $pubkey と $privkey は、ファイルパスを指定する

    $sftp = ssh2_sftp($conn);

    $fp = fopen("ssh2.sftp://". (int)$sftp. $todir. $tofile, 'w+');
    $contents = file_get_contents($file);
    fwrite($fp, $contents);
    fclose($fp);

    ssh2_exec($conn, "exit");
    unset($conn);

(エラー処理などは割愛してます)

password認証を使用したサンプルはネット上にありましたが、
鍵認証のサンプルは見つからなかったので、誰かの参考になれば。

追記: SFTPコネクションのクローズ処理について

私の環境では、ssh_disconnectを実行するとSegmentation Faultになりました。
私以外にも同じような現象を報告している方がいます。
https://bugs.php.net/bug.php?id=73438

ssh_disconnectを使わない場合、以下のようにすることが多いようです。

    ssh2_exec($conn, "exit");
    unset($conn);

このようにした場合でも、プログラム終了時までセッションは張られたままですので気を付けましょう。

私はこの問題により、SFTPサーバのコネクション数を使い果たして、
だれもSFTPサーバに接続できなくなるという事態を引き起こしたことは秘密です。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?