当前位置:首页 > PHP教程 > php高级应用 > 列表

php中使用sftp教程

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-19 10:37:05 浏览: 评论:0 

这篇文章主要介绍了php中使用sftp教程,本文讲解了ftp 协议简介、ssh协议、sftp 协议等知识,并给出了FTP和SFTP操作类实现代码,需要的朋友可以参考下.

php 中的sftp 使用教程

Telnet、FTP、SSH、SFTP、SSL

(一) ftp 协议简介 

FTP(File Transfer Protocol,文件传输协议)是互联网上常用的协议之一,人们用FTP实现互连网上的文件传输。

如同其他的很多通讯协议,FTP通讯协议也采用客户机 / 服务器(Client / Server )架构。用户可以通过各种不同的FTP客户端程序,

借助FTP协议,来连接FTP服务器,以上传或者下载文件FTP的命令传输和数据传输是通过不同的端口进行传输的

FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服 务器建立连接前就要经过一个被广为熟知的"三次握手"的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠 的保证。

(二)ssh协议 

ssh 的全称为 SecureShell  ,可以报所有的传输数据惊醒加密,这样'中间人'就不能获得我们传输的数据,同事,传输的数据是经过压缩的,可以加快传输的速度.ssh有很多功能,可以替代telnet 也可也为ftppop ,提供一个安全的通道

SSH协议框架中最主要的部分是三个协议:

* 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;

* 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;

* 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用;

各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

(三)sftp 协议

使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议。区别:sftp是ssh内含的协议(ssh是加密的telnet协议),只要sshd服务器启动了,它就可用,而且sftp安全性较高,它本身不需要ftp服务器启动。 sftp = ssh + ftp(安全文件传输协议)。由于ftp是明文传输的,没有安全性,而sftp基于ssh,传输内容是加密过的,较为安全。目前网络不太安全,以前用telnet的都改用ssh2(SSH1已被破解)。sftp这个工具和ftp用法一样。但是它的传输文件是通过ssl加密了的,即使被截获了也无法破解。而且sftp相比ftp功能要多一些,多了一些文件属性的设置。

  1. // 注意这里只是为了介绍ftp ,并没有做验证 ;       
  2. class ftp{ 
  3.       
  4.     // 初始配置为NULL 
  5.     private $config =NULL ; 
  6.     // 连接为NULL  
  7.     private $conn = NULL; 
  8.       
  9.     public function init($config){ 
  10.      $this->config = $config;     
  11.     } 
  12.       
  13.     // ftp 连接  
  14.     public function connect(){ 
  15.         return $this->conn = ftp_connect($this->config['host'],$this->config['port']));  
  16.     } 
  17.       
  18.       
  19.     // 传输数据 传输层协议,获得数据 true or false  
  20.   public function download($remote$local,$mode = 'auto'){ 
  21.       return $result = @ftp_get($this->conn, $localpath$remotepath$mode); 
  22.   } 
  23.     
  24.   // 传输数据 传输层协议,上传数据 true or false  
  25.   public function upload($remote$local,$mode = 'auto'){ 
  26.       return $result = @ftp_put($this->conn, $localpath$remotepath$mode); 
  27.   } 
  28.     
  29.     
  30.      // 删除文件  
  31.     public function remove($remote){ 
  32.      return $result = @ftp_delete($this->conn_id, $file); 
  33.     } 
  34.     
  35.       
  36. }        
  37.  
  38.  
  39.  
  40. // 使用  
  41. $config = array
  42.             'hostname' => 'localhost'
  43.       'username' => 'root'
  44.       'password' => 'root'
  45.       'port' => 21 
  46.  
  47. ) ; 
  48.    
  49. $ftp = new Ftp(); 
  50. $ftp->connect($config); 
  51. $ftp->upload('ftp_err.log','ftp_upload.log'); 
  52. $ftp->download('ftp_upload.log','ftp_download.log'); 

根据上面的三个协议写出基于ssh 的ftp 类

我们知道进行身份认证的方式有两种:公钥;密码 ;

(1) 使用密码登陆

(2) 免密码登陆也就是使用公钥登陆

  1. class sftp{ 
  2.       
  3.       
  4.     // 初始配置为NULL 
  5.     private $config =NULL ; 
  6.     // 连接为NULL  
  7.     private $conn = NULL; 
  8.  
  9.       
  10.     // 是否使用秘钥登陆  
  11.      private $use_pubkey_file= false; 
  12.       
  13.     // 初始化 
  14.     public function init($config){ 
  15.         $this->config = $config ;  
  16.     } 
  17.       
  18.       
  19.     // 连接ssh ,连接有两种方式(1) 使用密码 
  20.     // (2) 使用秘钥  
  21.     public function connect(){ 
  22.           
  23.         $methods['hostkey'] = $use_pubkey_file ? 'ssh-rsa' : [] ;  
  24.         $con = ssh2_connect($this->config['host'], $this->config['port'], $methods); 
  25.         //(1) 使用秘钥的时候  
  26.         if($use_pubkey_file){ 
  27.         // 用户认证协议 
  28.              $rc = ssh2_auth_pubkey_file( 
  29.                 $conn
  30.                 $this->config['user'], 
  31.                 $this->config['pubkey_file'], 
  32.                 $this->config['privkey_file'], 
  33.                 $this->config['passphrase'])  
  34.             ); 
  35.         //(2) 使用登陆用户名字和登陆密码 
  36.         }else
  37.             $rc = ssh2_auth_password( $conn$this->conf_['user'],$this->conf_['passwd']); 
  38.         
  39.         } 
  40.           
  41.         return $rc ;  
  42.     } 
  43.       
  44.       
  45.     // 传输数据 传输层协议,获得数据 
  46.       public function download($remote$local){ 
  47.             
  48.           return ssh2_scp_recv($this->conn_, $remote$local); 
  49.       } 
  50.         
  51.      //传输数据 传输层协议,写入ftp服务器数据 
  52.      public function upload($remote$local,$file_mode=0664){ 
  53.           return ssh2_scp_send($this->conn_, $local$remote$file_mode); 
  54.             
  55.      } 
  56.        
  57.      // 删除文件  
  58.       public function remove($remote){ 
  59.             $sftp = ssh2_sftp($this->conn_); 
  60.             $rc  = false; 
  61.  
  62.     if (is_dir("ssh2.sftp://{$sftp}/{$remote}")) { 
  63.             $rc = false ; 
  64.               
  65.             // ssh 删除文件夹 
  66.       $rc = ssh2_sftp_rmdir($sftp$remote); 
  67.             } else { 
  68.           // 删除文件 
  69.                 $rc = ssh2_sftp_unlink($sftp$remote); 
  70.             } 
  71.             return $rc
  72.               
  73.         } 
  74.            
  75.    
  76.    
  77.       
  78.  
  79.  
  80. $config = [ 
  81.   "host"     => "192.168.1.1 ",   // ftp地址 
  82.   "user"     => "***",  
  83.   "port"     => "22"
  84.   "pubkey_path" => "/root/.ssh/id_rsa.pub",  // 公钥的存储地址 
  85.   "privkey_path" => "/root/.ssh/id_rsa",     // 私钥的存储地址 
  86. ]; 
  87.  
  88. $handle = new SftpAccess(); 
  89. $handle->init($config); 
  90. $rc = $handle->connect(); 
  91. $handle->getData(remote, $local);

Tags: php使用sftp

分享到: