Jalankan perintah pada host jarak jauh melalui telnet dengan skrip python

Saya telah mencoba menulis naskah untuk menyederhanakan serangkaian pekerjaan saya. Saya mencobanya dengan perintah shell tetapi kodenya terlihat terlalu sederhana dan sejujurnya terlalu amatir. Saya mencoba mempelajari python untuk skrip dan dengan bantuan Anda, saya berharap masalah saya ini dapat berubah menjadi praktik yang menjelaskan.

Berikut ini adalah kode shell yang saya tulis:

#!/usr/bin/expect 

spawn telnet IPaddress
sleep 0.1
expect "Enter username and password"
send "username password \n"
sleep 0.1
send "debug; \n"
sleep 0.1
send "def t1 suspend_loader \n"
expect "enter subcommands"
send "traceback \n \n;"
sleep 1
send "act t1 \n"
sleep 0.1
send "quit \n"
sleep 0.1
send "stor2tst;audit_modules \n"
expect "PS Checksum audit completed"
send "quit \n"
sleep 0.1
send "debug"
sleep 0.1
send "print t1 \n"
sleep 0.5
send "quit \n"
sleep 0.1
send "logutil;open MOD;back all;quit \n"
sleep 0.1
send "debug \n"
sleep 0.1
send "di modules:pr.514 d 1 (&0) char n=68 \n"
send "quit \n"
sleep 1
send "quit \n"
send "logout \n"



interact

Seperti yang mungkin sudah Anda duga, kode ini dirancang untuk antarmuka switch tertentu. Prompt nama pengguna dan kata sandi muncul dalam satu baris. Ada level shell tertentu (seperti level debug) yang saya perlukan untuk menjalankan beberapa perintah. Saya juga menggunakan modul ekspektasi di sini, tetapi menurut saya modul ini berjalan begitu saja tanpa memeriksa string di bagian ekspektasi..

APA YANG SAYA COBA LAKUKAN?
Saya perlu melakukan telnet ke daftar Alamat IP yang diketahui (20 server).
Semua server memiliki nama pengguna dan sandi yang sama.
Saya perlu untuk menjalankan serangkaian perintah ini di setiap server dan mengembalikan output apa pun yang ada untuk memisahkan file log di bawah direktori tertentu (misalnya /tmp/dir).
Selain itu, beberapa perintah memerlukan "enter ganda" agar dapat dijalankan! Itu sebabnya saya menggunakan \n \n setelah perintah traceback.

Bantuan apa pun sangat kami hargai.
Terima kasih sebelumnya,


person Okan Akca    schedule 26.08.2015    source sumber
comment
Jadi, apakah Anda meminta seseorang untuk menerjemahkan skrip ekspektasi ke skrip python?   -  person Eric Renouf    schedule 26.08.2015
comment
Lihatlah telnetlib Python dan masukkan semua perintah Anda, dll. ke dalam iterable (mis. dikte). Cobalah untuk mengulangi 'kumpulan' data tersebut dan selesaikan pekerjaan Anda dalam perulangan for ini.   -  person albert    schedule 26.08.2015
comment
Sebagai alternatif, terus gunakan expect dan belajar menyukai bahasa TCL, yang seperti Python, adalah bahasa skrip dinamis yang mampu melakukan semua yang Anda perlukan (termasuk loop, pemrosesan argumen baris perintah, dll).   -  person larsks    schedule 26.08.2015
comment
Sudahkah Anda mencoba pexpect?   -  person primero    schedule 26.08.2015
comment
Saya setuju dengan @albert, telnetlib adalah jalan yang harus ditempuh. stackoverflow.com/questions/10952514/telnetlib-python-example   -  person Joseph Farah    schedule 26.08.2015
comment
saya juga ingin menambahkan bahwa ini adalah pertanyaan yang ditulis dengan sangat baik. kerja bagus, op.   -  person Joseph Farah    schedule 26.08.2015
comment
@EricRenouf sebenarnya tidak. Saya menyertakan apa yang telah saya lakukan untuk mendapatkan apa yang saya butuhkan, sehingga kita dapat mengimplementasikan versi python dari tugas ini.   -  person Okan Akca    schedule 27.08.2015
comment
@albert, terima kasih atas komentar Anda. Sekarang saya akan memeriksa area yang Anda sebutkan. Salam,   -  person Okan Akca    schedule 27.08.2015
comment
@larsks, saya ingin belajar dan menyukai python sobat.. :) Saya akan mencoba membentuk siklus loop yang sesuai dengan kebutuhan saya. Salam,   -  person Okan Akca    schedule 27.08.2015
comment
@silentphoenix, terima kasih atas perhatiannya! Saya akan melihat contoh yang Anda tunjukkan dan telnetlib juga. Salam,   -  person Okan Akca    schedule 27.08.2015


Jawaban (2)


Saya telah menulis sendiri kode berikut, saya harap ini dapat membantu orang yang mungkin mencari solusi serupa:

#!/usr/bin/expect

set timeout 150

array set hosts {0 <IPaddr> 1 <IPaddr> 2 <IPaddr> 3 <IPaddr> 4 <IPaddr> 5 <IPaddr> 6 <IPaddr> 7 <IPaddr> 8 <IPaddr> 9 <IPaddr> 10 <IPaddr> 11 <IPaddr>}

for {set i 0} {$i < 12 } { incr i } {

spawn telnet $hosts($i)
expect "Enter username and password"
send "root toor \n"
sleep 2
expect ">" {send "print '****************$hosts($i)****************' \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect "enter subcommands"
expect ">" {send "command \n\n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "print '****************$hosts($i)****************' \n"}
interact
}

Seperti yang saya sebutkan di uraian masalah saya, kode ini secara khusus dirancang untuk bekerja pada sakelar tipe Nortel DMS, jadi mohon maafkan saya untuk kemungkinan desain kode tingkat rendah.. Yang penting adalah kode itu berfungsi dan memenuhi kebutuhan kita. . :)

Bersulang!

person Okan Akca    schedule 03.09.2015

Anda harus dapat menggunakan fabric untuk menjalankan perintah yang sama untuk beberapa server.

http://www.fabfile.org/

http://docs.fabfile.org/en/1.10/usage/execution.html#roles

person yilmazhuseyin    schedule 27.08.2015
comment
Terima kasih sobat, belum pernah mendengar hal ini sebelumnya. Saya akan memeriksanya sekarang. - person Okan Akca; 27.08.2015
comment
Sebenarnya ini bukan server. Apa yang dia coba lakukan menjalankan banyak perintah melalui telnet. Saya rasa Fab tidak mendukung telnet sebagai mekanisme transportasi. Semua utilitas tersebut dijalankan melalui SSH. - person Eren T.; 28.08.2015