Python远程主机登录:grep结果写入文件但主机名无法写入问题
解决Paramiko执行命令时无法写入主机名到目标文件的问题
看起来你已经搞定了用Paramiko远程执行grep命令的核心功能,但卡在了把主机名写入目标文件的环节对吧?别担心,只要在代码里加几步整合逻辑就能解决,下面是修改后的完整实现:
import paramiko # 加载远程登录用的私钥 k = paramiko.RSAKey.from_private_key_file("/Users/Documents/privatekey.pem") c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 把远程主机信息单独存为变量,方便后续复用 remote_host = "10.224.58.214" remote_user = "ec2-user" print("connecting") c.connect(hostname=remote_host, username=remote_user, pkey=k) print("connected") # 要执行的grep命令(记得补全完整的文件名哦) commands = ["grep jdbc /usr/share/activemq/conf/activemq.xml"] # 本地要写入结果的文件路径 target_file = "./remote_grep_result.txt" try: for cmd in commands: # 执行远程命令并获取输入输出流 stdin, stdout, stderr = c.exec_command(cmd) # 读取grep的匹配结果,转成字符串并去除首尾空白 grep_result = stdout.read().decode().strip() # 读取命令执行时的错误信息(如果有的话) exec_error = stderr.read().decode().strip() # 组装要写入的内容:先明确标注主机名,再追加grep结果 write_content = f"=== 远程主机: {remote_host} ===\n" if grep_result: write_content += f"JDBC匹配内容:\n{grep_result}\n" else: write_content += "未找到匹配的JDBC内容\n" if exec_error: write_content += f"命令执行错误:\n{exec_error}\n" # 用追加模式写入本地文件,这样多台主机的结果可以存在同一个文件里 with open(target_file, "a", encoding="utf-8") as f: f.write(write_content + "\n") finally: # 不管执行成功还是失败,都要确保关闭SSH连接 c.close() print("远程连接已关闭")
关键修改点说明
- 把远程主机地址存为
remote_host变量,方便后续在写入内容时直接调用 - 执行命令后读取
stdout拿到grep结果,同时捕获stderr的错误信息,避免遗漏异常情况 - 手动组装包含主机名的写入内容,让结果文件的可读性更强
- 使用
with open的追加模式(a)写入文件,既保证文件操作的安全性,也支持后续扩展多台主机的批量操作
如果你要把结果写入远程主机的文件
如果你的需求是把主机名和grep结果直接写入远程机器的文件,可以直接修改执行的命令,让远程系统完成写入操作:
# 替换原有commands为以下两行,直接在远程写入文件 commands = [ f'echo "=== 本机主机名: {remote_host} ===" >> /tmp/jdbc_grep_result.txt', 'grep jdbc /usr/share/activemq/conf/activemq.xml >> /tmp/jdbc_grep_result.txt' ]
这样远程机器的/tmp/jdbc_grep_result.txt文件就会包含主机名和grep匹配的内容啦。
内容的提问来源于stack exchange,提问作者sorabh sarupria
相关产品推荐
相关产品推荐

