php 命令通过静态运行它来工作,但在

问题描述

所以我的问题是这个。当我尝试运行以下命令时,没有任何效果,我没有收到错误消息,也没有输出,并且文件不会传输到其他设备(此处使用本地主机地址作为占位符)。

shell_exec('sshpass -p "'.$password.'" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1');

但是如果我在命令中以纯文本形式传递密码而不是使用变量(如下所示),它会正常工作???

shell_exec('sshpass -p "Password" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1');

我已经尝试过的:

  • 我曾多次尝试输入密码,但总是正确的,因为我只有一个简单的用于测试目的。
  • 我已经尝试过先编写命令,然后将其保存到另一个变量中,然后再执行

我现在尝试了一些东西,但不知何故它们都不起作用,我不明白为什么,因为最后这些是 1:1 相同的命令......希望我在这里变得更聪明

(该网站在 Linux apache 服务器上运行,我尝试使用 PHP v. 7.3.19 运行它)

解决方法

所以看看这段代码的输出,它真的会帮助你调试

<?php

$password = "Password";

$commandOne = 'sshpass -p "'.$password.'" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1';
$commandTwo = 'sshpass -p "Password" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1';

echo $commandOne . PHP_EOL;
echo $commandTwo . PHP_EOL;

输出

sshpass -p "Password" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1
sshpass -p "Password" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1

当我在密码变量中使用“密码”时,它们完全相同,所以现在只需尝试放置您的真实密码并比较它们,它就会告诉您问题
如果你得到相同的结果,就在你的代码中试试这个

<?php

$password = "Password";
$command = 'sshpass -p "'.$password.'" scp -o StrictHostKeyChecking=no /file.txt user@127.0.0.1:/home/user/ 2>&1';
shell_exec($command);