需要解決的問題:本地檔案搬移至遠端伺服器
前提:在linux伺服器之間拷貝
以下作為備忘和整理記錄下來
因為在linux上拷貝檔案,同事提醒用scp來做,搜尋php scp之後發現php官方提供了使用scp向遠端伺服器拷貝檔案以及相應的ssh連線方法。
使用方法如下:
$ip = ***;
$port = ***;
$user = ***;
$pass = ***;
$material_path = 'material_api.txt';
$target_path = '/data/aa/a';
$connection = ssh2_connect($ip, $port);
ssh2_auth_password($connection, $user, $pass);
$sftp = ssh2_sftp($connection);
$result = ssh2_scp_send($connection, $material_path, $target_path."/".$material_path, 0777);
echo "拷貝檔案結果".$result."\n";
測試以上方法,報錯call to undefined function ssh2_connect()
檢查需要在伺服器上安裝ssh擴充套件,需要libssh2、ssh2。
安裝擴充套件之後,測試上面**成功。
程式報錯
failed
copying file
多次嘗試都失敗,換為demo中的txt檔案,執行成功。
猜測是檔案型別或檔案大小的原因。
檢視檔案系統,複製的檔案大小小於實際檔案。
檢視官方**的說明,沒有對ssh2_scp_send方法的傳輸檔案的大小的說明。
再查網上只找到乙個類似情況的提問,說遇到大檔案的時候,拷貝檔案失敗。
後來在php官網看到使用者貢獻的使用方法中提到使用fopen、fwrite作為替代,方法如下:
方法使用spc命令直接向遠端伺服器拷貝檔案。<?php
$srcfile = '/var/tmp/dir1/file_to_send.txt';
$dstfile = '/var/tmp/dir2/file_received.txt';
// create connection the the remote host
$conn = ssh2_connect('my.server.com', 22);
// create sftp session
$sftp = ssh2_sftp($conn);
$sftpstream = @fopen('ssh2.sftp://'.$sftp.$dstfile, 'w');
try
$data_to_send = @file_get_contents($srcfile);
if ($data_to_send === false)
if (@fwrite($sftpstream, $data_to_send) === false)
fclose($sftpstream);
} catch (exception $e)
?>
後來在程式中打上log,發現拷貝大檔案的時候程式執行到@file_get_contents($srcfile)就不向下執行,但也沒有錯誤資訊。
猜測file_get_contents()方法將檔案內容讀為乙個字串,當檔案大小比較大時,方法處理時會有問題。
$user = ***;
$ip = ***;
$source_path= 'material_api.txt';
$target_path = '/data/aa/a';
$dest = $user."@".$ip.":".$target_path."/".$source_path;
exec("scp ".$source_path." ".$dest , $output, $return);
測試上述**發現執行時,需要身份驗證。
再通過資料查詢建立了server1和server2之間的信任關係,使server1向server2執行scp不再需要每次都輸入密碼。
再測試以上**,當拷貝成功的時候$return=0;失敗的時候$return=1,完成了本地檔案向遠端伺服器拷貝檔案的要求。
ps:後期查詢資料發現,對於file_get_contents(filename, use_iclude_path,context,offset,maxlen)讀取大檔案時,也許能夠通過引數offset(檔案讀取的起始位置)、maxlen(讀取的最大長度)的設定來分段讀取檔案。
如何在server1和server2之間建立信任關係不在這裡說明,會另外說明。
伺服器遠端拷貝檔案
有多台伺服器a b c,每台伺服器的程式每小時都生成大量的日誌檔案,日誌處理程式部署在伺服器a,伺服器b和c生成的日誌需要拷貝到遠端伺服器a上處理。那麼b和c生成的日誌檔案如何以小時為單位拷貝到遠端伺服器上呢?常用方法有ftp和scp,這裡主要敘述scp secure copy 的使用。scp的命令...
Git轉殖遠端倉庫與本地檔案上傳至新建倉庫
在轉殖之前,git黑視窗 git bash 目錄一定要先進入到想要轉殖的目標空資料夾內。下面以轉殖github中的bob使用者的rep倉庫為例 git clone 在上傳之前,git黑視窗 git bash 目錄一定要先進入到想要上傳的目標資料夾內。建立乙個空的遠端倉庫,如github 將本地目錄初...
本地檔案上傳到遠端伺服器
win7下 用putty好像不太行。用securecrt非常方便。步驟如下 2 輸入rz,點enter 3 會彈出對話方塊,選擇要上傳的檔案 4 上傳,會顯示百分比 速率和時間等資訊。前段時間裝了ubuntu,不再使用win7了.所以想起來要更新下這篇文章.ubuntu下,我喜歡用的工具是termi...