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

使用Paramiko连接SSH服务器后os.mkdir仍在本地创建文件夹问题

问题根因
  • 代码中generateFolders函数直接调用本地Python标准库的os.mkdir方法,运行到command = generateFolders(path, prefix, counts, mode)这行时,就已经在本地主机完成了文件夹创建操作,逻辑完全没走到远端执行的步骤。
  • generateFolders函数没有定义返回值,赋值给command变量的实际是None,后续调用client1.exec_command(command)时传入空值,根本不会在远端服务器执行任何创建目录的操作。
  • 代码读取了入参的port变量,但建立SSH连接时没有传入该参数,会默认使用22端口连接,如果你的目标SSH服务不是默认端口,会出现连接目标错误的问题。
修复代码

核心修改思路:不在本地调用os模块执行文件操作,而是将创建文件夹的逻辑拼接为标准Shell命令,通过SSH通道发送到远端执行;建立SSH连接时传入指定端口参数。

import os
from paramiko import SSHClient, AutoAddPolicy
from sys import argv
 
address = argv[1]
port = int(argv[2])
name = argv[3]
path = argv[4]
prefix = argv[5]
counts = int(argv[6])
mode = int(argv[7])
 
def generateRemoteMkdirCmd(path, prefix, counts, mode):
    # 转换权限为8进制字符串,适配mkdir -m参数格式
    mode_str = oct(mode)[-3:]
    cmd_list = []
    for i in range(1, counts+1):
        folderName = prefix + str(i)
        # 直接拼接远端shell路径,使用~指代远端用户家目录,无需本地做路径展开
        folder_path = f"~/{path.strip('/')}/{folderName}"
        cmd_list.append(f"mkdir -m {mode_str} -p {folder_path}")
    # 拼接所有创建命令,一次性在远端执行
    return " && ".join(cmd_list)
 
# 生成远端执行的命令,此处不会在本地创建任何文件
command = generateRemoteMkdirCmd(path, prefix, counts, mode)
 
client1 = SSHClient()
client1.set_missing_host_key_policy(AutoAddPolicy())
# 传入指定端口参数,和手动SSH连接行为保持一致
client1.connect(address, port=port, username=name, password='1')
stdin, stdout, stderr = client1.exec_command(command)
 
# 打印执行结果和错误信息方便排错
print("执行输出:", stdout.read().decode('utf-8'))
print("错误信息:", stderr.read().decode('utf-8'))
 
client1.close()
注意事项
  • 传入的mode参数需要是8进制数值,比如创建755权限的文件夹要传0o755,不要传十进制数避免权限不符合预期。
  • 执行脚本前确认传入的远端路径对SSH登录用户有写入权限,否则会报权限不足错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.16 16:15:41