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サーバに接続できなくなるという事態を引き起こしたことは秘密です。