【问题标题】:PHP How to execute a command and get its outputPHP 如何执行命令并获取其输出
【发布时间】:2021-03-27 07:56:21
【问题描述】:

我需要对我的服务器执行一个命令并在 php 中将结果作为输出获取

<?php
    $socket = fsockopen("ip", 22); 
    ($socket ? null : die("<p>Failed to connect"));
 
    fwrite($socket, " username\n"); 
    fwrite($socket, " password\n");
 
    $command = " netstat -anp | grep :650 | grep ESTABLISHED | wc -l\n";
    fwrite($socket, $command . "\n");
    echo "<pre>$result</pre>";
    
    sleep(1); 
    // Close connection
    fclose($socket);    
?>

【问题讨论】:

  • PHP 中没有运行命令的system 函数吗?
  • 我正在从另一台服务器注入命令
  • 你是如何注入它的?你如何连接到其他服务器?你自己做的时候会输入命令吗?如果是这样,你输入哪个命令?
  • 我通过 fsockopen 连接到我的服务器检查我上面的代码
  • 不,您不是,您正在尝试通过 fsockopen 连接到您的服务器,但它不起作用。有没有你在服务器 1 上输入的命令让服务器 2 运行命令?

标签: php linux sockets fwrite fsockopen


【解决方案1】:

在您的服务器上运行?

需要控制台输出? 你可以使用:

exec() 只返回生成输出的最后一行。

shell_exec() 在命令完成运行时返回命令的完整输出。

system() 立即显示所有输出,并用于显示文本。

【讨论】:

  • 不在同一台服务器上我正在使用另一台服务器连接到我的服务器
【解决方案2】:

ssh连接需要安装php-ssh2。 然后这段代码可以工作,但需要一些改进:

$ssh = ssh2_connect($host); //default port is 22
if (false === $ssh) {
    die('connection failed');
}

$auth = @ssh2_auth_password($ssh, $user, $pwd); // with user and password
if (false === $auth) {
    die('authentication failed');
}


$command = "ls\r\n";

$shell=ssh2_shell($ssh, 'xterm');
fwrite( $shell, 'ls'.PHP_EOL);

while (!feof($shell)){
    echo fgets($shell).PHP_EOL; // this return all the lines since the begining of the session
 }

ssh2_disconnect();

【讨论】:

    【解决方案3】:

    或者,如果您在服务器上安装了 ssh,您可以使用 shell_exec 来执行 ssh 命令。

    因此,如果您有 ssh 密钥(或制作它们),请将它们移到项目中但移出 webroot

    cp ~/.ssh/id_rsa /path/to/script/ssh_keys/id_rsa
    cp ~/.ssh/id_rsa.pub /path/to/script/ssh_keys/id_rsa.pub
    
    # make .htaccess (or dont put in webroot)
    echo "deny from all" > /path/to/script/ssh_keys/.htaccess
    

    然后你可以做一个像下面这样的简单脚本,如果你没有 ssh 密钥(eek),然后使用密码:

    <?php
    // with ssh key
    echo `ssh -i ./ssh_keys/id_rsa username@<IP> /bin/bash << EOF
    netstat -anp | grep :650 | grep ESTABLISHED | wc -l
    EOF`;
    
    // with password (requires passh)
    echo `passh -p password ssh username@<IP> /bin/bash << EOF
    netstat -anp | grep :650 | grep ESTABLISHED | wc -l
    EOF`;
    

    你已经给出了一个硬编码脚本的例子,我假设它是一个硬编码脚本,如果不是并且值或命令是用户定义的,那么你不应该运行 SSH cmds,因为它太冒险了,而是考虑制作一个 REST API 或使用 RPC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多