php: #fopen works in localhost but not in live server - php

I'm trying to get a remote file like this:
$host = 'sftp.hostname.com';
$username = 'user';
$password = '*****';
$port = '22';
$remote_file = 'TOB-20180919.text';
$connection = #ssh2_connect($host, $port);
if ($connection != false) {
$login = #ssh2_auth_password($connection, $username, $password);
if ((bool) $login) {
$sftp = #ssh2_sftp($connection);
if ($sftp != false) {
$stream = #fopen("ssh2.sftp://$sftp" . "/" . "$remote_file", 'w');
var_dump($stream);exit;
}
}
}
$stream prints false in my live server and true in my localhost.
What should I do now?

I had face same issue so I was solve that type of issue using following code.please use this and check.
put
$stream = #fopen("ssh2.sftp://".(int)$sftp."/".$remote_file, 'w');
instead of
$stream = #fopen("ssh2.sftp://$sftp" . "/" . "$remote_file", 'w');

Related

ssh2_scp_recv() prints warning: "Unable to receive remote file"

I have the following simple code, to connect to a local server and retrieve an index.php file.
$username = "Admin";
$password = "Admin";
$url = "192.168.1.33";
$connection = ssh2_connect($url);
if (!ssh2_auth_password($connection, $username, $password)) throw new Exception('Unable to connect.');
if (!$sftp = ssh2_sftp($connection)) throw new Exception('Unable to create SFTP connection.');
$localDir = 'C:/downloadTest';
$remoteDir = '/htdocs';
$files = scandir('ssh2.sftp://' . $sftp . "/".$remoteDir);
if (!empty($files)) {
foreach ($files as $file) {
if ($file == "index.php") {
//echo $remoteDir."/".$file;
//echo $localDir.'/'.$file;
ssh2_scp_recv($connection, "$remoteDir/$file", "$localdir/$file");
}
}
}
However after executing I always get an Error:
Warning: ssh2_scp_recv(): Unable to receive remote file in C:\path\to\index\index.php on line 21
On the server (Windows 10) I enabled OpenSSH Server and added the following lines to the config:
Subsystem sftp sftp-server.exe -d "C:\Server\data\"
ChrootDirectory C:\Server\data
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
AllowUsers Admin
I am able to connect through WinSCP through the SFTP Protocol, but not the SCP protocol.
Printing the file list works, so the connection is there 100%.
Local PC & Server are Windows 10.
Edit:
I am able to download files from the root folder with the following code:
<?php
$username = "Admin";
$password = "Admin";
$url = "192.168.1.33";
$remoteDir = "";
$localDir = "downloadtest\\";
$connection = ssh2_connect($url);
if (!ssh2_auth_password($connection, $username, $password)) throw new Exception('Unable to connect.');
if(!$stream = ssh2_sftp($connection)){
die("Unable to create stream");
}
if(!$dir = opendir("ssh2.sftp://{$stream}/{$remoteDir}")){
die("Could not open dir");
}
$files = array();
while (false !== ($file = readdir($dir)))
{
if ($file == "." || $file == "..")
continue;
$files[] = $file;
}
foreach ($files as $file){
if(!$remote = #fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}","r")){
echo "unable to open remote file: $file\n";
continue;
}
if(!$local = #fopen($localDir . $file, "w")){
echo "Unable to create local file: $file\n";
continue;
}
$read = 0;
$filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
while ($read < $filesize && ($buffer = fread($remote, $filesize - $read))){
$read += strlen($buffer);
if(fwrite($local, $buffer) === false){
echo "Unable to write to local file: $file\n";
}
}
fclose($local);
fclose($remote);
}
?>
However this is not through scp but sftp. With sftp I can download wherever I like (root folder or sub folder), with scp it does not work at all and always gives me the error Warning: ssh2_scp_recv(): Unable to receive remote file in C:\path\to\index\index.php on line 21
I am 100% sure it is not a rights issue, since I can download files through the cmd with the following command
pscp -scp Admin#192.168.1.33:/htdocs/index.php C:\downloadTest\index.php

mysql doesn't connect while using fopen

