メモ > 技術 > プログラミング言語: PHP > SSHで接続する
SSHで接続する
PHPには ssh2_connect という命令が用意されているようだが、PHP自体の設定変更が必要なので敷居が高い。
PHPでリモートサーバー上のコマンドをsshで繋いで実行する
https://salumarine.com/running-command-on-remote-server-via-ssh-in-php/
代わりに、Compsoerを使うと比較的容易に接続できる。(内部では fsockopen が呼び出されているみたい。)
PHPでSSHとSFTP phpseclibの使い方
https://oopsoop.com/how-to-use-phpseclib/
以下のようにして、ライブラリを導入する。
$ composer require phpseclib/phpseclib
一例だが以下のようにすると、パスワード認証でSSH接続ができる。
<?php
require_once 'vendor/autoload.php';
use phpseclib3\Net\SSH2;
// 接続先の情報を設定
$host = '203.0.113.1';
$username = 'webmaster';
$password = 'abcd1234';
// SSH2の接続を試行
$ssh = new SSH2($host);
if (!$ssh->login($username, $password)) {
exit('Login Failed.');
}
// コマンドを実行
echo '<pre>';
echo $ssh->exec('ls -la /var/www/html');
echo '</pre>';
一例だが以下のようにすると、鍵認証でSSH接続ができる。
接続はIPアドレスでも可能。あわせてポート番号も変更している。
<?php
require_once 'vendor/autoload.php';
use phpseclib3\Net\SSH2;
use phpseclib3\Crypt\PublicKeyLoader;
// 接続先の情報を設定
$host = '203.0.113.1';
$port = '10022';
$username = 'ec2-user';
$key = PublicKeyLoader::load(file_get_contents('path/to/key.pem'));
// SSH2の接続を試行
$ssh = new SSH2($host, $port);
if (!$ssh->login($username, $key)) {
exit('Login Failed.');
}
// コマンドを実行
echo '<pre>';
echo $ssh->exec('ls -la /var/www/html');
echo '</pre>';
SSH接続は禁止されているが、SFTP接続は許可されている…という場合、以下のように接続する。
<?php
require_once 'vendor/autoload.php';
use phpseclib3\Net\SFTP;
// 接続先の情報を設定
$host = '203.0.113.1';
$port = '10022';
$username = 'webmaster';
$password = 'abcd1234';
// SFTPの接続を試行
$sftp = new SFTP($host, $port);
if (!$sftp->login($username, $password)) {
exit('Login Failed.');
}
// コマンドを実行
echo '<pre>';
echo $sftp->pwd();
echo '</pre>';
echo '<pre>';
print_r($sftp->rawlist('/var/www'));
echo '</pre>';
ディレクトリごとダウンロードはできないようなので、ファイル一覧をもとに一つずつダウンロードすることになりそう。
一例だが、以下のように処理できる。
$remote_dir = '/var/www/html';
$local_dir = './path/to/download';
$dir = $sftp->rawlist($remote_dir);
foreach ($dir as $entry) {
if ($entry['filename'] == '.' || $entry['filename'] == '..') {
continue;
}
if ($sftp->get($remote_dir . '/' . $entry['filename'], $local_dir . '/' . $entry['filename'])) {
echo '<p>' . $entry['filename'] . ' のダウンロードに成功しました。</p>';
} else {
echo '<p>' . $entry['filename'] . ' のダウンロードに失敗しました。</p>';
}
}
一例だが、以下のようにすればアップロードもできる。
if (!$sftp->put('/var/www/vhosts/xxx/test.txt', './test.txt', SFTP::SOURCE_LOCAL_FILE)) {
exit('Upload Failed.');
}
その他SFTPでの操作は、以下などが参考になりそう。
PHPでSSHとSFTP phpseclibの使い方
https://oopsoop.com/how-to-use-phpseclib/
PHPでSFTPに接続する方法
https://sftptogo.com/blog/jp/php-sftp-jp/