PHP通过ssh与公钥连接并切换用户执行命令

时间:2014-01-11 20:49:38

标签: php ssh switch-statement

晚上好,

目前我正在开发一个使用PHP的脚本。 PHP使用" ssh2_connect"使用Public Key作为连接远程主机的命令。此外,我使用ssh2_exec来执行user_a的一些命令。我想切换到user_b来执行antoher命令和 可选择返回user_a。

$connection = ssh2_connect('192.168.2.100', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file($connection, 'user_a', './ssh/id_rsa.pub', './ssh/id_rsa'))
{
  echo "Public Key Authentication Successful\n<br />";
}
else
{
  die('Public Key Authentication Failed');
}



if(!($stream = ssh2_exec($connection, "sudo su user_b ; cd ~ ; ls -la" )) )
{
    echo "fail: unable to execute command\n";
}
else
{

    stream_set_blocking( $stream, true );

    echo stream_get_contents($stream);

}



ssh2_exec($connection, 'exit');
unset($connection);

问题是正常命令运行良好但切换用户在超时时返回(sudo文件被编辑)...我已经尝试用fwrite发送命令。 ; 是否有任何解决方案可以使用一些命令(自己的PHP代码)解决这个问题,还是使用http://phpseclib.sourceforge.net/更好?

1 个答案:

答案 0 :(得分:0)

所以你可能会这样做:

echo password | sudo su user_b ; cd ~ ; ls -la

这样做的缺点是它会出现在你的bash历史中。

这是一种使用phpseclib的方法,而不会让它出现在你的bash历史记录中而不会出现在你的bash历史中:

以下是使用phpseclib /交互模式获取密码的方法:

<?php
include('Net/SSH2.php');
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('./ssh/id_rsa');

$ssh = new Net_SSH2('192.168.2.100');
if ($ssh->login('user_r', $rsa)) {
    echo "Public Key Authentication Successful\n<br />";
} else {
    die('Public Key Authentication Failed');
}

echo $ssh->read('username@username:~$');
$ssh->write("sudo su user_b\n");
$output = $ssh->read('#[pP]assword[^:]*:|username@username:~\$#', NET_SSH2_READ_REGEX);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
    $ssh->write("password\n");
    echo $ssh->read('username@username:~$');
}

$ssh->write("cd ~\n");
echo $ssh->read('username@username:~$');

$ssh->write("ls -la\n");
echo $ssh->read('username@username:~$');
?>

如果你不关心bash历史,那么如何使用phpseclib:

<?php
include('Net/SSH2.php');
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('./ssh/id_rsa');

$ssh = new Net_SSH2('192.168.2.100');
if ($ssh->login('user_r', $rsa)) {
    echo "Public Key Authentication Successful\n<br />";
} else {
    die('Public Key Authentication Failed');
}

echo $ssh->exec("sudo su user_b ; cd ~ ; ls -la");