ssh或cURL将数据发送到远程服务器

时间:2013-10-14 10:28:17

标签: php mysql curl ssh

我正在创建一个应用程序来将我的本地mysql数据库同步到一个远程mysql数据库,所以我正在生成一个转储文件,通过sFTP发送它,然后在服务器上执行它。

但是,我知道还有其他可用的方法,如cURL。我喜欢将数据发送到远程服务器并在服务器接受时执行它(TRUE),但我不太了解与在这方面使用cURL相关的安全问题。任何人都可以建议cURL解决方案,否则建议任何替代方法?

4 个答案:

答案 0 :(得分:3)

首先,您应该使用file_get_contents()fread()等来读取文件中的数据,而不是生成转储文件。

将结果存储在变量中,然后通过管道发送原始数据(如果愿意,通过cURL),并让服务器端的代码生成转储文件。

使用cURL,您可以指定用于身份验证的私有证书文件 - 因此这与使用ssh证书相同 - 这不是您需要担心的事情。

您可以使用以下cURL选项示例设置pem文件:

curl_setopt($ch, CURLOPT_SSLCERT, $pemfile);
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile); 

上面有互联网的教程。使用私钥身份验证,您的安全问题已排序。只是确保你没有将CURLOPT_SSL_VERIFYPEER设置为false(你现在不想要任何MiTM(中间的人)攻击,你呢)。

答案 1 :(得分:1)

我使用Curl来做这件事。

我有一个生成json或xml的导出脚本(取决于我的情绪比什么都重要)我然后将此文件发布到远程服务器,远程服务器使用ignore_user_abort以便处理可以即使父内部系统脚本超时/完成任何操作,也会继续。

就像魅力同步更改到本地Web服务器和远程Web服务器之间的2.6gb表。

答案 2 :(得分:0)

我使用纯PHP PHP SFTP实现的phpseclib来做这样的事情。例如

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

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

$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
?>

它比libssh2有许多优点,包括速度和可移植性:

http://phpseclib.sourceforge.net/ssh/compare.html

答案 3 :(得分:0)

这是使用ssh2 / libssh的基本解决方案。

此代码假定您已经有一种创建数据库转储的方法,并且只是在当前服务器上读取它,目的是将其加载到远程服务器上。

它通过SSH连接到远程主机,将sql_dump写入远程服务器上的文件,然后执行命令将其加载到数据库中。

我不建议存储用于连接的用户名/密码,这只是测试代码的一种快速方法。 您最好使用ssh2_auth_pubkey_file进行身份验证: http://php.net/manual/en/function.ssh2-auth-pubkey-file.php

// remote host authentication details. hostname/ip, user, pass
$host = 'REMOTE_HOST';
$user = 'REMOTE_USER';
$pass = 'REMOTE_PASS';

// check if we have ssh2 installed first
if (function_exists("ssh2_connect")) {

    //connect to remote host
    $connection = ssh2_connect($host, 22);

    // if connection successful, proceed
    if ($connection) {

        // authenticate on remote connection
        $auth = ssh2_auth_password($connection, $user, $pass);

        // if we have authenticated, proceed with remote commands
        if ($auth) {

            // load our dump file to a string
            $sql_str = file_get_contents('dump_file.sql');
            // bash command to cat our dump string to a file
            $write_remote_file_command = "cat <<'EOF' > /home/tmp_file.sql \n$sql_str \nEOF";
            // call our execute ssh function to execute above command
            executeSSHCommand($connection, $write_remote_file_command);

            // command to load our temp dump file into the database
            // - you may need to add additional commands to drop the existing db, etc
            $remote_load_command = "mysql -Uroot -p -h localhost database_name < /home/tmp_file.sql";
            // remotely execute load commands
            executeSSHCommand($connection, $remote_load_command);
        }
    }
}

// basic function to execute remote shell commands via our authenticated $connection
function executeSSHCommand($connection, $command) {

    $output = array();
    $ssh_data = "";

    $stream = ssh2_exec($connection, $command);

    if ($stream) {

        stream_set_blocking($stream, true);

        while ($buffer = fread($stream, 65536)) {

            $ssh_data .= $buffer;
        }

        fclose($stream);

        $output = explode(PHP_EOL, $ssh_data);

    } 

    return $output;
}