在PHP中正确转义SSH命令

在PHP中正确转义SSH命令,php,shell,ssh,escaping,libssh2,Php,Shell,Ssh,Escaping,Libssh2,我有一个SSH命令,我想用PHP中的libssh2执行: sh -c ' rm -f /tmp/command.log sleep 3 & screen -p 0 -X stuff "\ script -a -c \"ls -l\" /tmp/command.log; kill -USR1 $! " wait cat /tmp/command.log ' 不过,我似乎无法正确地避开它,所以SSH接收它的方式与上面完全相同。我需要将它用双引号括起来,这样我也可以在其中

我有一个SSH命令,我想用PHP中的libssh2执行:

sh -c '
  rm -f /tmp/command.log
  sleep 3 &
  screen -p 0 -X stuff "\
script -a -c \"ls -l\" /tmp/command.log; kill -USR1 $!
"
  wait
  cat /tmp/command.log
'
不过,我似乎无法正确地避开它,所以SSH接收它的方式与上面完全相同。我需要将它用双引号括起来,这样我也可以在其中获得PHP变量(ls-l将变成$command)

我试过:

"sh -c '
  rm -f /tmp/command.log
  sleep 3 &
  screen -p 0 -X stuff \"\
script -a -c \\"ls -l\\" /tmp/command.log; kill -USR1 $!
\"
  wait
  cat /tmp/command.log
'"
以及:

"sh -c '
  rm -f /tmp/command.log
  sleep 3 &
  screen -p 0 -X stuff \"\
script -a -c \\\"ls -l\\\" /tmp/command.log; kill -USR1 $!
\"
  wait
  cat /tmp/command.log
'"
第一个返回PHP错误,第二个不运行命令

整个功能(在Morgan Wilde建议的编辑之后):

函数runShellCommand($command、$host、$user、$pass、$port){
如果(!函数_存在(“ssh2_连接”))死亡(“失败:函数ssh2_连接不存在”);
如果(!($con=ssh2\u连接($host,$port))){
return“无法建立连接。您的服务器是否脱机?”;
}否则{
如果(!ssh2_auth_password($con,$user,$pass)){
return“身份验证失败。请确保服务器的密码与我们的记录匹配。”;
}否则{

$run=使用
herdoc
字符串引号怎么样?我还没有尝试过,但它适用于其他用例

$command = <<<HEREDOC
sh -c '
rm -f /tmp/command.log
sleep 3 &
screen -p 0 -X stuff "\
script -a -c \"ls -l\" /tmp/command.log; kill -USR1 $!
"
wait
cat /tmp/command.log
'
HEREDOC;
$command=试试看



奇怪的是,它仍然没有正确运行命令。我将发布整个函数。@JamesHadley Well首先确保您提供的
ssh2_exec
方法的语句序列是有效的和有意义的。我无法澄清,因为我在这方面没有专业知识,我的回答完全是基于需要正确地逃避ssh命令。我想如果你不完全理解命令的格式是否正确,你可能需要创建一个新的问题。我说的对吗?命令格式正确-它在终端上运行得很好。无可否认,标题有点狭窄,因为我认为问题仅仅与转义有关,尽管这里似乎还有一个问题。我将了解libssh2是否完全不支持多行命令?@JamesHadley肯定会查看此评论并尝试该功能,我认为结论是libssh2不喜欢多行命令。谢谢您的帮助。
$command = <<<HEREDOC
sh -c '
rm -f /tmp/command.log
sleep 3 &
screen -p 0 -X stuff "\
script -a -c \"ls -l\" /tmp/command.log; kill -USR1 $!
"
wait
cat /tmp/command.log
'
HEREDOC;
<?php
include('Net/SSH2.php');

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

echo $ssh->read('username@username:~$');
$ssh->write("rm -f /tmp/command.log\n");
echo $ssh->read('username@username:~$');
$ssh->write("sleep 3 &\n");
echo $ssh->read('username@username:~$');
$ssh->write("screen -p 0 -X stuff \"\
script -a -c \\\"ls -l\\\" /tmp/command.log; kill -USR1 $!
\"");
...
?>