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

