libssh2 (C 庫) → php-ssh2 (PECL 擴展) → PHP 腳本調用 ssh2_* 函數
# CentOS/RHEL yum install -y gcc gcc-c++ make autoconf libtool openssl-devel # Ubuntu/Debian apt-get install -y build-essential autoconf libtool libssl-dev
cd /usr/local/src wget https://www.libssh2.org/download/libssh2-1.10.0.tar.gz tar xzf libssh2-1.10.0.tar.gz cd libssh2-1.10.0 ./configure --prefix=/usr/local/libssh2 make && make install
cd /usr/local/src
wget https://pecl.php.net/get/ssh2-1.3.1.tgz # 當前穩定版
tar xzf ssh2-1.3.1.tgz
cd ssh2-1.3.1
# 關鍵:指定 php-config 與 libssh2 路徑
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config \
--with-ssh2=/usr/local/libssh2
make && make install
# 查擴展目錄 /usr/local/php/bin/php-config --extension-dir # 輸出範例:/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902 # 複製 .so (make install 通常已自動複製,若無則手動) cp modules/ssh2.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/ # 修改 php.ini echo "extension=ssh2.so" >> /usr/local/php/etc/php.ini # 重啟 PHP-FPM systemctl restart php-fpm # 或舊版:/etc/init.d/php-fpm restart
/usr/local/php/bin/php -m | grep ssh2
# 輸出 ssh2 即成功
# 或寫測試腳本
php -r "var_dump(extension_loaded('ssh2'));"
| 錯誤 | 原因 | 修復 |
|---|---|---|
configure: error: The required libssh2 library was not found | libssh2 未安裝或路徑錯誤 | 確認 --with-ssh2 指向正確 prefix |
phpize: command not found | 未安裝 php-devel/php-dev | yum install php-devel 或 apt install php-dev |
undefined symbol: ssh2_sftp_init | libssh2 版本過舊 (< 1.2) | 升級 libssh2 ≥ 1.4.2 |
| 擴展不生效 | php.ini 載入錯誤或未重啟 FPM | php --ini 確認載入檔,重啟服務 |
# CentOS 7+ (EPEL) yum install -y epel-release yum install -y php-pecl-ssh2 # 自動處理依賴 # Ubuntu 20.04+ apt-get install -y php-ssh2 # Alpine apk add php8-pecl-ssh2
<?php
$conn = ssh2_connect('192.168.1.100', 22);
if (ssh2_auth_password($conn, 'root', 'password')) {
echo "SSH2 連線認證成功\n";
$stream = ssh2_exec($conn, 'uptime');
stream_set_blocking($stream, true);
echo stream_get_contents($stream);
} else {
echo "認證失敗\n";
}
?>
核心鏈路:libssh2 → phpize → configure(with-ssh2) → make install → php.ini → restart。生產環境優先用系統包管理器一鍵安裝,源碼編譯僅用於特定版本需求。