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

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

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

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

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

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

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

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

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

25人以下免费

目录

python如何登陆linux服务器

python如何登陆linux服务器

通过Python登陆Linux服务器的方法有多种,包括使用SSH库、paramiko模块、pexpect模块等

最常用的方法是使用Paramiko库。 Paramiko是一个用于在Python中实现SSH2协议的库,具有客户端和服务端功能。它支持以加密和认证方式进行安全连接,适合在脚本中集成并执行远程命令。

让我们详细了解一下如何使用Paramiko库来登录Linux服务器并执行一些基本操作。

一、安装Paramiko库

在开始编写代码之前,首先需要安装Paramiko库。可以使用pip工具来进行安装:

pip install paramiko

二、通过Paramiko连接到Linux服务器

下面是一个简单的示例,展示了如何使用Paramiko连接到Linux服务器并执行命令:

import paramiko

def ssh_connect(hostname, port, username, password):

# 创建SSH客户端对象

client = paramiko.SSHClient()

# 自动添加主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

# 连接到服务器

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

print("连接成功")

# 执行命令

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

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

except Exception as e:

print(f"连接失败: {e}")

finally:

# 关闭连接

client.close()

使用示例

hostname = 'your_server_ip'

port = 22

username = 'your_username'

password = 'your_password'

ssh_connect(hostname, port, username, password)

详细解析

  1. 创建SSH客户端对象:首先,创建一个paramiko.SSHClient()对象,它是进行SSH连接的基础。

  2. 设置主机密钥策略:使用client.set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受服务器的主机密钥。这在初次连接时特别有用。

  3. 连接到服务器:使用client.connect(hostname, port, username, password)方法来连接到指定的服务器。hostname是服务器的IP地址或主机名,port是SSH服务使用的端口(默认22),usernamepassword分别是用户名和密码。

  4. 执行命令:使用client.exec_command('ls -l')方法执行命令。该方法返回三个文件对象:stdinstdoutstderr。可以通过读取stdout来获取命令的输出。

  5. 关闭连接:最后,使用client.close()关闭连接。

三、使用密钥文件进行连接

除了使用用户名和密码外,还可以使用SSH密钥文件进行身份验证。以下是如何使用密钥文件进行连接的示例:

import paramiko

def ssh_connect_with_key(hostname, port, username, key_file):

# 创建SSH客户端对象

client = paramiko.SSHClient()

# 自动添加主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

# 使用密钥文件进行连接

key = paramiko.RSAKey.from_private_key_file(key_file)

client.connect(hostname, port, username, pkey=key)

print("连接成功")

# 执行命令

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

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

except Exception as e:

print(f"连接失败: {e}")

finally:

# 关闭连接

client.close()

使用示例

hostname = 'your_server_ip'

port = 22

username = 'your_username'

key_file = '/path/to/your/private/key'

ssh_connect_with_key(hostname, port, username, key_file)

详细解析

  1. 创建SSH客户端对象:与前面的示例相同,首先创建一个paramiko.SSHClient()对象。

  2. 设置主机密钥策略:使用client.set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受服务器的主机密钥。

  3. 使用密钥文件进行连接:使用paramiko.RSAKey.from_private_key_file(key_file)加载私钥文件,然后在client.connect方法中使用pkey参数来指定密钥。

  4. 执行命令:与前面的示例相同,使用client.exec_command方法执行命令并获取输出。

  5. 关闭连接:使用client.close()关闭连接。

四、处理交互式会话

在某些情况下,可能需要处理与服务器的交互式会话,例如运行需要用户输入的命令。可以使用invoke_shell方法来实现这一点:

import paramiko

import time

def ssh_interactive_session(hostname, port, username, password):

# 创建SSH客户端对象

client = paramiko.SSHClient()

# 自动添加主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

# 连接到服务器

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

print("连接成功")

# 创建交互式会话

shell = client.invoke_shell()

# 发送命令

shell.send('sudo apt-get update\n')

time.sleep(1)

# 发送密码

shell.send(password + '\n')

time.sleep(1)

# 获取输出

output = shell.recv(65535).decode()

print(output)

except Exception as e:

print(f"连接失败: {e}")

finally:

# 关闭连接

client.close()

使用示例

hostname = 'your_server_ip'

