如何仅通过1次SSH请求获取Linux服务器所有目录及对应所有者信息
解决方法
核心思路
仅发起1次SSH请求,直接在Linux服务端通过单条命令一次性拿到所有目录的所有者+路径结果,不需要为每个目录单独发起请求,耗时和你原有查询全量目录的操作基本一致。
具体命令方案
方案1:GNU Linux环境通用(绝大多数服务器默认支持)
直接替换你原来的find命令即可:
find . -type d -printf "%u %p\n" > myfile.txt
参数说明:
%u:输出目录的所有者用户名%p:输出目录的完整相对路径\n:每条结果单独换行
输出直接符合「所有者 目录路径」的格式要求,无需额外复杂解析。
方案2:兼容非GNU环境(BSD、嵌入式Linux等)
如果服务端find不支持printf参数,使用find配合stat实现同样效果:
find . -type d -print0 | xargs -0 stat -c "%U %n" > myfile.txt
说明:
-print0和xargs -0配合兼容包含空格、特殊字符的目录路径stat的%U对应所有者用户名,%n对应目录路径
Python调用示例
直接复用你原有SSH连接逻辑,仅执行一次命令拉取全量结果即可:
import paramiko # 原有SSH连接配置逻辑保留即可 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='你的服务器地址', username='SSH用户名', password='SSH密码') # 仅执行1次命令拉取全量结果 stdin, stdout, stderr = ssh.exec_command('find . -type d -printf "%u %p\\n"') result = stdout.read().decode('utf-8').strip().split('\n') # 简单解析即可得到目录和所有者的映射关系 dir_owner_info = [] for line in result: if not line: continue # maxsplit=1避免路径中包含空格导致拆分错误 owner, dir_path = line.split(maxsplit=1) dir_owner_info.append((owner, dir_path)) ssh.close()
优势
- 全程仅1次SSH请求,相比原来数千次请求耗时降低99%以上
- 原生命令输出格式规整,无需解析
ls -la的复杂输出,出错概率极低 - 自动兼容带特殊字符、空格的目录路径,不需要额外做转义处理
内容的提问来源于stack exchange,提问作者Harshit Jindal
相关产品推荐
相关产品推荐

