ดำเนินการคำสั่งบนโฮสต์ระยะไกลผ่าน telnet ด้วยสคริปต์ python

ฉันพยายามเขียนสคริปต์เพื่อทำให้ชุดงานของฉันง่ายขึ้น ฉันลองใช้คำสั่งเชลล์แล้ว แต่โค้ดดูตรงไปตรงมาเกินไปและพูดตามตรงว่ามือสมัครเล่นเกินไป ฉันกำลังพยายามเรียนรู้ Python สำหรับการเขียนสคริปต์ และด้วยความช่วยเหลือของคุณ ฉันหวังว่าปัญหานี้ของฉันจะกลายเป็นแนวทางปฏิบัติที่อธิบายได้

ต่อไปนี้คือโค้ดเชลล์ที่ฉันเขียน:

#!/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

ตามที่คุณอาจเดาได้ รหัสนี้ออกแบบมาสำหรับอินเทอร์เฟซสวิตช์เฉพาะ พรอมต์ชื่อผู้ใช้และรหัสผ่านมาในบรรทัดเดียว มีระดับเชลล์เฉพาะ (เช่น ระดับการดีบัก) ที่ฉันต้องการเพื่อดำเนินการหลายคำสั่ง ฉันยังใช้โมดูลคาดหวังที่นี่ แต่ฉันคิดว่ามันผ่านไปโดยไม่ตรวจสอบสตริงในส่วนคาดหวัง ..

ฉันกำลังพยายามทำอะไร
ฉันต้องการเทลเน็ตไปยังรายการที่อยู่ IP ที่รู้จัก (เซิร์ฟเวอร์ 20 เครื่อง)
เซิร์ฟเวอร์ทั้งหมดมีชื่อผู้ใช้และรหัสผ่านเหมือนกัน
ฉันต้องการ เพื่อดำเนินการชุดคำสั่งเหล่านี้บนแต่ละเซิร์ฟเวอร์ และส่งคืนเอาต์พุตใดๆ ที่มีอยู่เพื่อแยกไฟล์บันทึกภายใต้ไดเร็กทอรีที่ระบุ (เช่น /tmp/dir)
นอกจากนี้ คำสั่งหลายคำสั่งจำเป็นต้องมี "double enter" เพื่อดำเนินการ! นั่นคือเหตุผลที่ฉันใช้ \n \n หลังจากคำสั่งย้อนกลับ

ขอขอบคุณสำหรับความช่วยเหลือใดๆ
ขอบคุณล่วงหน้า


person Okan Akca    schedule 26.08.2015    source แหล่งที่มา
comment
คุณกำลังขอให้ใครสักคนแปลสคริปต์คาดหวังเป็นสคริปต์หลามหรือไม่?   -  person Eric Renouf    schedule 26.08.2015
comment
ดู telnetlib ของ Python แล้วใส่คำสั่งทั้งหมดของคุณ ฯลฯ ลงในโปรแกรมแบบวนซ้ำได้ (เช่น คำสั่ง) พยายามวนซ้ำ 'ชุด' ของข้อมูลเหล่านั้นและทำสิ่งที่คุณทำในลูปนี้   -  person albert    schedule 26.08.2015
comment
อีกวิธีหนึ่ง เพียงใช้ expect ต่อไปและเรียนรู้ที่จะรักภาษา TCL ซึ่งเหมือนกับ Python คือภาษาสคริปต์แบบไดนามิกที่มีความสามารถ ในการทำทุกสิ่งที่คุณต้องการ (รวมถึงการวนซ้ำ การประมวลผลอาร์กิวเมนต์บรรทัดคำสั่ง ฯลฯ )   -  person larsks    schedule 26.08.2015
comment
คุณได้ลอง pexpect แล้วหรือยัง   -  person primero    schedule 26.08.2015
comment
ฉันเห็นด้วยกับ @albert, telnetlib คือหนทางที่จะไป stackoverflow.com/questions/10952514/telnetlib-python-example   -  person Joseph Farah    schedule 26.08.2015
comment
ฉันอยากจะเสริมด้วยว่านี่เป็นคำถามที่เขียนได้ดีมาก ทำได้ดีมาก โอพี   -  person Joseph Farah    schedule 26.08.2015
comment
@EricRenouf ไม่จริง ฉันรวมสิ่งที่ฉันทำเพื่อให้ได้สิ่งที่ฉันต้องการ เพื่อที่เราจะได้สามารถนำงานนี้ไปใช้ในเวอร์ชัน python ได้   -  person Okan Akca    schedule 27.08.2015
comment
@albert ขอบคุณสำหรับความคิดเห็นของคุณ ตอนนี้ฉันจะตรวจสอบพื้นที่ที่คุณกล่าวถึง ความนับถือ,   -  person Okan Akca    schedule 27.08.2015
comment
@larsks ฉันต้องการเรียนรู้และรักเพื่อนหลาม .. :) ฉันจะพยายามสร้างวงจรวนซ้ำที่เหมาะสมเพื่อให้เหมาะกับความต้องการของฉัน ความนับถือ,   -  person Okan Akca    schedule 27.08.2015
comment
@silentphoenix ขอบคุณสำหรับการระวัง! ฉันจะดูตัวอย่างที่คุณชี้ให้เห็นและ telnetlib ด้วย ความนับถือ,   -  person Okan Akca    schedule 27.08.2015


คำตอบ (2)


ฉันได้เขียนโค้ดต่อไปนี้ให้กับตัวเองแล้ว หวังว่านี่จะช่วยผู้ที่อาจมองหาวิธีแก้ปัญหาที่คล้ายกันได้:

#!/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
}

ดังที่ฉันได้กล่าวไว้ในคำอธิบายปัญหาของฉัน โค้ดนี้ได้รับการออกแบบมาเป็นพิเศษเพื่อทำงานกับสวิตช์ประเภท Nortel DMS ดังนั้นโปรดยกโทษให้ฉันสำหรับการออกแบบโค้ดระดับต่ำที่เป็นไปได้ สิ่งสำคัญคือมันใช้งานได้และตอบสนองความต้องการของเรา . :)

ไชโย!

person Okan Akca    schedule 03.09.2015

คุณควรจะสามารถใช้ Fabric เพื่อรันคำสั่งเดียวกันสำหรับเซิร์ฟเวอร์หลายเครื่องได้

http://www.fabfile.org/

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

person yilmazhuseyin    schedule 27.08.2015
comment
ขอบคุณครับพี่ ไม่เคยได้ยินเรื่องนี้มาก่อน ฉันจะตรวจสอบตอนนี้. - person Okan Akca; 27.08.2015
comment
มันไม่ใช่เซิร์ฟเวอร์จริงๆ สิ่งที่เขาพยายามทำคือรันคำสั่งต่างๆ บน telnet ฉันไม่คิดว่า Fab รองรับ telnet เป็นกลไกการขนส่ง ยูทิลิตี้ทั้งหมดทำงานผ่าน SSH - person Eren T.; 28.08.2015