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

如何从经Azure VM通过dsh登录的Linux卡拉取文件至Windows本地?

当然可行!咱们一步步拆解这个多跳SSH+文件拉取的流程,重点解决你卡在dsh登录和文件拉取的部分:

整体可行性确认

你的整个流程本质是多跳SSH隧道+远程命令执行+跨节点文件传输的组合,完全可以通过现有工具实现,核心是把每一层的操作嵌套或串联起来。

具体实现思路

1. 巩固前两步:Windows → 跳板机 → Azure VM

你已经用paramiko/subprocess实现到Azure VM的登录,这部分可以作为基础继续延伸——不管是用嵌套SSH命令链(subprocess)还是paramiko的SSHClient跳转,都能直接用来执行后续的dsh命令。

2. 从Azure VM通过dsh登录Linux卡并执行操作

dsh是分布式shell,本质是在Azure VM的环境里执行dsh命令来连接目标Linux卡,所以核心是在Azure VM的SSH会话中调用dsh命令,这里分两种工具的实现思路:

用subprocess的思路

如果之前是用subprocess调用ssh命令链到Azure VM,直接把dsh命令嵌到远程执行的内容里即可:

import subprocess

# 构建多跳SSH + dsh命令的链
cmd = [
    'ssh',
    '-J', '跳板机用户名@跳板机IP',  # 跳板机跳转参数
    'AzureVM用户名@AzureVMIP',
    "dsh -m 目标Linux卡IP/主机名 'ls /path/to/你的目标文件'"  # 在Linux卡上执行的命令
]

# 执行命令并获取结果
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
    print("Linux卡上的文件信息:", result.stdout)
else:
    print("执行出错:", result.stderr)

用paramiko的思路

如果已经通过paramiko建立了到Azure VM的SSH连接,直接在这个会话里调用exec_command执行dsh命令:

import paramiko

# 假设你已经通过paramiko完成了到Azure VM的连接,得到client对象
stdin, stdout, stderr = client.exec_command("dsh -m 目标Linux卡IP/主机名 'ls /path/to/你的目标文件'")

# 读取执行结果
output = stdout.read().decode('utf-8')
error = stderr.read().decode('utf-8')

if output:
    print("文件检查结果:", output)
if error:
    print("dsh执行错误:", error)

3. 将Linux卡上的文件拉回Windows本地

这里有两种高效的实现方式,选哪种取决于你的场景:

方法1:分步传输(直观易调试)

先把Linux卡上的文件传到Azure VM的临时目录,再从Azure VM传到Windows本地:

  • 第一步:在Azure VM的SSH会话里,用dsh+scp把文件从Linux卡传到Azure VM:
    # paramiko示例:在Azure VM上执行跨节点scp
    client.exec_command("dsh -m 目标Linux卡IP 'scp /path/to/source/file AzureVM用户名@AzureVMIP:/tmp/temp_transfer_file'")
    
  • 第二步:用paramiko的SFTP把Azure VM上的临时文件拉到Windows:
    sftp = client.open_sftp()
    sftp.get('/tmp/temp_transfer_file', 'C:/本地存储路径/目标文件名')
    sftp.close()
    

方法2:直接多跳SCP(无临时文件,更高效)

构建一条SCP多跳命令链,直接从Linux卡拉取文件到Windows,适合已经配置好公钥免密的场景:

import subprocess

# 直接多跳SCP命令
cmd = [
    'scp',
    '-o', 'ProxyJump 跳板机用户名@跳板机IP,AzureVM用户名@AzureVMIP',
    'Linux卡用户名@Linux卡IP:/path/to/source/file',
    'C:/本地存储路径/目标文件名'
]

subprocess.run(cmd)
额外注意事项
  • 优先配置公钥免密登录:在跳板机、Azure VM、Linux卡之间互传公钥,避免频繁输入密码,这也是自动化操作的前提。
  • 确认dsh配置:Azure VM上的dsh需要能识别目标Linux卡的主机名/IP,必要时提前在Azure VM的dsh配置文件里添加节点信息。
  • 复杂场景可简化:如果用paramiko处理多跳觉得麻烦,可以用sshtunnel库来快速构建嵌套SSH隧道,降低代码复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:59:11