晚上好,
目前我正在开发一个使用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/更好?
答案 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");