port = 22

username = 'your_username'

password = 'your_password'

ssh_interactive_session(hostname, port, username, password)

详细解析

  1. 创建SSH客户端对象:与前面的示例相同,首先创建一个paramiko.SSHClient()对象。

  2. 设置主机密钥策略:使用client.set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受服务器的主机密钥。

  3. 连接到服务器:使用client.connect方法连接到服务器。

  4. 创建交互式会话:使用client.invoke_shell()方法创建一个交互式会话。invoke_shell返回一个类似文件的对象,可以用来发送和接收数据。

  5. 发送命令:使用shell.send方法发送命令。请注意,命令末尾需要添加换行符(\n),表示回车键。

  6. 发送密码:如果命令需要密码验证(例如使用sudo命令),可以再次使用shell.send发送密码。

  7. 获取输出:使用shell.recv方法接收输出。参数65535表示最大接收字节数。输出需要解码成字符串。

  8. 关闭连接:使用client.close()关闭连接。

五、通过Paramiko上传和下载文件

Paramiko不仅可以用于执行远程命令,还可以用于上传和下载文件。可以使用SFTP(SSH File Transfer Protocol)来实现这一点:

import paramiko

def sftp_transfer(hostname, port, username, password, local_path, remote_path, upload=True):

# 创建SSH客户端对象

client = paramiko.SSHClient()

# 自动添加主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

# 连接到服务器

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

print("连接成功")

# 创建SFTP会话

sftp = client.open_sftp()

if upload:

# 上传文件

sftp.put(local_path, remote_path)

print(f"文件上传成功:{local_path} -> {remote_path}")

else:

# 下载文件

sftp.get(remote_path, local_path)

print(f"文件下载成功:{remote_path} -> {local_path}")

except Exception as e:

print(f"连接失败: {e}")

finally:

# 关闭连接

client.close()

使用示例

hostname = 'your_server_ip'

port = 22

username = 'your_username'

password = 'your_password'

local_path = '/path/to/local/file'

remote_path = '/path/to/remote/file'

上传文件

sftp_transfer(hostname, port, username, password, local_path, remote_path, upload=True)

下载文件

sftp_transfer(hostname, port, username, password, local_path, remote_path, upload=False)

详细解析

  1. 创建SSH客户端对象:与前面的示例相同,首先创建一个paramiko.SSHClient()对象。

  2. 设置主机密钥策略:使用client.set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受服务器的主机密钥。

  3. 连接到服务器:使用client.connect方法连接到服务器。

  4. 创建SFTP会话:使用client.open_sftp()方法创建一个SFTP会话。返回的sftp对象用于上传和下载文件。

  5. 上传文件:使用sftp.put(local_path, remote_path)方法将本地文件上传到远程服务器。local_path是本地文件路径,remote_path是远程文件路径。

  6. 下载文件:使用sftp.get(remote_path, local_path)方法将远程文件下载到本地。remote_path是远程文件路径,local_path是本地文件路径。

  7. 关闭连接:使用client.close()关闭连接。

六、错误处理和调试

在实际使用过程中,可能会遇到各种错误和异常。为了使代码更加健壮,可以添加错误处理和调试信息。例如:

import paramiko

def ssh_connect_with_error_handling(hostname, port, username, password):

client = paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

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

print("连接成功")

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

output = stdout.read().decode()

error = stderr.read().decode()

if error:

print(f"命令执行错误: {error}")

else:

print(output)

except paramiko.AuthenticationException:

print("身份验证失败,请检查用户名或密码")

except paramiko.SSHException as sshException:

print(f"无法建立SSH连接: {sshException}")

except paramiko.BadHostKeyException as badHostKeyException:

print(f"服务器的主机密钥无效: {badHostKeyException}")

except Exception as e:

print(f"连接失败: {e}")

finally:

client.close()

使用示例

hostname = 'your_server_ip'

port = 22

username = 'your_username'

password = 'your_password'

ssh_connect_with_error_handling(hostname, port, username, password)

