需要从服务器1读取服务器2(该服务器上设置了防火墙)上的内容,但是需要通过访问服务器1来完成一些文件的显示~~~耗费了我好几天的时间终于攻克~~~~哈哈哈~~~
1.首先需要解决如何使用PHP从服务器1登陆到服务器2上的问题
方法1:(此方法在我的服务器上运行失败,有需要的可以尝试)
可以参照博客
https://blog.csdn.net/watson2016/article/details/52474001
我尝试了安装之后,在网页测试读取php_info 的内容时,总是不显示ssh2已安装的状态。。。各种切换ssh2的版本,不行。放弃
方法2:使用phpseclib集成方式直接登陆服务器
https://sourceforge.net/projects/phpseclib/files/phpseclib1.0.11.zip/download
下载phpseclib1.0.11.zip并上传到服务器1上,解压到php文件的目录(注意文件权限)。
验证是否作用的方法:
<?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); if (!$ssh->login('username', 'password')) { exit('Login Failed'); } echo $ssh->exec('pwd'); echo $ssh->exec('ls -la'); ?>注意替换成能访问的服务器的域名或者ip。
2.解决第一步之后,编写PHP运行shell命令
#!/usr/bin/php -q <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('10.18.217.160'); if (!$ssh->login('root', 'root')) { exit('Login Failed'); }
if(isset($_POST['username'])) { $username = trim($_POST['username']); } echo "<pre>"; echo $ssh->exec("ls"); echo "</pre>";
?>
在浏览器中运行该php文件,能够正常运行。但是-------------问题来了,我需要动态获取输入的username参数~~~何解。。。尝试通过shell脚本动态获取参数值~~
3. 修改文件运行shell脚本
#!/usr/bin/php -q <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('10.18.217.160'); if (!$ssh->login('root', 'root')) { exit('Login Failed'); }
if(isset($_POST['username'])) { $username = trim($_POST['username']); } echo "<pre>"; echo $ssh->exec("/bin/bash /usr/tools/test.sh $username"); echo "</pre>";
?>
另一个问题来了,在浏览器中死活没有内容输出啊~~~但是在服务器上运行这个php文件是有内容输出的,最后发现我运行这个文件的权限是root权限,而实际该文件执行者为普通用户。
ps:如何确定php文件的运行用户和属组
<?php exec('whoami'); echo shell_exec("id -a"); ?>
4.确定了文件权限的问题在服务器2上给php文件的运行用户添加需要执行的权限(daemon是我的php文件运行的用户)
vim /etc/sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALL daemon ALL=(ALL) NOPASSWD:ALL#!/usr/bin/php -q <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('10.18.217.160'); if (!$ssh->login('root', 'root')) { exit('Login Failed'); }
if(isset($_POST['username'])) { $username = trim($_POST['username']); } echo "<pre>"; echo $ssh->exec("sudo su root -s /bin/bash /usr/tools/test.sh $username"); echo "</pre>";
?>
5.再次执行文件,仍然没有内容(抓狂~~~~)
各种百度最后尝试将php.ini的安全模式打开
safe_mode = off打开
小心翼翼的试了一下,成功了!!!!!
6.可以正常显示文件内容~~~~大功告成