2013-05-10 46 views
6

Cố gắng sử dụng pybonjour nhưng không chắc chắn nếu đó là những gì tôi cần. https://code.google.com/p/pybonjour/Đang cố gắng khám phá các thiết bị iOS trên mạng của tôi bằng cách sử dụng tập lệnh python

Tôi muốn tự động phát hiện thiết bị iOS xuất hiện trên mạng của mình, sẽ chạy tập lệnh dựa trên điều này, nhưng trước tiên tôi chỉ muốn khám phá thiết bị iOS ngay khi nó xuất hiện/biến mất mạng wifi của tôi.

Vì vậy, câu hỏi, làm cách nào để thực hiện việc này? chạy trên một cửa sổ máy với python27 và gói pybonjour được cài đặt, hai ví dụ làm việc từ trang pybonjour, nhưng tôi chạy lệnh nào để khám phá thiết bị iOS bằng cách sử dụng các tập lệnh được đưa vào mạng của tôi? hoặc sẽ chỉ dịch vụ khám phá này chạy trên máy tính của tôi mà tôi chạy kịch bản này trên!

Nếu tôi đi sai hướng, vui lòng cho tôi biết, tôi dường như không thể tìm thấy tài liệu về gói này!

python browse_and_resolve.py xxxxxx 

Thx Matt.

Update ...

Bài viết này và trình duyệt là hữu ích, http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/ trong việc tìm kiếm các dịch vụ tôi cần phải tìm kiếm.

