如果我在main函数中分配一个列表,我会有一个成功运行的脚本,但是我需要在100多个设备上运行它。我花了一些时间研究,我认为最好的方法是将变量存储在文本文件中并以这种方式访问它。 (当然,如果有人知道更好的方式,我全都是为了它!)
我现在的问题是,当我尝试将现有代码转换为充满变量的新文本文件时,我得到了:
TypeError: getaddrinfo() argument 1 must be string or None"
我很确定我因为\n
换行而看到了这些,因为它会在最后一行失败并且那个有效。
到目前为止,我已经尝试了line.split
&将txt文件保存为.csv并将分隔符更改为\n
,但两者都没有像我预期的那样工作。
以下是有效的脚本:
import sys, os, string, threading
import getpass
import paramiko
import time
cmd = "sh vl bri"
lanid = 'admin'
pwd = 'password'
outlock = threading.Lock()
def workon(host):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=lanid, password=pwd)
stdin, stdout, stderr = ssh.exec_command(cmd)
#print stdout.read()
stdin.flush()
with open("output-" + host + ".txt", 'w+') as f:
f.seek(0)
f.write(stdout.read())
with outlock:
print stdout.readlines()
#f.write(stdout)
def main():
hosts = ['sw1', 'sw2', 'sw3'] # etc
threads = []
for h in hosts:
t = threading.Thread(target=workon, args=(h,))
t.start()
threads.append(t)
for t in threads:
t.join()
main()
编辑1
import sys, os, string, threading
import getpass
import paramiko
import time
cmd = "sh vl bri"
#lanid = raw_input("Enter your uname: ")
lanid = 'admin'
pwd = 'password'
outlock = threading.Lock()
def workon(stripped_row):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(stripped_row, username=lanid, password=pwd)
stdin, stdout, stderr = ssh.exec_command(cmd)
#print stdout.read()
stdin.flush()
with open("output-" + stripped_row + ".txt", 'w+') as f:
f.seek(0)
f.write(stdout.read())
with outlock:
print stdout.readlines()
#f.write(stdout)
def main():
my_file = open('10host.txt')
threads = []
for h in my_file:
striped_row = h.strip()
t = threading.Thread(target=workon, args=(h,))
t.start()
threads.append(t)
for t in threads:
t.join()
main()
答案 0 :(得分:0)
问题在于:
for h in my_file:
striped_row = h.strip()
t = threading.Thread(target=workon, args=(h,))
您正在剥离当前行,但随后将未剥离的行传递给您的工作函数。尝试将striped_row
作为参数而不是h
传递。