php中使用sftp教程

2014-04-12  来源:本站原创  分类:php技巧  人气:1 

这篇文章主要介绍了php中使用sftp教程,本文讲解了ftp 协议简介、ssh协议、sftp 协议等知识,并给出了FTP和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);
相关文章
  • php中使用sftp教程 2014-04-12

    这篇文章主要介绍了php中使用sftp教程,本文讲解了ftp 协议简介.ssh协议.sftp 协议等知识,并给出了FTP和SFTP操作类实现代码,需要的朋友可以参考下 <?php /** php 中的sftp 使用教程 Telnet.FTP.SSH.SFTP.SSL (一) ftp 协议简介 FTP(File Transfer Protocol,文件传输协议)是互联网上常用的协议之一,人们用FTP实现互连网上的文件传输. 如同其他的很多通讯协议,FTP通讯协议也采用客户机 / 服务器(Clien

  • Swift使用Cocoa中的数据类型教程 2014-02-09

    这篇文章主要介绍了Swift使用Cocoa中的数据类型教程,Swift 会自动将一些 Objective-C 类型转换为 Swift 类型,以及将 Swift 类型转换为 Objective-C 类型,需要的朋友可以参考下 作为对 Objective-C 互用性(互操作性)的一部分,Swift提供快捷高效的方式来处理Cocoa数据类型. Swift 会自动将一些 Objective-C 类型转换为 Swift 类型,以及将 Swift 类型转换为 Objective-C 类型.在 Objecti

  • 用Python的pandas框架操作Excel文件中的数据教程 2014-08-28

    这篇文章主要介绍了用Python的pandas框架操作Excel文件中的数据教程,包括单位格式转换.分类汇总等基本操作,需要的朋友可以参考下 引言 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其他地方找到的复杂功能同等重要.作为额外的福利,我将会进行一些模糊字符串匹配,以此来展示一些小花样,以及展示pandas是如何利用完整的Python模块系统去做一些在Python中是简单,但在Excel中却很复杂的事情

  • PHP中PDO基础教程 入门级 2013-11-19

    PDO(PHP Data Object) 是PHP5新出来的东西,在PHP6中只默认使用PDO来处理数据库,我们只有与时俱进学习PDO相关知识.本文只是入门级基础教程. PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll.php_pgsql.dll.php_mssql.dll.php_sqlite.dll等等扩展来连接MySQL.PostgreSQL.MS SQL Server.SQLi

  • 在Win2003中安装bind教程(部署智能DNS) 2014-08-03

    有些公司技术力量薄弱一些,一直在用windows系统,所以本文从windows出发,安装bind,利用它的view功能,做智能DNS,解决双线机房南北电信联通访问问题 前言: 搞LINUX的朋友都知道,bind是linux下的DNS服务软件,但很多人不清楚,它也可以运行在windows系统中,windows系统自带的dns,功能弱,是不能作智能DNS解析的,在windows 2008 R2版也没有解决这个问题,有些公司技术力量薄弱一些,一直在用windows系统,所以本文从windows出发,安

  • JavaScript 中的事件教程 2015-04-04

    事件是可以被JavaScript侦测到的行为. 事件 JavaScript使我们有能力创建动态页面.事件是可以被JavaScript侦测到的行为. 网页中的每个元素都可以产生某些可以触发JavaScript函数的事件.比方说,我们可以在用户点击某按钮时产生一个onClick事件来触发某个函数.事件在HTML页面中定义. 事件举例: 鼠标点击 页面或图像载入 鼠标悬浮于页面的某个热点之上 在表单中选取输入框 确认表单 键盘按键 注意:事件通常与函数配合使用,当事件发生时函数才会执行. 如果需要更全

  • 精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程 2013-11-26

    当你想在有限的页面空间内展示多个内容片段的时候,手风琴(Accordion)效果就显得非常有用,它可以帮助你以对用户非常友好的方式实现多个内容片段之间的切换.借助流行的 jQuery 框架,只需很少的代码就可以实现精美的手风琴效果,帮助你的网站吸引更多用户的眼球 当你想在有限的页面空间内展示多个内容片段的时候,手风琴(Accordion)效果就显得非常有用,它可以帮助你以对用户非常友好的方式实现多个内容片段之间的切换.借助流行的 jQuery 框架,只需很少的代码就可以实现精美的手风琴效果,帮助

  • 在Linux上安装Python的Flask框架和创建第一个app实例的教程 2014-01-02

    这篇文章主要介绍了在Linux上安装Python的Flask框架和创建第一个app实例,包括创建一个HTML模版和利用Jinja2模板引擎来做渲染的步骤,需要的朋友可以参考下 无论你在linux上娱乐还是工作,这对你而言都是一个使用python来编程的很好的机会.回到大学我希望他们教我的是Python而不是Java,这学起来很有趣且在实际的应用如yum包管理器中很有用. 本篇教程中我会带你使用python和一个称为flask的微型框架来构建一个简单的应用,来显示诸如每个进程的内存使用,CPU百分

  • 30个不可思议的Photoshop教程 2014-03-14

    我们都说艺术家的内心有着深不可知的梦境.如果说摄影师可以让时间停止,那么设计师都是超意识的去感知平常人未知的世界.在他们内心看到的是各种无法想象.这样的人从人类的开始就已经存在,他们记录现实想象未来,在深邃的山洞峭壁上展现无法想象的思绪.而对于现在,科技让设计师插上翅膀,各种软硬设配让设计师的梦境一一呈现.即使世界在瞬息万变中已经让人感叹,但是未来在艺术家的手下描绘出来的是另一般色彩斑斓.我知道还有很多人在试图将自己内心描绘出来,这就好似每天早醒后朦胧的梦境,你能感觉到场景却转眼被抹去记忆.有过

  • RUBY 新手教程 跟我一起学ruby 2014-07-26

    从今天起我就要开始学Ruby了.怎么样,没见吧?一个新人写教程.就凭我坚强的毅力,科学的自学方法,以及我的钻研精神,我有信心学通Ruby,而同样是新手的你也可以! 跟我一起学ruby By Tiger 注:本教程转载自在游戏先行者论坛,版权属于作者Tiger. 第一篇 第二篇 第一篇 自序 从今天起我就要开始学Ruby了.怎么样,没见吧?一个新人写教程.就凭我坚强的毅力,科学的自学方法,以及我的钻研精神,我有信心学通Ruby,而同样是新手的你也可以!由于本教程是菜鸟教莱鸟若有什么不对的地方还请前

  • 简单的Python的curses库使用教程 2014-08-25

    这篇文章主要介绍了简单的Python的curses库使用教程,来自IBM官方开发者技术文档,需要的朋友可以参考下 curses 库 ( ncurses ) 提供了控制字符屏幕的独立于终端的方法.curses 是大多数类似于 UNIX 的系统(包括 Linux)的标准部分,而且它已经移植到 Windows 和其它系统.curses 程序将在纯文本系统上.xterm 和其它窗口化控制台会话中运行,这使这些应用程序具有良好的可移植性. 介绍 curses Python 的标准 curses 提供了"玻

  • Python利用多进程将大量数据放入有限内存的教程 2014-09-20

    这篇文章主要介绍了Python利用多进程将大量数据放入有限内存的教程,使用了multiprocessing和pandas来加速内存中的操作,需要的朋友可以参考下 简介 这是一篇有关如何将大量的数据放入有限的内存中的简略教程. 与客户工作时,有时会发现他们的数据库实际上只是一个csv或Excel文件仓库,你只能将就着用,经常需要在不更新他们的数据仓库的情况下完成工作.大部分情况下,如果将这些文件存储在一个简单的数据库框架中或许更好,但时间可能不允许.这种方法对时间.机器硬件和所处环境都有要求. 下

  • CAS单点登录完整教程 2011-06-28

    http://www.wsria.com/archives/1349 一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat6.0.29 JDK6 CAS Server版本:cas-server-3.4.3.1 CAS Client

  • openwrt编译基本教程 2011-07-26

    openwrt编译基本教程 其实和重新编译linux核心差不多,对于新手来说最麻烦的恐怕是安装开发环境需要的软件了. 条件:1.PC一台,性能强点,性能好编译得就快.安装ubuntu 8.04中文版.(也可以装在虚拟机里) 2.宽带一条,需要速度好点,因为有很多软件包是网络下载后安装. 3.耐心和时间. 编译流程: 1.安装好ubuntu8.04中文版本,搞定网络连接. 以非root用户登陆,打开"应用程序----附件----终端". 2.开发环境安装. 需要的软件有gcc g++ b

  • 咖啡兔的单点登录教程 2011-11-09

    转载一下|http://www.wsria.com/archives/1349,怕消失了 一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat6.0.29 JDK6 CAS Server版本:cas-server-3.4.3.1.

  • CAS单点登录教程 2013-04-17

    一.教程说明 前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat6.0.29 JDK6 CAS Server版本:cas-server-3.4.3.1.cas-server-3.4.10 CAS Client版本:cas-client-

  • 在Linux系统中部署Goagent 2013-10-16

    Goagent的项目主页在googlecode:http://code.google.com/p/goagent/ 首页有Windows系统中的部署教程,Linux系统中的部署方法有些复杂,记录如下. 1.申请一个Google Appengine:http://code.google.com/intl/zh-CN/appengine/,并且创建一个appid. 2.下载Python版的Google App Engine SDK,下载页面:http://code.google.com/intl/z

  • 回顾社交游戏公司Zynga创业史(四) 2014-01-11

    更加成熟的Pincus? 当Zynga文化变得越加成熟之时,Pincus亦然.他并不像是<FarmVillains>(游戏邦注:佐治亚州技术教授Ian Bogost在SF Weekly发表的一篇文章)描写的那般"邪恶",我们可以发现Zynga的很多员工都是来自于其早前初创公司Support.com.如果他并不是一位好老板,怎么还会有如此多的人愿意追随他?(请点击此处阅读第一.第二.第三部分) mark-pincus(from businessinsider.com) 而对于

  • 利用Python绘制MySQL数据图实现数据可视化 2014-01-17

    这篇文章主要介绍了利用Python绘制MySQL数据图实现数据可视化,其中包括Python与MySQL的连接搭建.用Python执行MySQL语句查询等内容,需要的朋友可以参考下 本教程的所有Python代码可以在网上的IPython notebook中获取. 考虑在公司里使用Plotly?可以看一下Plotly的on-premises企业版.(注:On-premises是指软件运行在工作场所或公司内部,详见维基百科) 注意操作系统:尽管Windows或Mac用户也可以跟随本文操作,但本文假定你

  • 零基础写Java知乎爬虫之先拿百度首页练练手 2015-01-07

    本来打算这篇文章直接抓取知乎的,但是想想还是先来个简单的吧,初级文章适合初学者,高手们请直接略过 上一集中我们说到需要用Java来制作一个知乎爬虫,那么这一次,我们就来研究一下如何使用代码获取到网页的内容. 首先,没有HTML和CSS和JS和AJAX经验的建议先去W3C(点我点我)小小的了解一下. 说到HTML,这里就涉及到一个GET访问和POST访问的问题. 如果对这个方面缺乏了解可以阅读W3C的这篇:<GET对比POST>. 啊哈,在此不再赘述. 然后咧,接下来我们需要用Java来爬取一个