2010-09-21 38 views
5

Tôi đang sử dụng một kịch bản lệnh pexpect đơn giản để ssh đến một máy từ xa và lấy một giá trị được trả về bởi một lệnh. Có cách nào, pexpect hoặc sshwise tôi có thể sử dụng để bỏ qua lời chào unix? Đó là, từPexpect - im lặng đầu ra kết nối ssh

child = pexpect.spawn('/usr/bin/ssh %[email protected]%s' % (rem_user, host)) 
    child.expect('[pP]assword: ', timeout=5) 
    child.sendline(spass) 
    child.expect([pexpect.TIMEOUT, prompt]) 
    child.before = '0' 
    child.sendline ('%s' % cmd2exec) 
    child.expect([pexpect.EOF, prompt]) 

    # Collected data processing 
    result = child.before 
    # logon to the machine returns a lot of garbage, the returned executed command is at the 57th position 
    print result.split('\r\n') [57] 
    result = result.split('\r\n') [57] 

Làm thế nào tôi có thể chỉ đơn giản là lấy giá trị trả về, bỏ qua, các "đăng nhập thành công cuối" và "(c) Bản quyền" thứ và mà không cần phải quan tâm với giá trị đúng vị trí?

Cảm ơn!

Trả lời

4

Nếu bạn có quyền truy cập vào máy chủ mà bạn đang đăng nhập, bạn có thể thử tạo một tệp có tên .hushlogin trong thư mục chính. Sự hiện diện của tập tin này làm im lặng lời chào MOTD chuẩn và các nội dung tương tự.

Hoặc, hãy thử ssh -T, điều này sẽ vô hiệu hóa phân bổ thiết bị đầu cuối hoàn toàn; bạn sẽ không nhận được dấu nhắc trình bao, nhưng bạn vẫn có thể ra lệnh và đọc câu trả lời.

Ngoài ra còn có một chủ đề tương tự trên ServerFault có thể có một số sử dụng cho bạn.

+0

Cảm ơn. Tôi đã truy cập vào máy chủ lưu trữ nhưng không có quyền chỉnh sửa nội dung nào ở đó. ssh -t làm việc rất đẹp. –

4

Nếu lệnh không tương tác, bạn chỉ có thể chạy ssh HOST COMMAND để chạy lệnh mà không có tất cả sự phấn khích đăng nhập xảy ra. Nếu lệnh tương tác, bạn có thể thường xuyên sử dụng tùy chọn ssh -t (ssh -t HOST COMMAND) để buộc phân bổ giả và lừa quá trình từ xa để nghĩ rằng nó đang chạy kèm theo TTY.

+0

Cảm ơn. Chính xác những gì tôi cần! Bình chọn Tamás trả lời mặc dù vì nó đã được một chút hoàn chỉnh hơn, nhưng tôi sẽ bỏ phiếu cho câu trả lời ur nếu tôi có thể! –

0

Tôi đã sử dụng paramiko để tự động kết nối ssh và tôi thấy nó hữu ích. Nó có thể đối phó với lời chào và thực hiện im lặng.

+0

Cảm ơn. Đã gặp phải sự cố khi tôi phát hiện ra nhưng không thử. Sẽ làm lần này. –

0

Hey đó bạn kann giết tất cả những gì tiếng ồn bằng cách sử dụng các mô-đun sys và một lớp học nhỏ:

class StreamToLogger(object): 
    """ 
    Fake file-like stream object that redirects writes to a logger instance. 
    """ 
    def __init__(self, logger, log_level=logging.INFO): 
     self.logger = logger 
     self.log_level = log_level 
     self.linebuf = '' 

    def write(self, buf): 
     for line in buf.rstrip().splitlines(): 
      self.logger.log(self.log_level, line.rstrip()) 


#Mak 
stdout_logger = logging.getLogger('STDOUT') 
sl = StreamToLogger(stdout_logger, logging.INFO) 
sys.stdout = sl 



stderr_logger = logging.getLogger('STDERR') 
sl = StreamToLogger(stderr_logger, logging.ERROR) 
sys.stderr = sl 

Không thể nhớ nơi tôi tìm thấy đoạn đó, nhưng nó hoạt động cho tôi :)