2011-06-08 45 views
1

我想通過它的Telnet功能訪問攝像機。問題是,它有密碼保護。這在通過終端進行時沒有問題,因爲我只是使用telnet 10.30.blah.blah,然後在出現提示時輸入我的密碼。但在PHP中,我沒有看到輸入密碼的機會。如何使用fsockopen()以密碼打開Telnet連接?

$con = fsockopen("10.30.blah.blah", 25); 
$msg = "camera move left"; 
fwrite($con, $msg); 

有人有什麼想法嗎?

UPDATE:我試着用@ffreak說fputs輸出密碼,但仍然無濟於事。如果我確實在劇本中嘗試了終端,它就會起作用。下面是現在的代碼:

$con = fsockopen("10.30.blah.blah", 23, $errno, $errstr, 30); 
$pass = "admin"; 
sleep(5); 
fputs($con, $pass); 
sleep(5); 
$msg = "camera move left"; 
fputs($con, $msg); 

UPDATE:發現我需要一個\r$msg變量的末尾。謝謝您的幫助!

回答

1

你只是輸出它。我見過的一些例子使用fputs。您可能需要睡一秒才能確定提示符出現。在fsockopen手冊頁上的評論中實際上有一個示例:http://php.net/manual/en/function.fsockopen.php

真的,儘管我建議尋找一個模塊來做到這一點。快速谷歌顯示有幾個在那裏。我不想推薦一個特定的,因爲我沒有使用任何一個。

+0

爲什麼睡覺?爲什麼不檢查提示是否實際出現(已收到)而不是使用競爭條件? – netcoder 2011-06-08 14:26:41

+0

@netcoder - true。我沒有說得很清楚。人們需要檢查它,如果它沒有出現就進入睡眠狀態,然後再次檢查,直到它達到或者達到某種超時。希望預構建的模塊可以處理所有這些:) – Cfreak 2011-06-08 14:29:36

+1

@netcoder如何檢查提示? – AndyL 2011-06-08 15:30:45

1

使用proc_open來運行telnet而不是嘗試實現自己的協議棧(遠不止是從套接字讀取和寫入),這將是一個更好的主意。事實上,telnet本質上是不安全的,應儘可能地避免。 (沒有SSL的基本http身份驗證也是一樣糟糕)。

然而,與SMTP或HTTP不同,它不是一個非常複雜的協議 - 使用套接字實現簡單的客戶端應該相當簡單。您提供的代碼既不會讀取用戶名/密碼提示,也不會將回複寫入套接字 - 因此,無論您如何通過telnet登錄或代碼段都無關緊要,您都有一些非常奇怪的想法。

Cfreak說:「你可能要睡了第二次,以確保及時出現」 - 這是不正確的 - 你必須等待用戶名提示,密碼提示和發送前的初始CLI提示使用telnet進行響應。事實上,編寫一種完整的編程語言(expect)是爲了解決telnet中這種奇怪的行爲。

和順便說一句,telnet運行在端口23上 - 端口25用於SMTP