Ubuntu 16.04下用Spyder编写Python脚本执行终端SSH命令的密码输入问题
解决Ubuntu 16.04中通过Python脚本自动SSH连接并执行命令的问题
你遇到的核心问题是SSH连接需要交互式输入密码,普通的os.system或直接调用gnome-terminal没法自动处理这个交互环节。下面给你几个实用的解决方案,按推荐程度排序:
方案1:设置SSH免密登录(最安全、长期推荐)
这是最优解,既避免了明文密码的风险,也彻底解决了交互输入密码的问题,步骤很简单:
在本地Ubuntu机器生成SSH密钥对(一路回车用默认配置即可):
ssh-keygen -t rsa将公钥复制到目标远程机器(替换
username和remote_ip为你的实际信息):ssh-copy-id username@remote_ip第一次执行会要求你输入远程机器的密码,输入后公钥就会被添加到远程机器的
~/.ssh/authorized_keys文件中。之后再用SSH连接就不需要输入密码了,你的Python脚本可以改成这样:
import os # 打开gnome-terminal并执行SSH连接+后续命令,最后保持终端打开 os.system("gnome-terminal -e 'bash -c \"ssh username@remote_ip && 你的后续命令; exec bash\"'")这样终端打开后会自动完成SSH连接,直接执行你需要的后续命令。
方案2:用expect工具自动输入密码(适合临时场景)
如果暂时没法设置免密登录,expect是专门处理交互式命令行的工具,可以帮你自动输入密码:
- 先安装
expect:sudo apt-get install expect - 编写一个简单的
expect脚本(比如命名为auto_ssh.exp):#!/usr/bin/expect set timeout 30 # 替换为你的SSH命令 spawn ssh username@remote_ip expect "password:" # 替换为你的远程机器密码 send "你的密码\r" # 执行后续命令,比如查看目录 send "ls\r" # 保持终端交互状态 interact - 给脚本添加执行权限:
chmod +x auto_ssh.exp - 在Python脚本中调用这个
expect脚本:
注意:这种方式会把明文密码写在脚本里,安全性很低,只适合临时测试使用。import os os.system("gnome-terminal -e 'bash -c \"./auto_ssh.exp; exec bash\"'")
方案3:用Python的paramiko库直接处理SSH(无需打开终端)
如果你不需要打开可视化终端,只是想在Python脚本中后台执行SSH命令,paramiko是专门的SSH客户端库,能直接在代码中完成连接、执行命令的操作:
- 安装
paramiko:pip install paramiko - 示例代码:
这个方案完全在Python脚本内部处理,不需要依赖终端,适合自动化脚本场景。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()
内容的提问来源于stack exchange,提问作者Robot12341
相关产品推荐
相关产品推荐

