通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python ssh 如何输入yes

python ssh 如何输入yes

在Python中通过SSH连接并自动输入“yes”的方法主要有:使用paramiko库、使用pexpect库、编写自定义函数。其中,paramiko库是一个用于SSH连接的强大工具,不需要手动处理“yes/no”确认;pexpect库可以模拟用户交互,自动输入“yes”;自定义函数则可以通过子进程调用实现自动化。下面将详细介绍这三种方法。

一、使用Paramiko库

Paramiko是Python中一个强大的用于处理SSH协议的第三方库,适用于在Python中进行SSH连接。通过Paramiko,可以避免手动处理“yes/no”确认的问题,因为它提供了一个名为AutoAddPolicy的功能,自动接受服务器的主机密钥。

  1. 安装和基本使用

首先,需要安装paramiko库。可以通过pip命令进行安装:

pip install paramiko

安装完成后,可以通过以下步骤实现SSH连接并自动接受主机密钥:

import paramiko

def ssh_connect_with_paramiko(hostname, username, password):

try:

client = paramiko.SSHClient()

# 设置为自动接受新的主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接到服务器

client.connect(hostname, username=username, password=password)

print("Connected successfully to", hostname)

# 执行命令

stdin, stdout, stderr = client.exec_command('ls -l')

print(stdout.read().decode())

except Exception as e:

print("Connection failed:", e)

finally:

client.close()

使用示例

ssh_connect_with_paramiko('example.com', 'username', 'password')

  1. AutoAddPolicy的作用

在上面的代码中,set_missing_host_key_policy(paramiko.AutoAddPolicy())这一行代码的作用是当连接到一个新的服务器时,自动将主机密钥添加到已知主机列表中,而不会提示“yes/no”确认。这使得脚本能够更加自动化地运行。

  1. 处理错误

在SSH连接过程中,可能会遇到不同类型的错误,例如网络问题、认证失败等。通过捕获并处理异常,可以提高程序的健壮性。在paramiko中,常见的异常包括AuthenticationExceptionSSHException,可以通过try-except块进行捕获和处理。

二、使用Pexpect库

Pexpect是一个用于自动化与命令行程序交互的Python库,适合模拟用户输入以处理需要输入“yes”的场景。在使用SSH时,Pexpect可以自动处理“yes/no”提示,并输入“yes”。

  1. 安装和基本使用

首先,需要安装pexpect库。可以通过pip命令进行安装:

pip install pexpect

使用Pexpect库进行SSH连接的基本步骤如下:

import pexpect

def ssh_connect_with_pexpect(hostname, username, password):

try:

# 启动ssh进程

child = pexpect.spawn(f'ssh {username}@{hostname}')

# 设置超时时间

child.timeout = 30

# 匹配提示

index = child.expect(['yes/no', 'password:', pexpect.EOF, pexpect.TIMEOUT])

if index == 0:

# 自动输入“yes”

child.sendline('yes')

child.expect('password:')

if index in [0, 1]:

child.sendline(password)

# 继续交互或执行命令

child.expect(f'{username}@')

child.sendline('ls -l')

child.expect(f'{username}@')

print(child.before.decode())

else:

print("Connection failed")

except pexpect.ExceptionPexpect as e:

print("Connection failed:", e)

使用示例

ssh_connect_with_pexpect('example.com', 'username', 'password')

  1. 自动处理“yes/no”确认

在Pexpect中,child.expect(['yes/no', 'password:', pexpect.EOF, pexpect.TIMEOUT])这一行代码用于等待SSH连接过程中的提示信息。如果出现“yes/no”提示,则通过child.sendline('yes')自动输入“yes”。

  1. 处理超时和异常

Pexpect提供了超时处理机制,可以通过设置child.timeout来指定等待提示的最大时间。当超时时,会抛出pexpect.TIMEOUT异常。可以通过捕获pexpect.ExceptionPexpect来处理连接过程中可能出现的各种异常。

三、编写自定义函数

除了使用第三方库,还可以通过编写自定义函数来实现SSH连接并自动输入“yes”。这种方法通常需要结合子进程调用和标准输入输出重定向来实现。

  1. 使用subprocess模块

Python的subprocess模块可以用于启动子进程并与其进行交互。通过subprocess.Popen,可以启动SSH进程并向其标准输入发送数据。

import subprocess

def ssh_connect_with_subprocess(hostname, username, password):

try:

# 启动ssh进程

process = subprocess.Popen(

['ssh', f'{username}@{hostname}'],

stdin=subprocess.PIPE,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE,

universal_newlines=True,

bufsize=0

)

# 自动处理“yes/no”提示

while True:

output = process.stdout.readline()

if 'yes/no' in output:

process.stdin.write('yes\n')

elif 'password:' in output:

process.stdin.write(f'{password}\n')

break

# 继续执行命令

process.stdin.write('ls -l\n')

while True:

output = process.stdout.readline()

if output == '' and process.poll() is not None:

break

if output:

print(output.strip())

except Exception as e:

print("Connection failed:", e)

使用示例

ssh_connect_with_subprocess('example.com', 'username', 'password')

  1. 标准输入输出处理

在上述代码中,subprocess.Popen用于启动SSH子进程,并通过stdinstdout进行交互。在处理“yes/no”提示时,通过process.stdin.write('yes\n')向子进程的标准输入发送“yes”。

  1. 处理子进程退出

为了确保子进程的正确退出,可以通过process.poll()方法检查子进程的状态。当子进程退出时,poll()方法返回非None值。

总结

在Python中,通过SSH连接并自动输入“yes”有多种方法可选。Paramiko库提供了方便的自动接受主机密钥的功能,适合在不需要手动处理“yes/no”确认的场景下使用。Pexpect库可以模拟用户交互,自动处理“yes/no”提示,适合需要处理复杂交互的场景。自定义函数结合subprocess模块可以实现灵活的子进程控制和交互。在实际应用中,可以根据项目的需求和复杂度选择合适的方法。无论使用哪种方法,都需要注意处理异常和错误,以确保程序的健壮性和可靠性。

相关问答FAQs:

如何在使用Python SSH时自动输入“yes”?
在使用Python进行SSH连接时,可能会遇到需要输入“yes”以确认连接或接受未知主机密钥的情况。可以使用Paramiko库来实现这一功能。通过捕捉到的异常或使用Transport对象的set_missing_host_key_policy方法,可以自动处理主机密钥的接受。示例代码如下:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='user', password='password')

在Python中如何处理SSH连接时的交互提示?
当进行SSH连接时,有时会需要与远程主机进行交互,例如输入密码或确认操作。通过Paramiko库,可以使用invoke_shell()方法获得一个交互式的shell,从而可以发送任何需要的输入,包括“yes”。这种方式允许程序模拟用户的输入。

shell = client.invoke_shell()
shell.send('your command\n')
# 等待输出并发送“yes”
shell.send('yes\n')

使用Python SSH时是否有其他库可以处理确认输入?
除了Paramiko,还有其他库如Fabric和AsyncSSH可以用于处理SSH连接并处理确认输入。这些库提供了更高级的接口和功能,适合不同的使用场景。例如,Fabric允许使用更简单的命令行接口来自动化SSH任务,同时也能够处理交互式输入。

from fabric import Connection

conn = Connection('hostname', user='user', connect_kwargs={"password": "password"})
conn.run('your command', hide=True, pty=True)

使用这些库时,可以更方便地管理SSH连接和交互,甚至支持异步操作。

相关文章