如何在Paramiko中实现类似ftplib sendcmd的功能访问HP Nonstop路径?
解决HP Nonstop系统下Paramiko SFTP切换Guardian路径的问题
问题背景
我的主机系统为HP Nonstop,包含Guardian和OSS两个子系统。使用Python的ftplib时,可通过以下代码切换至Guardian系统路径(格式如$X.PATH.FILENAME):
ftp = FTP() ftp.encoding = encoding ftp.connect(host_addr, ftp_port) ftp.sendcmd('guardian')
或通过以下代码切换至类Unix风格的OSS系统路径:
ftp = FTP() ftp.encoding = encoding ftp.connect(host_addr, ftp_port) ftp.sendcmd('oss')
但使用Paramiko进行SFTP操作时,找不到类似sendcmd的命令,无法使用Guardian路径,该如何解决?当前SFTP初始化代码如下:
transport = paramiko.Transport((host_addr, ssh_port)) sftp = paramiko.SFTPClient.from_transport(transport)
解决方案
HP Nonstop的SFTP服务支持通过SSH命令通道发送环境切换指令,因为SFTP是基于SSH的子系统,所以可以先通过SSH会话执行guardian或oss命令切换环境,再进行SFTP操作。以下是两种可行方法:
方法一:先建立SSH会话切换环境,再创建SFTP客户端
import paramiko # 建立SSH客户端连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host_addr, ssh_port, username=username, password=password) # 发送切换到Guardian环境的命令 stdin, stdout, stderr = ssh.exec_command('guardian') # 可读取输出确认切换是否成功 print(stdout.read().decode()) print(stderr.read().decode()) # 从已有的SSH会话创建SFTP客户端 sftp = ssh.open_sftp() # 现在可以使用Guardian格式路径操作,例如列出目录 sftp.listdir('$X.PATH') # 操作完成后关闭连接 sftp.close() ssh.close()
方法二:通过Transport对象先执行切换命令,再初始化SFTP
如果已经使用Transport对象初始化连接,可通过创建会话通道执行切换命令:
import paramiko transport = paramiko.Transport((host_addr, ssh_port)) transport.connect(username=username, password=password) # 创建SSH会话通道执行切换到Guardian的命令 channel = transport.open_session() channel.exec_command('guardian') # 读取输出确认切换状态 print(channel.recv(1024).decode()) channel.close() # 初始化SFTP客户端 sftp = paramiko.SFTPClient.from_transport(transport) # 执行Guardian路径相关操作,例如下载文件 sftp.get('$X.PATH.FILENAME', 'local_filename') # 关闭资源 sftp.close() transport.close()
关键说明
- HP Nonstop的SSH服务允许在会话中执行
guardian/oss命令切换文件系统环境,切换完成后,后续的SFTP操作会默认使用对应环境的路径格式。 - 执行切换命令后建议检查输出,确认没有错误,避免因切换失败导致SFTP操作仍使用默认环境(通常为OSS)。
内容的提问来源于stack exchange,提问作者Ezak
相关产品推荐
相关产品推荐

