加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何使用PHP设置交互式SSH会话?

发布时间:2020-12-13 22:01:24 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试通过Mac OS X 10.6上的命令行使用 PHP建立到远程服务器的交互式SSH连接.我目前正在使用PHP的proc_open函数来执行以下命令: ssh -t -t -p 22 user@server.com 这几乎可行. -t -t选项应该强制它们几乎做的伪终端.我可以输入SSH密码并按Enter键.但是
我正在尝试通过Mac OS X 10.6上的命令行使用 PHP建立到远程服务器的交互式SSH连接.我目前正在使用PHP的proc_open函数来执行以下命令:

ssh -t -t -p 22 user@server.com

这几乎可行. -t -t选项应该强制它们几乎做的伪终端.我可以输入SSH密码并按Enter键.但是,按下后,终端似乎只是挂起.没有输出,没有任何东西 – 就像SSH会话失败一样.我无法运行命令或任何东西,必须使用Ctrl C杀死整个事件.我知道登录成功,因为我可以执行命令,如ssh -t -t -p 22 user@server.com“ls -la”并获得正确的输出.

我认为这个问题必须与我在proc_open调用中使用标准管道的事实有关,所以我用pty替换它们.我收到以下错误:“此系统不支持pty伪终端……”

Mac OS X根本不支持pty或伪终端吗? (我很擅长使用所有这些shell术语).

这是PHP代码:

$descriptorspec = array(0 => array("pty"),1 => array("pty"),2 => array("pty"));  
$cwd = getcwd();  
$process = proc_open('ssh -t -t -p 22 user@server.com',$descriptorspec,$pipes,$cwd);  
if (is_resource($process))  
{  
    while (true)  
    {  
        echo(stream_get_contents($pipes[1]));  
        $status = proc_get_status($process);  
        if (! $status["running"])  
            break;  
    }  
}

(对不起 – 我不能为我的生活弄清楚SO的格式说明……)

我究竟做错了什么?为什么我不能用pty?这在Mac OS X上是不可能的吗?谢谢你的帮助!

解决方法

您应该使用公钥身份验证,而不是尝试以编程方式绕过交互式密码身份验证.

密码提示应该是从tty使用的,我相信它是故意难以使用的.此外,-t -t参数仅在连接到远程主机后才会生效.我不相信PHP函数proc_open()可以在虚拟终端内运行命令.

要设置公钥认证:

# Generate keypair
ssh-keygen -t rsa

# Copy public key to server
scp ~/.ssh/id_rsa.pub example.com:.ssh/authorized_keys

# Now you shouldn't be prompted for a password when connecting to example.com
# from this host and user account.
ssh example.com

# Since the web server (and thus PHP) probably has its own user account...
# Copy the ~/.ssh/id_rsa file somewhere else
cp ~/.ssh/id_rsa /some_path/id_rsa

# Change ownership of the file to the web server account
chown www-data:www-data /some_path/id_rsa

# Fix the file permissions (ssh ignore the keyfile if it is world readable)
chown 600 /some_path/id_rsa

# Try connecting to the server through the web server account
su -c "ssh -i /some_path/id_rsa -o UserKnownHostsFile=/some_path/known_hosts example.com" www-data

# Add the host to the known hosts file when prompted

或者,您可以使用plink(PuTTY for Linux的一部分)而不是OpenSSH,因为它可以在命令行plink -pw password example.com上获取密码.但这样做会带来安全风险,因为在服务器上运行ps aux的任何人都可以在进程列表中看到密码.

还有一个名为sshpass的程序,它从环境变量或命令参数中获取密码并将其传递给ssh.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读