php中使用sftp教程


Posted in PHP onMarch 30, 2015
<?php 


/**
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功能要多一些,多了一些文件属性的设置

	
	*/
	


		
// 注意这里只是为了介绍ftp ,并没有做验证 ; 		
class ftp{
	
	// 初始配置为NULL
	private $config =NULL ;
	// 连接为NULL 
	private $conn = NULL;
	
	public function init($config){
	 $this->config = $config; 	
	}
	
	// ftp 连接 
	public function connect(){
		return $this->conn = ftp_connect($this->config['host'],$this->config['port'])); 
	}
	
	
	// 传输数据 传输层协议,获得数据 true or false 
  public function download($remote, $local,$mode = 'auto'){
	  return $result = @ftp_get($this->conn, $localpath, $remotepath, $mode);
  }
  
  // 传输数据 传输层协议,上传数据 true or false 
  public function upload($remote, $local,$mode = 'auto'){
	  return $result = @ftp_put($this->conn, $localpath, $remotepath, $mode);
  }
  
  
 	 // 删除文件 
	public function remove($remote){
	 return $result = @ftp_delete($this->conn_id, $file);
	}
  
	
}		



// 使用 
$config = array(
			'hostname' => 'localhost',
      'username' => 'root',
      'password' => 'root',
      'port' => 21

) ;
 
$ftp = new Ftp();
$ftp->connect($config);
$ftp->upload('ftp_err.log','ftp_upload.log');
$ftp->download('ftp_upload.log','ftp_download.log');



/*根据上面的三个协议写出基于ssh 的ftp 类
我们知道进行身份认证的方式有两种:公钥;密码 ;
(1) 使用密码登陆
(2) 免密码登陆也就是使用公钥登陆 

*/

class sftp{
	
	
	// 初始配置为NULL
	private $config =NULL ;
	// 连接为NULL 
	private $conn = NULL;

	
	// 是否使用秘钥登陆 
	 private $use_pubkey_file= false;
	
	// 初始化
	public function init($config){
		$this->config = $config ; 
	}
	
	
	// 连接ssh ,连接有两种方式(1) 使用密码
	// (2) 使用秘钥 
	public function connect(){
		
		$methods['hostkey'] = $use_pubkey_file ? 'ssh-rsa' : [] ; 
		$con = ssh2_connect($this->config['host'], $this->config['port'], $methods);
		//(1) 使用秘钥的时候 
		if($use_pubkey_file){
		// 用户认证协议
			 $rc = ssh2_auth_pubkey_file(
				$conn,
				$this->config['user'],
				$this->config['pubkey_file'],
				$this->config['privkey_file'],
				$this->config['passphrase']) 
			);
		//(2) 使用登陆用户名字和登陆密码
		}else{
			$rc = ssh2_auth_password( $conn, $this->conf_['user'],$this->conf_['passwd']);
      
		}
		
		return $rc ; 
	}
	
	
	// 传输数据 传输层协议,获得数据
	  public function download($remote, $local){
		  
		  return ssh2_scp_recv($this->conn_, $remote, $local);
	  }
	  
	 //传输数据 传输层协议,写入ftp服务器数据
	 public function upload($remote, $local,$file_mode=0664){
		  return ssh2_scp_send($this->conn_, $local, $remote, $file_mode);
		  
	 }
	 
	 // 删除文件 
	  public function remove($remote){
			$sftp = ssh2_sftp($this->conn_);
			$rc  = false;

    if (is_dir("ssh2.sftp://{$sftp}/{$remote}")) {
			$rc = false ;
			
			// ssh 删除文件夹
      $rc = ssh2_sftp_rmdir($sftp, $remote);
			} else {
		  // 删除文件
				$rc = ssh2_sftp_unlink($sftp, $remote);
			}
			return $rc;
			
		}
		 
 
 
	
}


$config = [
  "host"     => "192.168.1.1 ",   // ftp地址
  "user"     => "***", 
  "port"     => "22",
  "pubkey_path" => "/root/.ssh/id_rsa.pub",  // 公钥的存储地址
  "privkey_path" => "/root/.ssh/id_rsa",     // 私钥的存储地址
];

$handle = new SftpAccess();
$handle->init($config);
$rc = $handle->connect();
$handle->getData(remote, $local);
PHP 相关文章推荐
文章推荐系统(三)
Oct 09 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
php微信高级接口群发 多客服
Jun 23 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
PHP代码重构方法漫谈
Apr 17 PHP
Laravel find in set排序实例
Oct 09 PHP
php post换行的方法
Feb 03 PHP
PHP实现获取文件mime类型多种方法解析
May 28 PHP
基于PHP实现发微博动态代码实例
Dec 11 PHP
php计算一个文件大小的方法
Mar 30 #PHP
smarty模板引擎之内建函数用法
Mar 30 #PHP
PHP中实现Bloom Filter算法
Mar 30 #PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 #PHP
PHP中使用BigMap实例
Mar 30 #PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 #PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 #PHP
You might like
递归列出所有文件和目录
2006/10/09 PHP
一个php作的文本留言本的例子(二)
2006/10/09 PHP
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
js 走马灯简单实例
2013/11/21 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
python多线程编程中的join函数使用心得
2014/09/02 Python
python读取文件名并改名字的实例
2019/01/07 Python
python分布式编程实现过程解析
2019/11/08 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python 字符串池化的前提
2020/07/03 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
生物技术专业研究生自荐信
2013/09/22 职场文书
HR喜欢的自荐信格式
2013/10/08 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书