2009-08-19 27 views
5

Tôi vừa trở thành quản trị viên hệ thống cho cụm nhóm nghiên cứu của mình và, về mặt này, là một người mới. Tôi đang cố gắng thực hiện một vài công cụ để giám sát mạng và cần trợ giúp để bắt đầu triển khai chúng bằng python (tiếng mẹ đẻ của tôi).Giao diện với máy tính từ xa bằng cách sử dụng Python

Ví dụ: tôi muốn xem ai đã đăng nhập vào máy từ xa. Bằng tay, tôi sẽ ssh và who, nhưng làm thế nào tôi sẽ nhận được thông tin này vào một kịch bản cho thao tác? Một cái gì đó như,

import remote_info as ri 
ri.open("foo05.bar.edu") 
ri.who() 

Out[1]: 
hutchinson tty7   2009-08-19 13:32 (:0) 
hutchinson pts/1  2009-08-19 13:33 (:0.0) 

Tương tự cho những thứ như cat /proc/cpuinfo để nhận thông tin bộ xử lý của một nút. Điểm khởi đầu sẽ thực sự tuyệt vời. Cảm ơn.

Trả lời

2

Dưới đây là một đơn giản, giải pháp rẻ tiền để giúp bạn bắt đầu

from subprocess import * 
p = Popen('ssh servername who', shell=True, stdout=PIPE) 
p.wait() 
print p.stdout.readlines() 

lợi nhuận (ví dụ)

['usr  pts/0  2009-08-19 16:03 (kakapo)\n', 
'usr  pts/1  2009-08-17 15:51 (kakapo)\n', 
'usr  pts/5  2009-08-17 17:00 (kakapo)\n'] 

và cho cpuinfo:

p = Popen('ssh servername cat /proc/cpuinfo', shell=True, stdout=PIPE) 
+0

Tốt. Đây là mã đầu tiên tôi làm việc. Câu hỏi: Bạn có biết khi nào kết nối ssh bị chấm dứt không? – physicsmichael

+0

ngay sau khi chạy lệnh. – Peter

+0

@Peter: nếu tôi cần tương tác với máy chủ từ xa (câu trả lời trên lời nhắc, v.v.), tôi nên sử dụng Pexpect hoặc có thư viện tích hợp với chức năng như vậy – legesh

2

Tôi đã sử dụng Pexpect, mà cho phép bạn ssh vào máy, gửi lệnh, đọc đầu ra, và phản ứng với nó, với thành công. Tôi thậm chí còn bắt đầu một dự án mã nguồn mở xung quanh nó, Proxpect - mà chưa được cập nhật theo độ tuổi, nhưng tôi đã ...

0

Điều này bao gồm các căn cứ. Chú ý việc sử dụng sudo cho những thứ cần nhiều đặc quyền hơn. Chúng tôi đã định cấu hình sudo để cho phép các lệnh đó cho người dùng đó mà không cần nhập mật khẩu.

Ngoài ra, hãy nhớ rằng bạn nên chạy ssh-agent để làm cho điều này "có ý nghĩa". Nhưng tất cả trong tất cả, nó hoạt động thực sự tốt. Chạy deploy-control httpd configtest sẽ kiểm tra cấu hình apache trên tất cả các máy chủ từ xa.

#!/usr/local/bin/python 

import subprocess 
import sys 

# The [email protected]: for the SourceURLs (NO TRAILING SLASH) 
RemoteUsers = [ 
     "[email protected]", 
     "[email protected]", 
     ] 

################################################################################################### 
# Global Variables 
Arg        = None 


# Implicitly verified below in if/else 
Command = tuple(sys.argv[1:]) 

ResultList = [] 
################################################################################################### 
for UH in RemoteUsers: 
     print "-"*80 
     print "Running %s command on: %s" % (Command, UH) 

     #---------------------------------------------------------------------------------------------- 
     if Command == ('httpd', 'configtest'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd configtest')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'graceful'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'status'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd status')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('disk', 'usage'): 
       CommandResult = subprocess.call(('ssh', UH, 'df -h')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('uptime',): 
       CommandResult = subprocess.call(('ssh', UH, 'uptime')) 

     #---------------------------------------------------------------------------------------------- 
     else: 
       print 
       print "#"*80 
       print 
       print "Error: invalid command" 
       print 
       HelpAndExit() 

     #---------------------------------------------------------------------------------------------- 
     ResultList.append(CommandResult) 
     print 


################################################################################################### 
if any(ResultList): 
     print "#"*80 
     print "#"*80 
     print "#"*80 
     print 
     print "ERRORS FOUND. SEE ABOVE" 
     print 
     sys.exit(0) 

else: 
     print "-"*80 
     print 
     print "Looks OK!" 
     print 
     sys.exit(1) 
1

Mô-đun pexpect có thể giúp bạn giao tiếp với ssh. Ít hay nhiều, đây là ví dụ của bạn.

child = pexpect.spawn('ssh servername') 
child.expect('Password:') 
child.sendline('ABCDEF') 
(output,status) = child.sendline('who') 
+0

Điều này là tốt cho ví dụ, nhưng xin lưu ý rằng việc xác thực như thế này thường được coi là một ý tưởng tồi. Xác thực SSH dựa trên khóa công khai an toàn hơn ... Và ít nhất bạn không phải đảm bảo rằng tập lệnh của bạn không thể đọc được trên thế giới sau mỗi lần chỉnh sửa tình cờ. – drdaeman

+0

Đầu ra của 'child.sendline ('who')' có vẻ là số 4 ... Tôi đang thiếu gì? – physicsmichael

+0

Tôi nhận được cùng với pexpect, những gì mang lại cho nó? – Jon

0

Vải là một cách đơn giản để tự động hóa một số công việc đơn giản như thế này, phiên bản Tôi hiện đang sử dụng cho phép bạn quấn lên lệnh như vậy:

run('whoami', fail='ignore') 

bạn có thể chỉ định tùy chọn cấu hình (config .fab_user, config.fab_password) cho mỗi máy bạn cần (nếu bạn muốn tự động xử lý mật khẩu tên người dùng). Thông tin

Thông tin thêm về Vải ở đây:

http://www.nongnu.org/fab/

Có một phiên bản mới mà là nhiều Pythonic - Tôi không chắc chắn cho dù đó sẽ là tốt hơn cho bạn int trường hợp của mình ... công trình tốt cho tôi lúc này ...

1

Nếu nhu cầu của bạn phát triển quá mức đơn giản "ssh remote-host.example.org who" thì có một thư viện python tuyệt vời, được gọi là RPyC. Nó có cái gọi là chế độ "cổ điển" cho phép hầu như minh bạch thực thi mã Python trên mạng với một vài dòng mã. Công cụ rất hữu ích cho môi trường đáng tin cậy.

Dưới đây là một ví dụ từ Wikipedia:

import rpyc 
# assuming a classic server is running on 'hostname' 
conn = rpyc.classic.connect("hostname") 

# runs os.listdir() and os.stat() remotely, printing results locally 
def remote_ls(path): 
    ros = conn.modules.os 
    for filename in ros.listdir(path): 
     stats = ros.stat(ros.path.join(path, filename)) 
     print "%d\t%d\t%s" % (stats.st_size, stats.st_uid, filename) 

remote_ls("/usr/bin") 

Nếu bạn quan tâm, có a good tutorial on their wiki. Tuy nhiên, tất nhiên, nếu bạn hoàn toàn ổn với cuộc gọi ssh bằng cách sử dụng Popen hoặc chỉ không muốn chạy daemon "RPyC" riêng biệt, thì đây chắc chắn là quá mức cần thiết.

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