php7.3の環境下で、他のサーバにファイルを転送する要件をクリアするための備忘録です。
他サーバは、SSH2の鍵認証のみでの接続であったため、SCP接続かSFTP接続のみと言う条件で、
phpのssh2_connect()関数を使用してファイル転送を行うことにした。
ですが、下記エラーにてssh2のコネクションエラーが発生
PHP Fatal error: Uncaught Error: Call to undefined function ssh2_connect()
ssh2のextensionをインストールしないと使えないらしい。。。
ので、インストールから接続確認までを行っていきたいと思います。
今回は、ssh2接続に必要な「libssh2」と「ssh2」の2つをソースコードからインストールしてみたいと思います。
コンパイラやビルド用のライブラリをインストール
目次
まずはソースコードをコンパイルしたり、ビルドしたりする際に必要なライブラリをインストールします
[root@adan ~]# yum -y install make gcc glibc-devel zlib-devel openssl-devel
#php7.3用のphp-develをインストール
[root@adan ~]# yum -y install --enablerepo=epel,remi,remi-php73 php-devel
libssh2のダウンロード&インストール方法
プロトコルを実装するクライントサイドのCライブラリである「libssh2」のソースコードをダウンロードします。
本家LIBSSH2サイトへアクセスし、「Download」の場所にあるThe latest releaseにあるリンクを取得します。
2020年2月段階では、「libssh2.1.9.0.tar.gz」でした♪
[root@adan ~]# wget https://www.libssh2.org/download/libssh2-1.9.0.tar.gz
[root@adan ~]# tar vxzf libssh2-1.9.0.tar.gz
[root@adan ~]# cd libssh2-1.9.0
[root@adan ~]# ./configure
[root@adan ~]# make
[root@adan ~]# make install
PECLからsshのダウンロード&インストール
SSH2プロトコルを実装するlibssh2の機能へのバインディングを提供してくれるライブラリらしいです。
[root@adan ~]# wget https://pecl.php.net/get/ssh2-1.2.tgz
[root@adan ~]# tar vxzf ssh2-1.2.tgz
[root@adan ~]# cd ssh2-1.2
[root@adan ~]# phpize
[root@adan ~]# ./configure --with-ssh2
[root@adan ~]# make
[root@adan ~]# make install
Installing shared extensions: /usr/lib64/php/modules/
#その後、PHP7.3のextensionに認識させましょう
[root@adan ~]# echo "extension=ssh2.so" > /etc/php.d/ssh2.ini
[root@adan ~]# php -m | grep ssh2
ssh2
できた♪無事インストール完了っす♪
PHPプログラムから試してみる
vi test.php
<?php
//IPとポートは自前でご用意ください♪
$conn = ssh2_connect('xxx.xxx.xxx.xxx', '12345');
var_dump($conn);
die();
phpを実行してみて、サーバへつながるか確認
[root@adan ~]# php test.php
resource(4) of type (SSH2 Session)
つながったっぽい♪
ついでに、ファイル転送用のプログラムも書いてみます。
vi test.php
<?php
$host = "";
$port = 22;
$user = "";
$pub_key = ""; //公開鍵のパス
$pri_key = ""; //秘密鍵のパス
$from_file = "/home/adan/adan.json"; //転送する元ファイル
$to_file = "/home/yonaha/adan.json"; // 転送先のファイルパス
$conn = ssh2_connect($host, $port);
// $pubkey と $privkey は、ファイルパスを指定する
ssh2_auth_pubkey_file($conn, $user, $pub_key, $pri_key);
$ret = ssh2_scp_send($conn, $from_file, $to_file, 0644);
//ここでコネクション切らないとずっと繋ぎっぱなしになるらしい
ssh2_exec($conn, "exit");
unset($conn);
無事転送できたかは、各自ご確認よろしくお願い致します♪
プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報やエンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)、未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。
企業の情報やエンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)、未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。