You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在paramiko的exec_command中传入两个字符串变量?代码问题解析

如何在paramiko的exec_command中正确传入两个字符串变量?

咱们先把原代码里的几个明显问题梳理清楚,再一步步修正:

原代码的核心问题

  • sftp.listdir() 只接受单个字符串路径作为参数,但你传了一个列表path,这会直接抛出类型错误
  • 字符串格式化语法错误:你用了%path %check,Python的旧式字符串格式化需要把所有变量放在一个元组里,比如% (var1, var2)
  • 路径拼接错误:h = path + filename 是列表加字符串,这会导致类型错误,应该用单个路径字符串和文件名拼接
  • 循环逻辑错误:你需要先遍历path里的每个目录,再遍历每个目录下的文件

修正后的完整代码

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 替换成你的实际主机地址、用户名和密码
client.connect('your_hostname', username='test1234', password='test')

# 要遍历的目录列表
paths = ['/home/test/', '/home/test1/','/home/test3/']
sftp = client.open_sftp()
check_cmd = 'tail -f /home/test/logs/check.out'

# 第一步:遍历每个目录路径
for dir_path in paths:
    try:
        # 第二步:遍历当前目录下的所有文件
        for filename in sftp.listdir(dir_path):
            # 筛选.txt后缀的文件
            if filename.endswith('.txt'):
                # 正确拼接文件完整路径
                full_file_path = dir_path + filename
                # 推荐用f-string格式化命令,语法更直观
                cmd = f"{full_file_path} && {check_cmd} | grep -i 'Connection time out'"
                # 也可以用旧式格式化:cmd = "%s && %s | grep -i 'Connection time out'" % (full_file_path, check_cmd)
                stdin, stdout, stderr = client.exec_command(cmd)
                
                # 处理命令输出,比如读取结果
                output = stdout.read().decode()
                error = stderr.read().decode()
                if output:
                    print(f"命令输出:\n{output}")
                if error:
                    print(f"错误信息:\n{error}")
    except Exception as e:
        print(f"处理目录 {dir_path} 时出错: {str(e)}")

# 记得关闭连接,避免资源泄漏
sftp.close()
client.close()

关键修正点解释

  1. 遍历目录的逻辑调整:先循环paths里的每个目录路径,再对每个目录调用sftp.listdir(),彻底解决参数类型错误的问题
  2. 正确的路径拼接:用当前遍历的dir_path(单个字符串)和filename拼接成完整的文件路径,避免列表加字符串的类型错误
  3. exec_command的传参方式:
    • 推荐用f-string(Python3.6+支持),语法简洁直观,直接把变量嵌入字符串
    • 如果你坚持用旧式的%格式化,必须把所有变量放在一个元组里,不能分开写%var1 %var2
  4. 补充提示:tail -f是持续跟踪日志的命令,会一直阻塞进程;如果只是需要读取日志最后几行,可以改成tail -n 20(取最后20行),这样命令会执行完成后返回结果

内容的提问来源于stack exchange,提问作者Victory

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:19:22