PHP保持SSH会话活动/存储

PHP保持SSH会话活动/存储,php,codeigniter,ssh,phpseclib,Php,Codeigniter,Ssh,Phpseclib,我正在使用Codeigniter,下面是我用来通过SSH从设备获取一些信息的代码。整个过程大约需要2.2秒来执行,其中2秒是登录过程。是否有任何方法可以存储或保持会话至少在一定时间内保持活动状态?? 我用于连接的库是phpseclib $time = microtime(true); $this->ssh2->Net_SSH2('XX.XX.XX.XX'); if (!$this->ssh2->login('XXXX', '

我正在使用Codeigniter,下面是我用来通过SSH从设备获取一些信息的代码。整个过程大约需要2.2秒来执行,其中2秒是登录过程。是否有任何方法可以存储或保持会话至少在一定时间内保持活动状态?? 我用于连接的库是
phpseclib

        $time = microtime(true);
        $this->ssh2->Net_SSH2('XX.XX.XX.XX');
        if (!$this->ssh2->login('XXXX', 'XXXXXXXX')) {
            exit('Login Failed');
        }
        echo (microtime(true) - $time) . ' elapsed';
        $string = $this->ssh2->exec('/usr/www/status.cgi');

让SSH登录而不提示您输入密码的唯一方法是使用公钥加密

抬头看。若要在网站崩溃时引用该网站,请执行以下操作:

你的目标

您希望使用Linux和OpenSSH自动化您的任务。因此,您需要从主机A/用户A自动登录到主机B/用户B。您不想输入任何密码,因为您想从shell脚本中的调用ssh

怎么做

首先以用户身份登录并生成一对身份验证密钥。不要输入密码短语:

a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa): 
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A
现在使用ssh以用户b的身份在b上创建一个目录~/.ssh(该目录可能已经存在,这很好):

最后将a的新公钥附加到
b@B:.ssh/authorized_keys
并最后一次输入b的密码:

a@A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password: 
从现在起,您无需密码即可从A以B身份登录到B:

a@A:~> ssh b@B
除此之外,将PHP进程后台监控以便在后台维护其会话是一个坏主意:

  • PHP对此不好
  • 第二件事发生了:停电,重启,…,你的安装程序不见了。到那时,你可能已经忘记了它会做这样的事情

  • 你真的是指服务器在2秒不活动后断开会话的连接吗?或者你实际上面临什么问题?我想每15-20秒执行一次命令,而不必每次都登录来运行该命令。基本上,这将是一个cron任务,每15-20秒从设备获取一次统计数据。问题是什么?为什么不把它放在cron中呢?我确实在cron中有它,但是每次运行函数时我都必须登录。我想避免每15秒登录一次。你不能启动/停止PHP脚本并让连接保持活动状态。您必须有一个持久套接字来保持连接打开,而PHP的
    pfsockopen
    并不能真正完成此任务。我想你可以让脚本永远运行下去。每次通话后让它睡眠15秒。此时,可能需要从phpseclib获取keep alive(即睡眠7秒,发送keep alive并再睡眠7秒)。
    a@A:~> ssh b@B