PHP로 SFTP하는 방법?


81

웹 FTP 클라이언트 용 PHP 스크립트를 많이 보았습니다. PHP에서 웹 애플리케이션으로 SFTP 클라이언트를 구현해야합니다. PHP는 SFTP를 지원합니까? 샘플을 찾을 수 없습니다. 누구든지 이것으로 나를 도울 수 있습니까?

답변:


71

PHP에는 ssh2 스트림 래퍼 (기본적으로 비활성화 됨)가 있으므로 ssh2.sftp://프로토콜 에 사용하여 스트림 래퍼를 지원하는 모든 함수에 sftp 연결을 사용할 수 있습니다.

file_get_contents('ssh2.sftp://user:pass@example.com:22/path/to/filename');

또는 -ssh2 확장을 사용하는 경우

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

http://php.net/manual/en/wrappers.ssh2.php 참조

참고로이 주제에 대해 이미 많은 질문이 있습니다.


file_get_contents 및 file_put_contents 모두 훌륭하게 작동합니다. 그들이 sftp로 작업한다는 것을 결코 알지 못했고, 내장 된 sftp를 사용하는 것보다 훨씬 쉽습니다. 감사!
jbrahy

3
file_get_contents ()를 사용하는 경우에도 ssh2 확장자 (afaik)가 필요합니다.
StanE

debian / ubuntu 패키지 : apt install libssh2-1-dev php-ssh2
Ajay Singh

39

ssh2 함수는 그다지 좋지 않습니다. 사용하기 어렵고 아직 설치하기 어렵 기 때문에 코드를 사용하면 코드의 이식성이 0이됩니다. 내 추천은 순수한 PHP SFTP 구현 인 phpseclib 를 사용 하는 것 입니다.


SFTP v3 만 지원
Blacksonic 2013 년

3
@indranama 향후 사용자가 자신에게 가장 적합한 것을 찾기 위해 댓글을 읽을 필요가 없도록이 답을 정답으로 표시 하시겠습니까?
Fi Horan 17

28

"phpseclib"가이 작업에 도움이된다는 것을 알았습니다 (SFTP 및 더 많은 기능). http://phpseclib.sourceforge.net/

파일을 서버에 넣으려면 ( http://phpseclib.sourceforge.net/sftp/examples.html#put의 코드 예제 )

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);

2
git repo는 여기에 있습니다 : github.com/phpseclib/phpseclib/tree/master/phpseclib
relipse

1
phpseclib 2.0에 대한 답변을 업데이트 할 수 있습니까? 현재 예제는 더 이상 사용되지 않습니다.
Martin Prikryl

2

Flysystem 설치 :

composer require league/flysystem-sftp

그때:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

읽다:

https://flysystem.thephpleague.com/v1/docs/


-1

나는 완전한 cop-out을 수행하고 배치 파일을 만든 다음 호출을 sftp통해 호출하는 클래스를 작성했습니다 system. 가장 좋은 (또는 가장 빠른) 방법은 아니지만 필요한 작업을 수행하며 PHP에서 추가 라이브러리 또는 확장을 설치할 필요가 없습니다.

ssh2확장 기능 을 사용하지 않으려면 갈 방법이 될 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.