Conecte-se ao SFTP usando PHP e chave privada

Eu li o artigo após o artigo e simplesmente não consigo encontrar “a solução” que funciona pelo que tenho.

Estou tentando fazer o upload de arquivos via SFTP usando php scripting. Conectei usando o CyberDuck com sucesso, mas preciso fazer isso programaticamente.

Eu tenho um arquivo .PPK do fornecedor que usei no CyberDuck. Eu tenho um nome de usuário. Eu tenho o nome do host. Se eu abrir o arquivo PPK, vejo algumas Linhas Públicas, Linhas Privadas e Private-MAC.

Existe de qualquer forma eu posso acessar o servidor para fazer o que eu preciso fazer usando as informações que tenho?

Aqui está o código com o qual eu estava brincando:

  

Não recebo nenhum erro, mas o arquivo não aparece no servidor. Posso confirmar que o SSH2 está instalado no meu webhost.

Obrigado por qualquer ajuda que você possa fornecer.

A questão é bastante antiga, mas como eu estava procurando exatamente a mesma resposta, aqui é o que eu consegui reunir.

Primeiro: Mude o formato da chave de .pkk para .pem

As chaves .pkk são a chave privada do formato Putty.

Se você quiser mudar isso para o formato .pem, você precisa instalar ferramentas de massa com:

 sudo apt install putty-tools 

(Em um Mac, instale o pacote de massa com o homebrew. Para o Windows, não tenho nenhuma pista.)

Então você pode alterar o formato da chave:

 puttygen privatekey.ppk -O private-openssh -o privatekey.pem 

Apenas no caso de você querer extrair a chave pública dessa chave privada, (você não precisará para o resto dessa resposta, mas, no caso), é bastante fácil:

 openssl rsa -in privatekey.pem -pubout > publickey.pub 

Segundo: Login com sFTP

Agora que você tem o privatekey.pem, você pode usar o phpseclib para se conectar via sftp. Primeiro, instale o phpseclib com o Composer:

 composer require phpseclib/phpseclib 

Então em PHP:

 require “vendor/autoload.php”; use phpseclib\Crypt\RSA; use phpseclib\Net\SFTP; $sftp = new SFTP('sftp.server.com'); // create new RSA key $privateKey = new RSA(); // in case that key has a password $key->setPassword('private key password'); // load the private key $key->loadKey(file_get_contents('/path/to/privatekey.pem')); // login via sftp if (!$sftp->login('username', $key)) { throw new Exception('sFTP login failed'); } // now you can list what's in here $filesAndFolders = $sftp->nlist(); // you can change directory $sftp->chdir('coolstuffdir'); // get a file $sftp->get('remoteFile', 'localFile'); // create a remote new file with defined content $sftp->put('newfile.txt', 'new file content'); // put a local file $sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE); 

Se quiser mais informações, acesse a lista de resources do spsfps do phpseclib .