簡體   English   中英

如何使用PHP設置交互式SSH會話?

[英]How can I use PHP to setup an interactive SSH session?

我正在嘗試通過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上獲取plink -pw password example.com 但這樣做會帶來安全風險,因為在服務器上運行ps aux任何人都可以在進程列表中看到密碼。

還有一個名為sshpass的程序,它從環境變量或命令參數中獲取密碼並將其傳遞給ssh

看起來問題最好使用PHP的passthru()函數來解決。 在經歷了更多(相當痛苦)的研究之后,我能夠通過這個函數發出一個命令,並且可以通過終端與遠程服務器進行交互,就好像我已經手動運行ssh和svn導出一樣(它們都需要密碼,因此是很好的測試) 。 我要做的是構造一個(可能非常長的)由&&分隔的命令串,並將它們附加到ssh命令的末尾: ssh -t -t -p 22 hostname command1 && command2 ...即使命令正在遠程服務器上執行,輸出也將被發送到Mac OS X中的終端。 看起來這是我一直在尋找的解決方案 - 非常簡單! 感謝所有幫助過我的人。 我給亞歷山大帶來了“綠色選中標記”,因為他是唯一一個不斷回應的人,在推斷問題的最終答案方面非常有幫助。 謝謝亞歷山大!

這是舊的,但對於那里的任何googlers,這是一個使用proc_open的實際解決方案:

Pty描述符在PHP中可用,但必須在編譯期間進行配置(請參閱此10yr舊錯誤報告https://bugs.php.net/bug.php?id=33147

但是在python中,我們沒有那個問題。 因此,不要直接運行ssh命令,而是運行此python腳本:

import sys
import pty

args = " ".join(sys.argv[1:])
pty.spawn(['/usr/bin/ssh', args])

關於python docs中的pty.spawn:

產生一個過程,並將其控制終端與當前進程的標准io連接起來。 這通常用於阻止從控制終端讀取的程序。

你試過phpseclib,一個純PHP的SSH實現嗎?:

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

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

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

你試過PHP SSH2擴展嗎?

我在php上用ssh2擴展編寫了一個ssh客戶端,你可以看看github頁面上的源代碼https://github.com/roke22/PHP-SSH2-Web-Client

請發送一些反饋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM