我使用 PHP 和 Curl 連接到 FTP 服務器,奇怪的是,當我在本地設置中嘗試我的代碼時,它以隱式 TLS 和顯式 TLS 方式工作,但是當我在任何服務器上運行相同的代碼時,它不會不工作并返回Connection refused。PHP代碼是:<?phpfunction simple_list_test() { $curlopts = []; $debug = true; $return = null; $curlopts[CURLOPT_USERPWD] = "{$user}:{$password}"; $curlopts[CURLOPT_SSL_VERIFYPEER] = false; $curlopts[CURLOPT_SSL_VERIFYHOST] = false; $curlopts[CURLOPT_FTP_SSL] = CURLFTPSSL_TRY; $curlopts[CURLOPT_FTPSSLAUTH] = CURLFTPAUTH_TLS; $curlopts[CURLOPT_RETURNTRANSFER] = true; $curlopts[CURLOPT_URL] = "ftp://ftp.avidafinance.com:21/"; // I tried with ftps:// protocol too it works on local but not when you run it on a hosting $curlopts[CURLOPT_FTPLISTONLY] = 1; $curlopts[CURLOPT_UPLOAD] = 0; $curlopts[CURLOPT_RETURNTRANSFER] = 1; $ch = curl_init(); foreach($curlopts as $key => $value) { curl_setopt($ch, $key, $value); } if ($debug) { curl_setopt($ch, CURLOPT_VERBOSE, true); $verbose = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verbose); } $return = curl_exec($ch); if ($debug) { rewind($verbose); $verboseLog = stream_get_contents($verbose); echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n"; } if ($error = curl_error($ch)) { throw new Exception($error); } return $return;}我花了一整天的時間,嘗試了很多方法,包括設置CURLOPT_PORT,設置ftps://協議,增加超時,包括服務器.crt和.pem帶有curl的證書,但沒有一個起作用,所以我想知道是否有人可以幫助我,簡而言之,我需要一個Explicit FTP Over TLS連接,我嘗試過curl, ftp_ssl_connect fsockets, .... 它們都不起作用,我將不勝感激任何幫助,它不一定必須與curl一起使用
3 回答

眼眸繁星
TA貢獻1873條經驗 獲得超9個贊
經過幾周的嘗試,我發現正如您在詳細信息中看到的那樣,連接和登錄工作正常,因為它們位于端口 21 上,但當涉及到目錄列表和上傳/下載時,因為 FTP 服務器使用的是他們的端口不同,它拒絕連接,這是由于我的托管提供商的防火墻不允許這些端口上的傳出連接,我要求他們打開端口范圍,問題解決了

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
讓我們總結一下這里的內容:
在主動模式 FTP 中,客戶端從隨機非特權端口 (N > 1023) 連接到 FTP 服務器的命令端口(端口 21)。
和
在被動模式 FTP 中,客戶端發起到服務器的兩個連接,解決了防火墻過濾從服務器到客戶端的傳入數據端口連接的問題。打開 FTP 連接時,客戶端會在本地打開兩個隨機非特權端口(N > 1023 和 N+1)。
由于非限制端口策略,這在您的計算機上有效,很高興知道這在服務器上不起作用,在服務器上您不能只是“開放端口”。
我有一個類似的問題,我用 Python ftputil 庫解決了這個問題。
- 3 回答
- 0 關注
- 211 瀏覽
添加回答
舉報
0/150
提交
取消