Memo

メモ > 技術 > プログラミング言語: 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 = '210.173.31.94'; $port = '9022'; $username = 'terraport'; $password = 'y7M30Whz'; // 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/

Advertisement