The code below doesn't connect:
$file_open = fopen("logindetails.txt","r");
if($file_open){
$user = fgets($file_open);
$pass = fgets($file_open);
$server = fgets($file_open);
}
echo "user: ",$user,"password: ",$pass,"server: ",$server;
#$db_handle = mysql_connect($server,$user,$pass);
but outputs:
user: root password: usbw server: localhost
logindetails.txt contains:
root
usbw
localhost
while this code connects:
$user = "root";
$pass = "usbw";
$server = "localhost";
echo "user: ",$user,"password: ",$pass,"server: ",$server;
#$db_handle = mysql_connect($server,$user,$pass);
I can't get this working and I can't guess why.
The variables you read with fgets in also contain linebreaks.
$user == "root\n";
$pass == "passw\n";
Which is why MySQL won't recognize them as valid.
So, you should either:
trim() them
instead use an INI file
better yet some config.php instead of a text file.

Php: How can one automate a script to change dates everyday? [duplicate]

This question already has answers here:
PHP, How to get current date in certain format [duplicate]
(3 answers)
Closed 5 years ago.
#!/usr/bin/php
<?php
$username = "user";
$password = "pass";
$url = '10.168.8.666';
// Make our connection
$connection = ssh2_connect($url);
// Authenticate
if (!ssh2_auth_password($connection, $username, $password))
{echo('Unable to connect.');}
// Create our SFTP resource
if (!$sftp = ssh2_sftp($connection))
{echo ('Unable to create SFTP connection.');}
$localDir = 'file:///home/batman/Downloads/dbs';
$remoteDir = '/home/batbackup/Dropbox/dbs';
// download all the files
$files = scandir ('ssh2.sftp://' . $sftp . $remoteDir);
if (!empty($files)) {
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
if (substr($file, 0, 11)=='07-Jun-2017'){
# code...
ssh2_scp_recv($connection, "$remoteDir/$file", "$localDir/$file");
}
}
}
}
?>
I use this script to download backups from an sftp server everyday but i ve to manually change the date (in bold) in the script everyday. Question: is there a way i can make the script to change the date automatically so that i can set up a cron job?
Use date().
date('d-M-Y')
It will become
#!/usr/bin/php
<?php
$username = "user";
$password = "pass";
$url = '10.168.8.666';
// Make our connection
$connection = ssh2_connect($url);
// Authenticate
if (!ssh2_auth_password($connection, $username, $password))
{echo('Unable to connect.');}
// Create our SFTP resource
if (!$sftp = ssh2_sftp($connection))
{echo ('Unable to create SFTP connection.');}
$localDir = 'file:///home/batman/Downloads/dbs';
$remoteDir = '/home/batbackup/Dropbox/dbs';
// download all the files
$files = scandir ('ssh2.sftp://' . $sftp . $remoteDir);
if (!empty($files)) {
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
if (substr($file, 0, 11) == date('d-M-Y')) {
# code...
ssh2_scp_recv($connection, "$remoteDir/$file", "$localDir/$file");
}
}
}
}
?>
If you want it to always be, let's say, yesterday, you may use it with strtotime(), so
date('d-M-Y', strtotime('yesterday'))
Replace your date with
date('d-M-Y')
http://php.net/manual/fr/function.date.php
This will take server current time.

PHP download from remote server via sftp