ví dụ; (Điều này đã phát hiện ra táo tv của tôi, không phải ở atm nhà nên không thể kiểm tra những gì được gọi là iphone! Tôi giả iphone!

python browse_and_resolve.py _appletv._tcp 

Ngoài ra nếu bạn có cửa sổ tiện ích dns-sd.exe này sẽ tìm kiếm tất cả . các dịch vụ có sẵn trên mạng tôi đã sử dụng này để tìm thấy những gì tôi đang tìm kiếm

dns-sd -B _services._dns-sd._udp 

Update ...

"Bonjour được sử dụng theo hai cách: -. xuất bản một dịch vụ - phát hiện (duyệt web cho) các dịch vụ có sẵn ".

Đối với những gì tôi muốn làm, tôi không nghĩ rằng nó sẽ làm việc như ipad/iPhone sẽ không quảng cáo một dịch vụ trừ khi tôi đang chạy một ứng dụng quảng cáo một (hoặc jailbreak iPhone/ipad của tôi và sau đó ssh sẽ được mở). Còn ý tưởng nào nữa không?

+0

Trước tiên, bạn đã cài đặt Bonjour cho Windows, phải không? – abarnert

+0

yep. Hãy suy nghĩ tôi đã có nó. Mệt mỏi một vài lệnh khác như thế nào. python browse_and_resolve.py _airplay._tcp và phát hiện ra TV của tôi là –

+1

Trong khi đó, điểm của Bonjour là khám phá _services_, chứ không phải _devices_. Bạn sẽ làm gì với một thiết bị nếu bạn phát hiện ra nó? Câu trả lời cho điều đó sẽ cho bạn biết dịch vụ nào bạn định sử dụng, cho bạn biết dịch vụ nào cần duyệt. Ví dụ, nếu bạn muốn 'ssh' cho bất kỳ iPhone đã bẻ khóa nào trên mạng LAN của bạn, hãy duyệt tìm' _ssh._tcp'. – abarnert

Trả lời

4

Những gì bạn đang cố gắng làm (a) có thể không thực hiện được, và (b) có thể sẽ không được sử dụng nhiều nếu có thể.

Điểm Bonjour là khám phá các dịch vụ , không phải thiết bị. Tất nhiên mỗi dịch vụ được cung cấp bởi một số thiết bị, do đó gián tiếp bạn có thể khám phá các thiết bị với nó ... nhưng chỉ bằng cách khám phá một dịch vụ mà họ đang quảng cáo.

Theo như tôi biết, (ngoại trừ Apple TV) không quảng cáo bất kỳ dịch vụ nào, ngoại trừ khi bạn đang chạy một ứng dụng sử dụng Bonjour để tìm ứng dụng tương tự trên các máy khác. (Ngoại trừ các thiết bị bẻ khóa, thường quảng cáo SSH, AFP, v.v.)

Có một số cách, gián tiếp, nhận danh sách tất cả các dịch vụ đang được quảng cáo bởi bất kỳ ai trên mạng. Cách đơn giản nhất có thể là sử dụng Bonjour Browser for Windows. (Tôi chưa bao giờ thực sự sử dụng nó, nhưng công cụ Mac ban đầu và cổng Java, cả hai mà tôi có sử dụng, cả hai đều đề xuất cổng Windows này cho người dùng Windows.) Fire it up và bạn sẽ nhận được danh sách các dịch vụ và bạn có thể nhấp vào từng cái để xem chi tiết.

Vì vậy, bạn có thể xác minh rằng iPhone và iPad của bạn không quảng cáo bất kỳ dịch vụ nào, điều này sẽ cho thấy rằng không có cách nào để phát hiện chúng thông qua Bonjour.

Trong khi đó, ngay cả khi bạn đã làm tìm thiết bị, bạn định làm gì? Có lẽ bạn muốn giao tiếp với thiết bị theo một cách nào đó, đúng không? Bất kể dịch vụ nào bạn đang cố gắng liên lạc với… chỉ cần duyệt dịch vụ đó — và sau đó, nếu thích hợp, hãy lọc xuống thiết bị iOS. Điều đó phải dễ dàng hơn việc duyệt qua các thiết bị iOS và sau đó lọc xuống những thiết bị có dịch vụ bạn muốn.


Đối liệu có cách nào để phát hiện các thiết bị iOS ... Vâng, có ít nhất hai khả năng. Tôi không biết liệu một trong hai thiết bị đó có hoạt động hay không, nhưng…

Đầu tiên, ngay cả khi thiết bị iOS không quảng cáo bất kỳ thứ gì cho bạn, tôi cho rằng nó đang duyệt dịch vụ bạn có thể quảng cáo. Làm cách nào khác để thấy rằng có một Apple TV cho AirTunes, iTunes trên mạng LAN để đồng bộ hóa, v.v.?

Vì vậy, hãy sử dụng Bonjour Browser để nhận danh sách tất cả các dịch vụ mà máy tính để bàn chạy trên iTunes, Apple TV, v.v. đang quảng cáo. Sau đó tắt tất cả các dịch vụ trên máy tính để bàn của bạn, sử dụng PyBonjour để quảng cáo bất kỳ dịch vụ nào có vẻ hợp lý (và, nếu cần, hãy sử dụng netcat để đưa những người nghe tầm thường vào các cổng bạn quảng cáo). Sau đó bật iPhone của bạn và xem nó có kết nối với bất kỳ thiết bị nào trong số đó hay không. Bạn có thể muốn để nó chạy trong một thời gian, hoặc tắt WiFi và bật lại.(Tôi đoán rằng, mặc dù khuyến nghị của Apple, nó không duyệt liên tục cho hầu hết các dịch vụ, nhưng chỉ cần kiểm tra mỗi một lần trong một thời gian và/hoặc mỗi khi thay đổi trạng thái mạng của nó. Thật không may, ngay cả khi bạn có thể tìm thấy một dịch vụ mà tất cả các thiết bị iOS sẽ kết nối, bạn có thể không phân biệt được thiết bị iOS với những người khác chỉ bằng cách nhận các kết nối ở đó. Ví dụ, tôi khá chắc chắn rằng bất kỳ Mac hoặc Windows hộp chạy iTunes sẽ nhấn lên dịch vụ AirTunes giả của bạn, và bất kỳ máy Mac sẽ nhấn AirPrint của bạn, và như vậy. Vậy, làm thế nào để bạn phân biệt được điều đó với iPhone? Bạn có thể cần phải thực sự phục vụ đủ các giao thức để có được thông tin trong số họ. Điều này sẽ đặc biệt khó khăn đối với các giao thức không có giấy tờ của Apple.

Nhưng hy vọng bạn sẽ nhận được may mắn, và sẽ có một cái gì đó mà tất cả các thiết bị iOS, và không có gì khác, sẽ muốn nói chuyện với. iTunes Sync có vẻ như khả năng hiển nhiên.

Ngoài ra, có một vài điều mà chúng để phát hoặc chúng không hoạt động. Bạn không thể truy cập mạng WiFi mà không có chương trình phát sóng. Và hầu hết các mạng Wi-Fi gia đình đều sử dụng DHCP, điều đó có nghĩa là chúng phải phát tán DHCP khám phá (và yêu cầu). Có thể có một số loại chữ ký heuristic bạn có thể phát hiện trong các tin nhắn này. Nếu không có gì khác, việc bật DDNS sẽ khiến thiết bị gửi tên máy chủ của nó và bạn có thể đoán dựa trên điều đó (ví dụ: trừ khi bạn thay đổi giá trị mặc định, hostname.lower().endswith('iphone')).

Cách dễ nhất có thể là thiết lập máy tính để bàn làm điểm truy cập chính cho mạng gia đình của bạn. Tôi tin rằng nó đơn giản như việc bật Chia sẻ Kết nối Internet ở đâu đó trong bảng điều khiển. (Thiết lập như là một đại lý DHCP relay là ít hơn nhiều so với việc là một bộ định tuyến đầy đủ, nhưng tôi không có ý tưởng làm thế nào bạn thậm chí có thể bắt đầu làm điều đó trên Windows.) Sau đó, bạn có thể nắm bắt các chương trình phát sóng DHCP (hoặc, thất bại, Các chương trình phát sóng 802.11) khi chúng vào. Wireshark sẽ chụp và phân tích các tin nhắn cho bạn một cách dễ dàng, vì vậy bạn có thể xem và xem liệu có vẻ như điều này đáng để theo đuổi xa hơn không. (Xem RFC 2131 để biết chi tiết về định dạng không rõ ràng từ các mô tả một lớp bí mật của Wireshark.)

Bạn có thể thực hiện việc này thậm chí xa hơn và xem kết nối internet mỗi máy chủ kết nối với internet. Bất kỳ thiết bị nào định kỳ kiểm tra App Store, máy chủ nâng cấp iOS, v.v ... À, trừ khi một trong những người dùng jailbreak trong nhà của bạn, đó có thể là một chiếc iPhone, phải không? Nhược điểm là một số kiểm tra này có thể là rất định kỳ và phát hiện iPhone 6 giờ sau khi kết nối với mạng của bạn không phải là rất thú vị.

+0

Thx, chỉ cần cố gắng để phát hiện khi một người là nhà hay không, sử dụng có iPhone. Tôi cam sau đó chạy các kịch bản dựa trên điều này trên máy chủ của tôi. Sẽ có một cái nhìn tốt ở tất cả các tùy chọn vào buổi sáng. –

+0

vâng, đã nghĩ rằng, sẽ xem như là một phương sách cuối cùng. –

+0

Không thể bẻ khóa, chạy hệ điều hành mới nhất. –

3

Sử dụng python-nmap thay vì Bonjour. Hoặc bạn có thể sử dụng pyzeroconf (Bonjour là một triển khai của zeroconf) nhưng nó là một chút lỗi thời (nhưng vẫn nên làm việc).

python-nmap có lẽ là đơn giản nhất, chúng ta hãy giả sử bạn muốn tìm tất cả các thiết bị kết nối có 'iPhone' hoặc 'iPad' tại hostname của họ (chỉ là một đơn giản khái niệm ):

import nmap 

... 

def notify_me(ip, hostname): 
    print("I found an iOS device! IP Address: %s, Hostname: %s" % (ip, hostname)) 

iOS_device_list = ['iPhone', 'iPad'] 
iOS_devices_on_net = {} 
nm = nmap.PortScanner() 

# scan ip range 
for i in range(2, 50, 1): 
    ip = "192.168.1." + str(i) 
    # specify ports to scan 
    nm.scan(ip, '62078') # Matt mentioned that it picks up iphone-sync on this port 
    hostname = nm[ip].hostname() 
    for device in iOS_device_list: 
    if device.lower() in hostname.lower(): 
     iOS_devices_on_net.update({ip:hostname}) 
     notify_me(ip, hostname) 

# show all iOS devices in ip range 
print iOS_devices_on_net 

Giới hạn của phương pháp này là nó dựa vào cá nhân không thay đổi tên máy chủ của họ ban đầu bao gồm tên và tên thiết bị của họ. Nó cũng giả định rằng có một cổng nghe trên thiết bị iOS sẽ trả về tên máy chủ (điều này có thể không phải là trường hợp). Bạn có thể sử dụng osscan được ưu tiên bằng cách chạy nó dưới dạng lệnh bằng thư viện python-nmap. Đây rõ ràng là một cách tiếp cận tốt hơn nhiều. Khái niệm của tôi ở trên chỉ là một ví dụ đơn giản về cách nó có thể được sử dụng.

Sử dụng nmap từ dòng lệnh (Tôi tin rằng python-nmap có nm.commandline() phương pháp) là đơn giản nhất:

nmap -O -v ip 

Cũng thử thêm --osscan-guess; --fuzzy cho kết quả tốt nhất. Ví dụ:

nmap -O -v --osscan-guess ip 

Sau đó, chỉ tìm kiếm đầu ra cho từ khóa thiết bị iOS (xem this example). Nó có thể đọc được. Lưu ý rằng bạn sẽ cần phải chạy tất cả điều này như một quản trị viên để nó hoạt động đúng (Windows: runas, khác: sudo).

+0

Tôi khá chắc chắn rằng bạn cần phải 'quét' từng IP trước khi' nm [ip] 'hoạt động. Và tất nhiên bạn phải quét các cổng phù hợp để đoán tên máy chủ, mà ... Tôi không chắc chắn cổng nào bạn có thể nhận được từ đó một chiếc iPhone sẽ mở. – abarnert

+0

@abarnert bạn là chính xác, tôi đã viết điều này ra khỏi đỉnh đầu của tôi. Cập nhật câu trả lời – Dan

+0

Điều đó giải quyết được vấn đề đầu tiên. Và thêm một chút về '-O' là tốt đẹp (nhưng bạn có thể muốn thêm' --osscan-guess' hoặc '--fuzzy' vào dòng' -O' của bạn). Tuy nhiên, iPhone có bất kỳ cổng mở nào trong khoảng 22-443 không? Nếu không, không có gì để 'nmap' tiếp tục (ngoại trừ thời gian). (Ngoài ra, không phải ví dụ bạn đưa ra cũng như tài liệu liên kết để hiển thị từ khóa cần tìm cho iOS… nhưng bạn có thể giải quyết điều đó bằng cách chỉ chạy nó trên iPhone và xem chuỗi; không khó phân tích cú pháp theo cách thủ công.) – abarnert

Các vấn đề liên quan