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

Ubuntu 16.04下用Spyder编写Python脚本执行终端SSH命令的密码输入问题

解决Ubuntu 16.04中通过Python脚本自动SSH连接并执行命令的问题

你遇到的核心问题是SSH连接需要交互式输入密码,普通的os.system或直接调用gnome-terminal没法自动处理这个交互环节。下面给你几个实用的解决方案,按推荐程度排序:

方案1:设置SSH免密登录(最安全、长期推荐)

这是最优解,既避免了明文密码的风险,也彻底解决了交互输入密码的问题,步骤很简单:

  1. 在本地Ubuntu机器生成SSH密钥对(一路回车用默认配置即可):

    ssh-keygen -t rsa
    
  2. 将公钥复制到目标远程机器(替换username和remote_ip为你的实际信息):

    ssh-copy-id username@remote_ip
    

    第一次执行会要求你输入远程机器的密码,输入后公钥就会被添加到远程机器的~/.ssh/authorized_keys文件中。

  3. 之后再用SSH连接就不需要输入密码了,你的Python脚本可以改成这样:

    import os
    # 打开gnome-terminal并执行SSH连接+后续命令,最后保持终端打开
    os.system("gnome-terminal -e 'bash -c \"ssh username@remote_ip && 你的后续命令; exec bash\"'")
    

    这样终端打开后会自动完成SSH连接,直接执行你需要的后续命令。

方案2:用expect工具自动输入密码(适合临时场景)

如果暂时没法设置免密登录,expect是专门处理交互式命令行的工具,可以帮你自动输入密码:

  1. 先安装expect:
    sudo apt-get install expect
    
  2. 编写一个简单的expect脚本(比如命名为auto_ssh.exp):
    #!/usr/bin/expect
    set timeout 30
    # 替换为你的SSH命令
    spawn ssh username@remote_ip
    expect "password:"
    # 替换为你的远程机器密码
    send "你的密码\r"
    # 执行后续命令,比如查看目录
    send "ls\r"
    # 保持终端交互状态
    interact
    
  3. 给脚本添加执行权限:
    chmod +x auto_ssh.exp
    
  4. 在Python脚本中调用这个expect脚本:
    import os
    os.system("gnome-terminal -e 'bash -c \"./auto_ssh.exp; exec bash\"'")
    
    注意:这种方式会把明文密码写在脚本里,安全性很低,只适合临时测试使用。

方案3:用Python的paramiko库直接处理SSH(无需打开终端)

如果你不需要打开可视化终端,只是想在Python脚本中后台执行SSH命令,paramiko是专门的SSH客户端库,能直接在代码中完成连接、执行命令的操作:

  1. 安装paramiko:
    pip install paramiko
    
  2. 示例代码:
    import paramiko
    
    # 远程机器信息
    hostname = 'remote_ip'
    username = 'username'
    password = '你的密码'
    # 要执行的后续命令列表
    commands = ['ls', 'echo "Hello from remote machine"']
    
    # 创建SSH客户端实例
    ssh_client = paramiko.SSHClient()
    # 自动添加远程主机的密钥(第一次连接时)
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    try:
        # 连接远程机器
        ssh_client.connect(hostname=hostname, username=username, password=password)
        # 逐个执行命令并打印结果
        for cmd in commands:
            stdin, stdout, stderr = ssh_client.exec_command(cmd)
            print(f"执行命令: {cmd}")
            print(stdout.read().decode())
            # 打印错误信息(如果有)
            error_msg = stderr.read().decode()
            if error_msg:
                print(f"错误信息: {error_msg}")
    finally:
        # 确保关闭连接
        ssh_client.close()
    
    这个方案完全在Python脚本内部处理,不需要依赖终端,适合自动化脚本场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:12:17