Python:打开的文件和其中的行有问题
Python: issue with open file and lines in it
我已经开始了我自己的这个小项目,创建一个 python 脚本,它将通过 SSH 连接到 Linux 服务器,并在它们上面执行 运行 命令。
这是成功的,但是当我尝试使用文件中的 IP 列表时,我 运行 遇到了问题,它只会连接到文件中的一个 IP(只有一行)。该文件包含以下条目:
172.18.8.130
172.18.8.137
问题是脚本仅 returns 从第二个 IP 输出:
['Linux 172.18.8.137 4.18.0-147.5.1.el8_1.x86_64 #1 SMP Wed Feb 5 02:00:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux\n']
密码是
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
with open(r'D:\servers.txt', 'r') as fp:
for line in fp:
line = (fp.read())
ssh.connect(line, 22, "root", "password")
stdin, stdout, stderr = ssh.exec_command("uname -a")
print (stdout.readlines())
我怎样才能让它遍历该文件中的所有行 (IP),以便它连接并 运行 uname -a 在所有服务器上?
在 for 循环的每次迭代中,您都在更新 "line" 变量。由于您的列表中有 2 个不同的 IP 地址,因此 "line" 变量总是分配给第二个。
为了在程序中存储您的 IP 地址,请使用列表。
IP_list = []
with open(r'D:\servers.txt', 'r') as fp:
for line in fp:
line = line.strip()
IP_list += [line]
问题是 python 中的文件是 IO 设备(就像 stdout、stdin 等)。因此,如果您尝试读取文件中的每一行,您会希望使用 fp.readline()
而不是 fp.read()
。 read
读取文件的全部内容(直到到达 EOF),而 readline
读取直到到达换行符。
尝试用类似这样的代码替换您的代码,看看它是否适合您:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
with open(r'D:\servers.txt', 'r') as fp:
for ip in [line.strip() for line in fp.readlines()]:
ssh.connect(ip, 22, "root", "password")
stdin, stdout, stderr = ssh.exec_command("uname -a")
print (stdout.readlines())
这会将所有行读入一个列表并从开头和结尾去除任何多余的空白字符,然后我们可以在我们的 for 循环中迭代这个数组,引用每个 IP 地址,打开一个连接,并执行您需要的任何任务需要。
我已经开始了我自己的这个小项目,创建一个 python 脚本,它将通过 SSH 连接到 Linux 服务器,并在它们上面执行 运行 命令。 这是成功的,但是当我尝试使用文件中的 IP 列表时,我 运行 遇到了问题,它只会连接到文件中的一个 IP(只有一行)。该文件包含以下条目:
172.18.8.130
172.18.8.137
问题是脚本仅 returns 从第二个 IP 输出:
['Linux 172.18.8.137 4.18.0-147.5.1.el8_1.x86_64 #1 SMP Wed Feb 5 02:00:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux\n']
密码是
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
with open(r'D:\servers.txt', 'r') as fp:
for line in fp:
line = (fp.read())
ssh.connect(line, 22, "root", "password")
stdin, stdout, stderr = ssh.exec_command("uname -a")
print (stdout.readlines())
我怎样才能让它遍历该文件中的所有行 (IP),以便它连接并 运行 uname -a 在所有服务器上?
在 for 循环的每次迭代中,您都在更新 "line" 变量。由于您的列表中有 2 个不同的 IP 地址,因此 "line" 变量总是分配给第二个。
为了在程序中存储您的 IP 地址,请使用列表。
IP_list = []
with open(r'D:\servers.txt', 'r') as fp:
for line in fp:
line = line.strip()
IP_list += [line]
问题是 python 中的文件是 IO 设备(就像 stdout、stdin 等)。因此,如果您尝试读取文件中的每一行,您会希望使用 fp.readline()
而不是 fp.read()
。 read
读取文件的全部内容(直到到达 EOF),而 readline
读取直到到达换行符。
尝试用类似这样的代码替换您的代码,看看它是否适合您:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
with open(r'D:\servers.txt', 'r') as fp:
for ip in [line.strip() for line in fp.readlines()]:
ssh.connect(ip, 22, "root", "password")
stdin, stdout, stderr = ssh.exec_command("uname -a")
print (stdout.readlines())
这会将所有行读入一个列表并从开头和结尾去除任何多余的空白字符,然后我们可以在我们的 for 循环中迭代这个数组,引用每个 IP 地址,打开一个连接,并执行您需要的任何任务需要。