php中使用sftp教程

<?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);
(0)

相关推荐

  • php中使用sftp教程

    <?php /** php 中的sftp 使用教程 Telnet.FTP.SSH.SFTP.SSL (一) ftp 协议简介 FTP(File Transfer Protocol,文件传输协议)是互联网上常用的协议之一,人们用FTP实现互连网上的文件传输. 如同其他的很多通讯协议,FTP通讯协议也采用客户机 / 服务器(Client / Server )架构.用户可以通过各种不同的FTP客户端程序, 借助FTP协议,来连接FTP服务器,以上传或者下载文件FTP的命令传输和数据传输是通过不同的端口

  • iOS中SQLite使用教程

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快.SQLite第一个Alpha版本诞生于2

  • webpack中CommonsChunkPlugin详细教程(小结)

    本文介绍了webpack中CommonsChunkPlugin详细教程(小结),分享给大家,也给自己留个笔记,具体如下: 1.demo结构: 2.package.json配置: { "name": "webpack-simple-demo", "version": "1.0.0", "description": "", "main": "index.js&q

  • bmob js-sdk 在vue中的使用教程

    BmobSDK的引入 将bmob js-sdk放在static目录,然后在index.html页面中已 script 标签的形式引入,就可以在vue中全局使用bmob js-sdk <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="static/bmob-min.js">

  • Redis在springboot中的使用教程

    依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置文件如下: spring: redis: open: true # 是否开启redis缓存 true开启 false关闭 database: 0 host: 47.10

  • websocket在springboot+vue中的使用教程

    1.websocket在springboot中的一种实现 在java后台中,websocket是作为一种服务端配置,其配置如下 @Configuration public class WebSocketConfig { @Bean(name="serverEndpointExporter") public ServerEndpointExporter getServerEndpointExporterBean(){ return new ServerEndpointExporter()

  • animate.css在vue项目中的使用教程

    在vue项目中使用动画其实有多种方式,可以使用vue中的过渡transition,可以使用animate动画与transition配合使用,也可以单独使用animate动画库(详情可见vue官网-过渡:过渡),下面我们开始介绍在vue中单独使用animate动画,其实也非常简单,两步留可以实现: 第一步:安装: 在命令行中执行:npm install animate.css --save 第二步:引入及使用: main.js中: import animated from 'animate.css

  • vue.js中npm安装教程图解

    首先理清nodejs和npm的关系: node.js是javascript的一种运行环境,是对Google V8引擎进行的封装.是一个服务器端的javascript的解释器. 包含关系,nodejs中含有npm,比如说你安装好nodejs,你打开cmd输入npm -v会发现出啊线npm的版本号,说明npm已经安装好. 引用大神的总结: 其实npm是nodejs的包管理器(package manager).我们在Node.js上开发时,会用到很多别人已经写好的javascript代码,如果每当我们

  • 在Python IDLE 下调用anaconda中的库教程

    大家都知道,Anaconda是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.下载了anaconda我们可以很方便的随时调用这里面的库. 原先我自己在Python官网下载了python 3.7开发环境,anaconda的后面下载的,平时比较喜欢使用 IDLE 作简单的程序或学习的时候,发现调用不了anaconda中的库,就算是在cmd程序中使用pip 下载相应的库时,最终的库路径也是存于anaconda的库路径中. 当然,通过相关命令实现pip下载路

  • 如何在java中使用SFTP协议安全的传输文件

    本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.比如:我们购买的云服务器登陆的时候使用的协议都是ssh. ftp协议通常是用来在两个服务器之间传输文件的,但是它本质上是不安全的. 那么SFTP是什么?SFTP可以理解为SSH + FTP,也就是安全的网络文件传输协议. 一般来说,SFTP和FTP服务都是使用相应的客户端软

随机推荐