详细解析

  1. 添加特定异常处理:Paramiko库中定义了多种异常类型,例如paramiko.AuthenticationExceptionparamiko.SSHExceptionparamiko.BadHostKeyException等。可以根据不同的异常类型添加相应的处理逻辑。

  2. 捕获一般异常:使用except Exception as e捕获所有未处理的异常,并打印错误信息。

  3. 检查命令执行错误:在执行命令后,读取stderr对象的内容以检查是否有错误输出。

  4. 关闭连接:无论是否发生异常,都应在finally块中关闭连接,以确保资源正确释放。

七、使用Pexpect模块处理交互式会话

除了Paramiko外,Pexpect模块也是处理SSH连接和交互式会话的强大工具。Pexpect可以自动处理交互式会话中的提示和输入,例如密码提示。

首先,需要安装Pexpect模块:

pip install pexpect

以下是一个使用Pexpect连接到Linux服务器并执行命令的示例:

import pexpect

def ssh_with_pexpect(hostname, username, password):

try:

# 创建SSH会话

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

# 处理密码提示

ssh.expect('password:')

ssh.sendline(password)

# 执行命令

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

ssh.sendline('ls -l')

# 获取输出

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

output = ssh.before.decode()

print(output)

# 退出会话

ssh.sendline('exit')

ssh.close()

except pexpect.exceptions.TIMEOUT:

print("连接超时")

except pexpect.exceptions.EOF:

print("连接被服务器关闭")

except Exception as e:

print(f"连接失败: {e}")

使用示例

hostname = 'your_server_ip'

username = 'your_username'

password = 'your_password'

ssh_with_pexpect(hostname, username, password)

详细解析

  1. 创建SSH会话:使用pexpect.spawn(f'ssh {username}@{hostname}')启动SSH会话。

  2. 处理密码提示:使用ssh.expect('password:')等待密码提示,然后使用ssh.sendline(password)发送密码。

  3. 执行命令:等待命令提示符出现(例如username@),然后发送命令。

  4. 获取输出:在发送命令后,再次等待命令提示符出现,然后读取输出。

  5. 退出会话:使用ssh.sendline('exit')退出会话,并关闭连接。

  6. 错误处理:Pexpect模块定义了多种异常类型,例如pexpect.exceptions.TIMEOUTpexpect.exceptions.EOF。可以根据不同的异常类型添加相应的处理逻辑。

总结:

通过本文的详细介绍,我们了解了如何使用Python通过Paramiko和Pexpect模块登录Linux服务器,并执行远程命令、上传和下载文件、处理交互式会话等。无论是使用用户名和密码,还是使用密钥文件进行身份验证,都可以根据实际需求选择合适的方法。同时,通过添加错误处理和调试信息,可以使代码更加健壮和可靠。希望本文对您在Python中实现SSH连接有所帮助。

相关问答FAQs:

如何使用Python脚本自动化登录Linux服务器?
可以通过使用SSH协议和paramiko库来实现自动化登录。首先,确保安装了paramiko库,可以通过命令pip install paramiko来安装。然后,使用以下示例代码连接到Linux服务器:

import paramiko

hostname = 'your_server_ip'
username = 'your_username'
password = 'your_password'

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

stdin, stdout, stderr = client.exec_command('ls')  # 执行命令
print(stdout.read().decode())  # 输出结果
client.close()

在使用Python连接Linux服务器时,如何处理SSH密钥认证?
如果你希望通过SSH密钥而不是密码进行认证,需要确保你有合适的私钥文件,并使用paramiko库的load()方法加载它。例如:

import paramiko

hostname = 'your_server_ip'
username = 'your_username'
private_key_path = '/path/to/your/private/key'

key = paramiko.RSAKey.from_private_key_file(private_key_path)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, username=username, pkey=key)

stdin, stdout, stderr = client.exec_command('ls')
print(stdout.read().decode())
client.close()

在Python中如何处理登录失败的情况?
在连接Linux服务器时,可能会遇到认证失败或网络问题。可以通过捕获异常来处理这些错误。以下是一个示例:

import paramiko

try:
    client.connect(hostname, username=username, password=password)
except paramiko.AuthenticationException:
    print("Authentication failed, please verify your credentials")
except paramiko.SSHException as sshException:
    print(f"Could not establish SSH connection: {sshException}")
except Exception as e:
    print(f"Exception in connecting to the server: {e}")
finally:
    client.close()

通过以上方法,能够有效地处理连接问题,提高代码的健壮性。

相关文章