【问题标题】:How can I execute a command on a remote Linux/Windows machine from a Linux/Windows machine using python?如何使用 python 从 Linux/Windows 机器在远程 Linux/Windows 机器上执行命令?
【发布时间】:2015-01-19 18:23:02
【问题描述】:

我有两台机器,AB。两台机器都可以是 Windows 或 Linux 机器,但是 - 为简单起见 - 我事先知道哪个是哪个。我还知道远程机器B 的用户名和密码(没有其他身份验证方法)。所以我有四种可能的组合:

A=Windows  B=Windows
A=Windows  B=Linux
A=Linux    B=Windows
A=Linux    B=Linux

我正在寻找一个小的 python 脚本(或更好的:标准库),它可以在 B 上执行来自 A 的远程命令。准确地说:在机器A 上,我启动了一个python 脚本来在远程机器B 上运行一些命令cmd。在python 中是否有通用的方法来执行此操作?

对于 Linux->Linux 组合,我可以考虑使用 sshsubprocess,但我可能会遇到用户名/密码身份验证问题。

对于 Windows->Windows 组合,我已经使用了一个名为 psservice 的工具(与子进程一起使用)。

知道如何以最 Pythonic 的方式解决这个问题吗?不需要是一个功能,它可以通过四种不同的方式实现。并且,如果可能,不使用第三方库(这有点不一致,因为psservice 已经是我正在使用的第三方库......)。

【问题讨论】:

  • 为什么不直接使用ssh 呢?保持简单。
  • 是否还有其他有用的建议(实际上可行)并且不包括paramiko(对我不起作用...)?
  • 你有没有让 ssh 在 windows 和 linux 之间的命令行下工作?因为那是第 1 步。如果您甚至无法让 ssh 在命令行中工作,那么 paramiko 将无法工作,其他建议对您来说也不会更容易;他们将变得更加困难。例如,您可以使用套接字、snmp、http 在计算机之间进行通信,但所有这些都需要更多的工作。
  • 另外,您可以在没有 paramiko 的情况下将 ssh 与 python 一起使用。还有其他库,或者您可以使用 Popen 手动完成:python-for-system-administrators.readthedocs.org/en/latest/…

标签: python linux windows ssh


【解决方案1】:

我建议通过 paramiko 库使用 ssh/sftp。

支持所有主要的密码和哈希方法。也支持 SFTP 客户端和服务器模式。

而且它是跨平台的。

【讨论】:

【解决方案2】:

试试 paramiko。我正在使用它,使用起来非常简单。

编辑 1

host='IP'
username='user'
password='password'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(host, username, password)

stdin, stdout, stderr = ssh.exec_command("pwd")
stdout.read()
ssh.close()

编辑 2:

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=password)

stdin, stdout, stderr = ssh.exec_command('pwd')

stdout.read()
ssh.close()

编辑 3 这里还有一个使用私钥/公钥的解决方案:

key = paramiko.RSAKey.from_private_key_file(keyDest, keyPass)
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(host, username=user, pkey=key)

stdin, stdout, stderr = ssh.exec_command('pwd')
stdout.read()
ssh.close()

EDIT 1 和 EDIT 3 在我的脚本中都可以正常工作..

【讨论】:

  • 好的,我试试。巧合的是,我已经安装了它。但我在第三行得到一个错误:gaierror: [Errno 10109] getaddrinfo failed
  • 使用 paramiko 的具体要求是什么?什么机器必须安装什么?
  • 在使用 paramiko 之前,请确保您可以先从命令行执行 ssh。确保每台机器都运行 ssh 服务器。
  • 下一个错误:AuthenticationException: Authentication failed. 虽然绝对确定使用了正确的用户名/密码组合。也许我需要重启一台/两台机器...?
  • 使用域用户名/密码是否重要?
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 2011-12-18
  • 2012-09-14
  • 2012-11-17
  • 2017-11-24
  • 1970-01-01
  • 2015-07-30
  • 2013-09-28
相关资源
最近更新 更多