0

PHP で libssh2 を使用して実行したい SSH コマンドがあります。

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
'"

1 つ目は PHP エラーを返し、2 つ目はコマンドを実行しません。

関数全体 (Morgan Wilde が提案した編集後):

    function runShellCommand($command, $host, $user, $pass, $port){
        if (!function_exists("ssh2_connect")) die("Fail: function ssh2_connect doesn't exist");
        if(!($con = ssh2_connect($host, $port))){
            return "Unable to establish connection. Is your server offline?";
        } else {
            if(!ssh2_auth_password($con, $user, $pass)) {
                return "Failed to authenticate. Please ensure your server's password matches our records.";
            } else {
                $run = <<<HEREDOC
sh -c '
rm -f /tmp/command.log
sleep 3 &
screen -p 0 -X stuff "\
script -a -c \"touch /root/test234\" /tmp/command.log; kill -USR1 $!
"
wait
cat /tmp/command.log
'
HEREDOC;
                if (!($stream = ssh2_exec($con,  $run ))) {
                    return "Could not run command.";
                } else {
                    stream_set_blocking($stream, true);
                    $data = "";
                    while ($buf = fread($stream,4096)) {
                        $data .= $buf;
                    }
                    fclose($stream);
                    if(empty($data)){
                        return "sh-4.1# $command\n\n";
                    } else {
                        return "sh-4.1# $command\n$data\n";
                    }
                }
            }
        }
    }
4

2 に答える 2

1

HEREDOC文字列の引用符を使用するのはどうですか? 試したことはありませんが、他のユースケースでも機能します。

$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;

詳細はこちら - http://php.net/manual/en/language.types.string.php

于 2012-12-03T01:22:25.047 に答える
0

純粋な PHP SSH 実装である phpseclib を試してください。例えば。

<?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 $!
\"");
...
?>
于 2012-12-05T06:51:21.953 に答える