2011-04-20 56 views
3

我使用的是phpseclib,需要製作一些PHP函數,讓某人以編程方式ssh進入他們的服務器並更改root密碼,並更改可能忘記密碼的用戶的密碼(所以必須記錄以root身份)。如何在使用phpseclib ssh2 exec()函數時設置標誌?

我試過使用libssh2,但發現它有點討厭使用。我現在看着看起來更健壯的phpseclib。但是,當我試圖用 '蘇' 命令,像這樣:

echo $ssh->exec('su'); 

我得到的回覆:

su: must be run from a terminal 

,當我嘗試使用sudo:

echo $ssh->exec('sudo passwd root'); 

我得到錯誤:

sudo: no tty present and no askpass program specified 

無論如何,事實證明,su是d isabled直接ssh訪問,但在看看this article後,事實證明,你可以用下面的命令做到這一點:

ssh -t -t -l 'username' 'host' 'su -' 

那進入我的筆記本電腦終端時,就是終於爲我工作反正(運行Ubuntu的),然後我輸入我的密碼,然後輸入root密碼完成。

從鏈接到網站上面引述:正如我上面用說

Ssh commands (using -t) the remote sshd to establish a 'pseudo-terminal' pipe to the worker process when -t is given.

. ssh does this as long as its stdin is a terminal.

. But if ssh's stdin is a non-terminal, ssh won't direct sshd to establish a
pseudo-terminal unless TWO -t's are given:

echo password | ssh -t -t -l username remote_host

. So with -t -t (from ssh) sshd sets up a pseudo-terminal to the client process.

. The client, whether it be 'tty' or 'su' cannot tell it is connected to a ficticious >terminal:

echo dummystr | ssh -t -t -l username host.com -c ''tty'

echo password | ssh -t -t -l username host.com -c 'su -'

So there is the answer. Use double -t if you are 'su root'ing' on a linux box through an >interactive client ssh like the one from OpenBSD.

因此,它實際上是從終端的工作:

ssh -t -t -l 'username' 'host' 'su -' 

,但我真的希望能夠執行此命令使用phpseclib。唯一的問題是我不知道如何將任何標誌放入exec()函數中。具體來說,我需要輸入-t標誌(兩次)。

我找的年齡並沒有找到任何內容。非常感謝你的幫助。對不起,這篇文章的長度也是如此。 :)

乾杯

+0

您可以共享您正在使用的庫。我不得不穀歌phpseclib,然後發現有兩個SSH實現。 – Till 2011-04-23 01:21:03

+0

啊,對不起。我正在使用我認爲是最新的phpseclib版本:v 1.53 – Joe 2011-04-23 10:15:58

+0

不,我的意思是,phpseclib提到'Net_SSH'和'Net_SSH2'。你在用哪個? :) – Till 2011-04-23 17:03:55

回答

1

我看着phpseclib的Net_SSH2暫時。它看起來像使用套接字連接到服務器。所以沒有辦法通過-t兩次。這不是一個ssh電話。

既然你在你的問題中提到了libssh2,有一個支持它的PEAR包裝器,可能會讓事情變得更容易,代碼目前只在SVN中。 PEAR包裝也稱爲Net_SSH2,但與phpseclib的Net_SSH2(混淆)不同。

退房代碼在這裏:

下載它,與做一個svn簽出:

svn co http://svn.php.net/repository/pear/packages/Net_SSH2/trunk/ ./Net_SSH2 

小例子:

<?php 
require_once './Net_SSH2/Net/SSH.php'; 
$ssh = new Net_SSH2::factory('LibSSH2', array(
    'login_name' => 'user', 
    'password' => 'pass', 
    'hostname' => 'example.org', 
    'command' => 'su -', 
)); 
$ssh->sshExec($std_output, $std_error); 
var_dump($std_output, $std_error); 

會有幫助嗎?

+0

謝謝直到。還沒有時間檢查一下,但我會。我完成後會回覆。 – Joe 2011-04-25 09:56:42

2

如果sudo passwd root需要tty嘗試在phpseclib中讀取()/ write()。例如。

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

$ssh = new Net_SSH2('localhost', 22); 
$ssh->login('username', 'password'); 

$ssh->read('[prompt]'); 
$ssh->write("sudo passwd root\n"); 
$ssh->read('Password:'); 
$ssh->write("Password\n"); 
echo $ssh->read('[prompt]'); 
?> 

其實,我只是從您的其他職務複製/粘貼:php ssh2_exec not executing 'su' command

看起來你在那裏得到一些幫助,然後停止跟進?有人建議你需要添加新行到你的命令。你嘗試過嗎?他們還建議在phpseclib支持論壇發帖。好像建議對我好一點......

+1

我不明白直到哪個例子都會起作用。 su - 提示輸入密碼不是嗎?在這個例子中,哪裏是提供給su的密碼?有SSH的密碼進入服務器,但不是密碼做的... 此外,當我做了谷歌搜索它,我看到net_SSH1和Net_SSH2 phpseclib。不是Net_SSH和Net_SSH2。我認爲這很重要,因爲有兩種不同的SSH協議 - SSH1和SSH2。看起來像一個類會對應一個,另一個類對應另一個類... – rhinestone 2011-04-24 00:22:05

+0

取決於 - 我想你可以使用'sudo'來代替。這可能是更好的選擇。 – Till 2011-04-25 21:25:24

1

你可以通過調用

$ssh->enablePTY(); 

你登錄後啓用僞終端,但Exec之前。這將防止它抱怨缺少的tty。