Php ssh2“scp发送()返回”;无法打开流:没有这样的文件或目录";

Php ssh2“scp发送()返回”;无法打开流:没有这样的文件或目录";,php,csv,ssh,Php,Csv,Ssh,今天,如果没有ssh2\u scp\u send()方法,我将与ssh进行斗争,并取得巨大成功。这是我第一次将ssh与PHP集成,因此您可能会在我尚未发现的代码中发现多个错误,因为我目前正陷于这一部分 我使用的是一个虚拟数组,它模仿了我必须从几个表单中获得的数组,并且auth工作得很好,尽管我在那里遇到了一个小问题,因为我必须使用“root”作为用户,以便在与公钥(而不是我的实际用户)进行比较时将其识别为正确的公钥。 一旦我解决了这个问题,我发现代码工作不正常,这次控制台说: ssh2\u sc

今天,如果没有ssh2\u scp\u send()方法,我将与ssh进行斗争,并取得巨大成功。这是我第一次将ssh与PHP集成,因此您可能会在我尚未发现的代码中发现多个错误,因为我目前正陷于这一部分

我使用的是一个虚拟数组,它模仿了我必须从几个表单中获得的数组,并且auth工作得很好,尽管我在那里遇到了一个小问题,因为我必须使用“root”作为用户,以便在与公钥(而不是我的实际用户)进行比较时将其识别为正确的公钥。 一旦我解决了这个问题,我发现代码工作不正常,这次控制台说:

ssh2\u scp\u send(tmp/sshPm/prueba1.csv):无法打开流:第32行的/home/josemaria/Desktop/API UBcloud/csv/provisioning.php中没有此类文件或目录

这是我的密码:

函数arrayToCsv($array,$filename,$delimiter=';')){
标题(“内容类型:应用程序/csv”);
标题('Content-Disposition:attachment;filename=“.$filename.”“;”);
$f=fopen('/tmp/sshPm/'.$filename,'r');
foreach($数组作为$行){
fputcsv($f,$line,$delimiter);
}
} 
函数connectSsh($filename){
$sshConnection=ssh2\u connect($host,$port);
如果(!$sshConnection){
死亡(“科内西翁·费利达”);
}
ssh2\u auth\u pubkey\u文件($sshConnection、$user、$pubkey、$priKey);
ssh2_scp_send($sshConnection,“/tmp/sshPm/$filename,”/home/scripts/CSV',0644);
$stream=ssh2_exec($sshConnection,“/home/scripts/sc_prov_ovpn_firm.sh$filename”);
ssh2_exec($sshConnection,'exit');
返回$stream;
}
对于($i=0;$i<10;$i++){
$array[]=数组(
“万岁”,
“瓦格在这里”,
200多美元,
564451+一美元,
“啜饮”,
"",
"",
"",
"8.8.8.8",
"8.8.4.4",
20048,
“Modelo终端”,
“677shdG3”
);
}
$filename='test.csv';
arrayToCsv($array,$filename);
$stream=connectSsh($filename);
打印(流);
如您所见,我打算在/tmp中创建并存储CSV。即使csv被创建并放置在正确的目录中,只要我到达scp_send,这种方法就无法找到它。我不知道这是否与我正在使用root来隐藏我的公钥有关,因为我已经看到它应该是您登录的用户

我也立即得到了以下警告,但我想这是第一个警告的连续性。。。无论如何,这里是:

PHP警告:ssh2_scp_send():无法读取第32行/home/josemaria/Desktop/API UBcloud/CSV/provisioning.PHP中的源文件

我尝试使用包装器代替fopen(),但没有成功。正如我所说,这是我第一次使用ssh和PHP,所以我想请您至少解释一下! 非常感谢你的帮助

更新

我按照阿森的建议,在/Desktop中创建了一个目录,并将所有路由改为该目录,而不是/tmp,从而部分解决了这个问题。现在我面临的问题是,一旦创建文件,我就不确定将文件放在哪里。因此,我的下一个与此相关的问题是:

我应该在哪里存储本地生成的所有CSV?如您所见,我是在/Documents中进行的,因为我没有阅读/修改的限制,但我想说答案在于/,也许是/var?我真的对这些东西一无所知

再次感谢您提供的帮助

这就是我的代码现在的样子:

函数arraytocvs($array,$filename,$delimiter=',')){
标题(“内容类型:应用程序/csv”);
标题('Content-Disposition:attachment;filename=“.$filename.”“;”);
$f=fopen(“/home/josemaria/Documents/sshPm/$filename,'w');
foreach($数组作为$行){
fputcsv($f,$line,$delimiter);
}
外国法郎(f美元);
} 
函数connectSsh($filename){
$sshConnection=ssh2\u connect($host,$port);
如果(!$sshConnection){
死亡(“科内西翁·费利达”);
}
ssh2\u auth\u pubkey\u文件($sshConnection、$user、$pubkey、$priKey);
ssh2_scp_send($sshConnection,“/home/josemaria/Documents/sshPm/$filename”,“/home/scripts/CSV/$filename”,0644);
$stream=ssh2_exec($sshConnection,“/home/scripts/sc_prov_ovpn_firm.sh$filename”);
ssh2_exec($sshConnection,'exit');
返回$stream;
}
对于($i=0;$i<10;$i++){
$array[]=数组(
“万岁”,
“瓦格在这里”,
200多美元,
564451+一美元,
“啜饮”,
"",
"",
"",
"8.8.8.8",
"8.8.4.4",
20048,
“Modelo终端”,
“677shdG3”
);
}
$filename='test.csv';
arrayToCsv($array,$filename);
$stream=connectSsh($filename);
打印(流);

您应该关闭文件处理程序,以便文件确实被写入,并且不在某些I/O缓冲区中

function arrayToCsv($array, $filename, $delimiter = ';'){
    // all your existing code here ...    
    fclose($f);
} 
此外,对于您的复制目标,您似乎正在将文件放在文件夹所在的位置,这意味着:

ssh2_scp_send($sshConnection, "/tmp/sshPm/$filename", '/home/scripts/CSV', 0644);
应该是:

ssh2_scp_send($sshConnection, "/tmp/sshPm/$filename", "/home/scripts/CSV/$filename", 0644);

我的问题的答案与权限有关。正如@ArSeN指出的,我还有一些其他错误,但我得到的警告以及阻止代码工作的警告是因为我试图在没有所需权限的情况下在/tmp中存储和读取文件。因此,请为自己授予该目录的完全权限,或者为另一个目录更改该目录。我对这段代码仍然有一些问题,但我确实觉得它们属于一个单独的问题,我将在这里链接:

Hi@ArSeN!谢谢你的回答。执行所有建议的更改后,问题仍然存在,cli仍会向我显示两个警告。我对ssh甚至Linux都是新手。正如它的名字所暗示的那样,/tmp似乎删除了引导之间的所有目录,我想知道这是否有什么关系。它可能与权限有关