• 使用php curl用私钥连接到sftp


    使用php curl用私钥连接到sftp

    I need to write a php script that can connect to a sftp server, get the list of the directories and files in the server, and later download a specific file. I was given the ppk file (I assume this is the private key authentication file) for the authentication part.

    I read in a few places that curl can do this.. but I'm not entirely sure how to do it. I tried copy pasting the code from here but my understanding was the code utilizes public keyfile instead of private key.

    So here's what I tried to connect to the sftp server

    1.  
      $ch = curl_init();
    2.  
      curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    3.  
      curl_setopt($ch, CURLOPT_URL, 'sftp://233.42.20.115/');
    4.  
      curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
    5.  
      curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE,'megpxl_private.ppk');
    6.  
      curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES,CURLSSH_AUTH_AGENT);
    7.  
      $output = curl_exec ($ch);
    8.  
      print_r($output);

    The output prints nothing.. so what should I do to actually connect to this sftp properly?

    ====Update==== Now I'm trying to use phpseclib. Here's my code:

    1.  
      require_once 'phpseclib/Net/SSH2.php';
    2.  
      require_once 'phpseclib/Net/SFTP.php';
    3.  
      require_once 'phpseclib/Crypt/RSA.php';
    4.  
      require_once 'phpseclib/Crypt/RC2.php';
    5.  
      require_once 'phpseclib/Crypt/RC4.php';
    6.  
      require_once 'phpseclib/Math/BigInteger.php';
    7.  
       
    8.  
      set_include_path('phpseclib/Net/');
    9.  
       
    10.  
      $privatekey = file_get_contents('sftp_private.txt');
    11.  
       
    12.  
      $rsa = new Crypt_RSA();
    13.  
      $rsa->loadKey(file_get_contents("private.ppk"));
    14.  
      $sftp = new Net_SFTP('233.12.20.225', 22);
    15.  
      if (!$sftp->login("myUserName", $rsa)) {
    16.  
      exit('Login Failed');
    17.  
      }
    18.  
      print_r($sftp);

    But all I got was this message:

    No compatible server to client encryption algorithms found in /var/www/html/phpseclib/Net/SSH2.php on line 1375
    

    =============Update: This works!=================

    1.  
      require_once 'phpseclib/Net/SSH2.php';
    2.  
      require_once 'phpseclib/Net/SFTP.php';
    3.  
      require_once 'phpseclib/Crypt/RSA.php';
    4.  
      require_once 'phpseclib/Math/BigInteger.php';
    5.  
       
    6.  
      set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
    7.  
       
    8.  
      $privatekey = file_get_contents('sftp_private.txt');
    9.  
       
    10.  
      $rsa = new Crypt_RSA();
    11.  
      $rsa->loadKey(file_get_contents(mykey.ppk"));
    12.  
      $sftp = new Net_SFTP('223.22.20.122', 22);
    13.  
      if (!$sftp->login("usrPMEGPXLtxn", $rsa)) {
    14.  
      exit('Login Failed');
    15.  
      }
    16.  
       
    17.  
      print_r($sftp->nlist()); // == $sftp->nlist('.')
    18.  
      print_r($sftp->rawlist()); // == $sftp->rawlist('.')
    19.  
    <?php
    
    //require_once 'abstract.php';
    require_once "shell/vendor/autoload.php";
    use phpseclib\Net\SFTP;
    
    /**
     * Class HP_Shell_Stock
     */
    class HP_Shell_File
    {
        const REMOTE_DIR = '/home/server/Public/';
        private $host = '192.168.8.113';
        private $server = 'server';
        private $password = ' ';
    
        public function getLocalDir()
        {
            return Mage::getBaseDir('var') . '/content_xml_downloading';
        }
    
        public function getLocalDestDir()
        {
            return Mage::getBaseDir('media') . '/contents_xml';
        }
    
        public function run(){
            $nameArr = array();
            $needFil = array();
            $sftp = new SFTP($this->host);
            if (!$sftp->login($this->server,$this->password)) {
                throw new Exception("Login failed");
            }else{
                echo "<h1>it works</h1><br>";
                //download
                $fileName = $sftp->nlist(self::REMOTE_DIR);
                foreach ($fileName as $name) {
                    if (strstr($name , 'cap_cn_zh_xml_')) {
                        echo $name.'<br>';
                        array_push($needFil,$name);
                        $sftp->get(self::REMOTE_DIR.$name,$this->getLocalDir()."/$name");
                        preg_match_all("/cap_cn_zh_xml_[\d]{4}_([\d]{6})/",$name,$out,PREG_SET_ORDER);
                        array_push($nameArr,$out[0][1]);
                    }
                }
                $this->extractFile($needFil);
                $this->createFile($nameArr,$fileName);
                $this->moveFiles($nameArr,$needFil,$fileName);
            }
        }
    
        /**
         * 移动文件到指定文件
         */
        public function moveFiles($nameArr,$needFil,$fileName){
            $sftp = new SFTP($this->host);
            if (!$sftp->login($this->server,$this->password)) {
                throw new Exception("Login failed");
            }else{
                $remoteFil = array();
                foreach ($fileName as $value){
                    preg_match_all("/^\d{6}/",$value,$out,PREG_SET_ORDER);
                    if (!empty($out)){
                        array_push($remoteFil,$out[0][0]);
                    }
                }
                $sftp->chdir(self::REMOTE_DIR);//改变目录
                foreach ($needFil as $valueNd){
                    foreach (array_unique($nameArr) as $key=>$valueNa){
                        if (in_array($valueNa,$remoteFil)){
                            if (strstr($valueNd,$valueNa)){
                                $sftp->rename($valueNd,$valueNa.'/'.$valueNd);
                            }
                        }else{
                            $sftp->mkdir($valueNa);
                            $sftp->rename($valueNd,$valueNa.'/'.$valueNd);
                        }
                    }
                }
            }
        }
    
    /**
         * 解压文件
         */
        public function extractFile($name) {
            echo $_SERVER['PATH_INFO'];
            if (count($name) != 0){
                foreach ($name as $value){
                    $zip=new ZipArchive();
                    chmod("/usr/share/nginx/html/getremotefiles/$value",0777);
                    if($zip->open("/usr/share/nginx/html/getremotefiles/$value")===TRUE){
                        $zip->extractTo("/usr/share/nginx/html/getremotefiles/abc");
                        file_put_contents("/usr/share/nginx/html/hp.php9.cc/var/log/success.txt",$value."\n",FILE_APPEND);
                        $zip->close();
                    }else{
                        file_put_contents("/usr/share/nginx/html/hp.php9.cc/var/log/failed.txt",$value."\n",FILE_APPEND);
                    }
                }
            }
        }
    
    
        /**
         * 根据文件创建文件夹
         */
    //    public function createFile($arr,$fiName) {
    //        $sftp = new SFTP("192.168.8.113");
    //        if (!$sftp->login("server"," ")){
    //            throw new Exception("Login failed");
    //        }else{
    //            foreach (array_unique($arr) as $key=>$one) {
    //                foreach ($fiName as $two){
    //                    if ($one == $two){
    //                        unset($arr[$key]);
    //                    }
    //                }
    //            }
    //            $sftp->chdir("/home/server/Public/");//改变目录
    //            foreach (array_unique($arr) as $value) {        //创建目录
    //                $sftp->mkdir($value);
    //            }
    //        }
    //        return;
    //    }
    }
    
    $shell = new HP_Shell_File();
    $shell->run();
  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/liliuguang/p/16422408.html
Copyright © 2020-2023  润新知