This may have been asked before, I'm new to PHP and I'm trying to learn as much as I can, but this has really thrown me.
Basically what I want to know is, how would I use PHP code to get it to download everything from a remote server to a local location. It's getting it to download everything not just one file that I'm stuck on. So please can someone show/explain to me how I would do this?
What I've got so far:
<?php
$connection - ssh2_connect('example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$remote_dir="/remote_dir/";
$local_dir="/local_dir/";
$remote ="$remote_dir";
$stream = ssh2_exec($connection, $remote);
stream_set_blocking($stream,true);
$command=fread($stream,4096);
$array=explode(\n,$command);
$total_files=sizeof($array);
for($i=0;$i<$total_files;$i+++){
$file_name=trim($array[$i]);
if($file_name!=''{
$remote_file=$remote_dir.$file_name;
$local_file=$local_dir.$file_name;
if(ssh2_scp_recv($connection, $remote_file,$local_file)){
echo "File ".$file_name." was copied to $local_dir<br />";
}
}
}
fclose($stream);
?>
I think my $remote ="$remote_dir"; is wrong, and to be honest I've got $filename when I want the whole directory, this is all I have so far.
Here is a small code on how to read the folder and download all its files:
<?php
$host = 'localhost';
$port = 22;
$username = 'username';
$password = 'password';
$remoteDir = '/must/be/the/complete/folder/path';
$localDir = '/can/be/the/relative/or/absolute/local/path';
if (!function_exists("ssh2_connect"))
die('Function ssh2_connect not found, you cannot use ssh2 here');
if (!$connection = ssh2_connect($host, $port))
die('Unable to connect');
if (!ssh2_auth_password($connection, $username, $password))
die('Unable to authenticate.');
if (!$stream = ssh2_sftp($connection))
die('Unable to create a stream.');
if (!$dir = opendir("ssh2.sftp://{$stream}{$remoteDir}"))
die('Could not open the directory');
$files = array();
while (false !== ($file = readdir($dir)))
{
if ($file == "." || $file == "..")
continue;
$files[] = $file;
}
foreach ($files as $file)
{
echo "Copying file: $file\n";
if (!$remote = #fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r'))
{
echo "Unable to open remote file: $file\n";
continue;
}
if (!$local = #fopen($localDir . $file, 'w'))
{
echo "Unable to create local file: $file\n";
continue;
}
$read = 0;
$filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
{
$read += strlen($buffer);
if (fwrite($local, $buffer) === FALSE)
{
echo "Unable to write to local file: $file\n";
break;
}
}
fclose($local);
fclose($remote);
}
You can also resume this code to (it will not copy directories):
while (false !== ($file = readdir($dirHandle)))
{
if ($file == "." || $file == "..")
continue;
echo "Copying file: $file\n";
if(!ssh2_scp_recv($connection, $remoteDir . $file, $localDir . $file))
echo "Could not download: ", $remoteDir, $file, "\n";
}
If you do not use the full path on the remote folder it will not work:
opendir("ssh2.sftp://{$stream}{$remoteDir}")
Update: I was kindly corrected that this doesn't use sftp, but instead uses ftps. Here's a Stackoverflow link discussing using PHP to do SFTP.
The PHP docs already cover most of what you should need for this. Here's an example for fetching a list of the contents in the remote directory:
<?php
// set up basic connection
$ftp_server = "example.com";
$conn_id = ftp_ssl_connect($ftp_server);
// login with username and password
$ftp_user_name = "myuser";
$ftp_user_pass = "mypass";
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
// check connection
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
exit;
} else {
echo "Connected to $ftp_server, for user $ftp_user_name";
}
$buff = ftp_rawlist($conn_id, '.');
var_dump($buff);
ftp_close($conn_id);
?>
Here you will find all the examples for what you can do with SFTP using PHP.
http://phpseclib.sourceforge.net/sftp/examples.html
<?php
include('Net/SFTP.php');
$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
exit('Login Failed');
}
// outputs the contents of filename.remote to the screen
echo $sftp->get('filename.remote');
// copies filename.remote to filename.local from the SFTP server
$sftp->get('filename.remote', 'filename.local');
?>

saving mysql query as csv file on remote ftp server using php

I am trying to export a MySQL query result to a remote ftp server.
I have the below code but I am currently getting an error:
Warning: ftp_put() [function.ftp-put]: Opening ASCII mode data connection. in /home/hulamyxr/public_html/kisv2/xmltest/export.php on line 50
I would think that my $file = $csv_filename; might be the issue as this is fetching the csv file that has just been created on my local server?
any ideas?
My syntax is:
<?php
$host = 'localhost';
$user = 'un';
$pass = 'pwd';
$db = 'dbname';
$table = 'v2ReportingTable';
$file = 'export';
$datetime=date("Y-m-d H:i:s");
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
//Create a CSV for
$result = mysql_query("SELECT * FROM dbname.v2ReportingTable");
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$csv_filename = "export-" .$datetime.".csv";
$fp = fopen($csv_filename, 'w+');
if ($fp && $result)
{
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
}
//works till here
$ftp_server = "ftp.server.co.za";
$ftp_user_name = "un";
$ftp_user_pass = "pw";
$file = $csv_filename;
$remote_file = "/LocExports/".$file;
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// upload a file
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
echo "successfully uploaded $file\n";
} else {
echo "There was a problem while uploading $file\n";
}
// close the connection
ftp_close($conn_id);
?>
Thanks Again
and it creates the file in the correct location but is a 0kb file and all FTP commands thereafter fail. It is likely that the client is behind a firewall. To rectify this use:
<?php
ftp_pasv($resource, true);
?>

Categories