使用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
相关产品推荐
相关产品推荐

