Beispiel #1
0
            // We prepare and we send the command into the screen
            $cmd = "screen -S " . $session . " -p 0 -X stuff \"" . $cmdRcon . "\"`echo -ne '\r'`";
            $ssh->exec($cmd . "\n");
            unset($cmd);
            // Adding event to the database
            $message = 'RCON command (' . mysql_real_escape_string($cmdRcon) . ') sent to : ' . mysql_real_escape_string($server['name']);
            query_basic("INSERT INTO `" . DBPREFIX . "log` SET `serverid` = '" . $serverid . "', `message` = '" . $message . "', `name` = '" . mysql_real_escape_string($_SESSION['adminfirstname']) . " " . mysql_real_escape_string($_SESSION['adminlastname']) . "', `ip` = '" . $_SERVER['REMOTE_ADDR'] . "'");
            unset($cmdRcon);
            header('Location: utilitiesrcontool.php?serverid=' . urlencode($serverid));
            die;
        }
        // We retrieve screen contents
        $ssh->write("screen -R " . $session . "\n");
        $ssh->setTimeout(1);
        @$ansi->appendString($ssh->read());
        $screenContents = htmlspecialchars_decode(strip_tags($ansi->getScreen()));
        $ssh->disconnect();
        unset($session);
        include "./bootstrap/header.php";
        /**
         * Notifications
         */
        include "./bootstrap/notifications.php";
        ?>
			<script type="text/javascript">
			$(document).ready(function() {
				prettyPrint();
			});
			</script>
			<div class="page-header">
				<h1><small><?php 
 protected final function RemoteExec($cmd, $rand = null, $method = null)
 {
     if (($result = $this->InitSSH()) !== true) {
         $this->SessionSwap('previous');
         return $result;
         //trigger_error($result);
     }
     if (strstr($cmd, 'sudo ')) {
         exit('ERROR: RemoteExec() remove sudo in commands, we are already root');
     }
     if (!$this->sudoOK) {
         list($user, $pass) = explode(' ', $this->Decrypt($_SESSION['cred']));
         $this->GoSUDO($pass);
     }
     $is_ansi = ($cmd and in_array($cmd, array('top')) and $this->sudoOK) ? 1 : 0;
     $polling = ($rand and ctype_alnum($rand) and in_array($method, array('nohup', 'pscreen'))) ? 1 : 0;
     if ($polling) {
         // no need to redirect stderr to stdout, nohup does this for you
         //$randcapture = ' >/tmp/' . $randfile . ' &';
         // bashpre-4 more compatible
         //$randcapture = ' >/tmp/' . $randfile . ' 2>&1 &';
         // bash4 is the new way, but less compatible
         //$randcapture = ' &>/tmp/' . $randfile;
         $log = '/tmp/' . $this->tmp_prepend . $rand;
         $cnf = '/root/.screenrc_panel';
         if ($method == 'nohup') {
             $this->ssh->write("touch {$log}; nohup {$cmd} >{$log} &\n");
             $out = $this->SSHRead($_SESSION['rprompt'], 0, 1);
             list(, $pid) = explode(' ', $out);
             if ($pid and is_numeric($pid)) {
                 $this->ssh->write("echo '{$pid}' > {$log}.pid\n");
             } else {
                 exit('PanelCommon->RemoteExec(): method: nohup, non-numeric pid: ' . $pid);
             }
             $this->SSHRead($_SESSION['rprompt']);
             return $pid;
         } else {
             if ($method == 'pscreen') {
                 $this->ssh->write("screen -wipe; screen -li\n");
                 $out = $this->SSHRead($_SESSION['rprompt'], 0, 1);
                 if (stristr($out, 'no sockets found')) {
                     $write_cnf = "echo 'log on' > {$cnf}; echo 'logfile {$log}' >> {$cnf}; echo 'logfile flush 5' >> {$cnf}";
                     $this->ssh->write("{$write_cnf}; screen -c {$cnf} -dmLS panel\n");
                     $out = $this->SSHRead($_SESSION['rprompt']);
                     $this->ssh->write("screen -li | grep panel | cut -d'.' -f1\n");
                     $pid = $this->SSHRead($_SESSION['rprompt'], 0, 1);
                     if ($pid and is_numeric($pid)) {
                         $this->ssh->write("echo '{$pid}' > {$log}.pid\n");
                     } else {
                         exit('PanelCommon->RemoteExec(): method: pscreen, non-numeric pid: ' . $pid);
                     }
                     $this->SSHRead($_SESSION['rprompt']);
                     $_SESSION['pscreen'] = $_SESSION['pscreen2'] = $rand;
                     return $pid;
                 } else {
                     // get pid of running screen named 'panel'
                     // $screenPID = 'screen -li | grep panel | sed -e "s/^[ \t]*//" | cut -d"." -f1';
                     // get config file of screen with specified pid
                     // $screenCONF = 'ps aux | grep screen | grep $('.$screenPID.') | tr -s " " | cut -d" " -f13';
                     // get $rand from logfile
                     // $screenRAND = 'cat $('.$screenCONF.') | grep "logfile /" | cut -d"/" -f3 | | cut -d"_" -f2';
                     // below is on long command to do the above action, you have to use bash vars, you cannot nest $() like you would think
                     $cmd_get_rand = 'pid=$(screen -li | grep panel | sed -e "s/^[ \\t]*//" | cut -d"." -f1); conf=$(ps aux | grep screen | grep $pid | tr -s " " | cut -d" " -f13); echo $(cat $conf | grep "logfile /" | cut -d"/" -f3  | cut -d"_" -f2)';
                     //if (! $_SESSION['pscreen'] AND $_SESSION['pscreen2']) $_SESSION['pscreen'] = $_SESSION['pscreen2'];
                     //else if (! $_SESSION['pscreen2'])
                     //{
                     //$this->ssh->write("cat {$c} | grep 'logfile /' | cut -d'/' -f3 | | cut -d'_' -f2\n");
                     $this->ssh->write($cmd_get_rand . "\n");
                     $out = $this->SSHRead($_SESSION['rprompt'], 0, 1);
                     //exit($out);
                     $_SESSION['pscreen'] = $_SESSION['pscreen2'] = $out;
                     //}
                     $cmd1 = $cmd2 = '';
                     if (strstr($cmd, '----')) {
                         list($cmd1, $cmd2) = explode('----', $cmd, 2);
                     }
                     $cmd_do_rtn = 'screen -S panel -p 0 -X stuff "' . $cmd . '$(echo -ne \'\\015\')"';
                     $cmd_no_rtn = 'screen -S panel -p 0 -X stuff "' . $cmd . '"';
                     $cmd = $cmd2 === 'noenterkey' ? $cmd_no_rtn : $cmd_do_rtn;
                     $this->ssh->write($cmd . "\n");
                     $this->SSHRead($_SESSION['rprompt']);
                     return 'send: ' . $cmd;
                 }
             }
         }
     } else {
         if (strstr($cmd, 'ls ')) {
             $this->ssh->write("{$cmd}{$this->filter_colors}\n");
         } else {
             $this->ssh->write("{$cmd}\n");
         }
         if ($method === 'pscreen') {
             $this->ssh->write("echo -n '{$_SESSION['pscreen']}'\n");
             $out = $this->SSHRead($_SESSION['pscreen'] . $_SESSION['rprompt'], 0, 1);
             $out = $this->MakeSingleSpace($out);
             $out = str_replace("{$_SESSION['rprompt']} echo -n '{$_SESSION['pscreen']}'", '', $out);
             return trim($out);
         }
     }
     $out = $this->SSHRead($_SESSION['rprompt']);
     if ($is_ansi) {
         $ansi = new File_ANSI();
         if ($cmd === 'top') {
             $this->ssh->write('u');
             $this->ssh->write("{$user}\n");
             $out = $this->SSHRead($_SESSION['rprompt']);
             $ansi->appendString(trim($out));
             $out = htmlspecialchars_decode(strip_tags($ansi->getScreen()));
             $this->ssh->write('q');
             $this->SSHRead($_SESSION['rprompt']);
         }
         return $this->SSHClean($out);
     } else {
         $out = $this->SSHClean($out);
         return $out;
     }
 }