使用子进程从 python 执行时,ssh 未被识别为命令?

Posted

技术标签:

【中文标题】使用子进程从 python 执行时,ssh 未被识别为命令?【英文标题】:ssh not recognized as a command when executed from python using subprocess? 【发布时间】:2018-12-11 21:41:56 【问题描述】:

这是我的代码 -

import subprocess
import sys

HOST="xyz3511.uhc.com"
# Ports are handled in ~/.ssh/config since we use OpenSSH
COMMAND="uptime"

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
    error = ssh.stderr.readlines()
    print (sys.stderr, "ERROR: %s" % error)
else:
    print (result)

这是我得到的错误-

错误: [b"'ssh' 未被识别为内部或外部命令,\r\n", b'可运行的程序或批处理文件。\r\n']。

不知道我在这里做错了什么。另外,我没有提到任何端口。我想要的只是使用子进程并连接到远程服务器,执行一个简单的命令,如ls。 Python 版本是 3.x。

【问题讨论】:

你能在终端上显式地 ssh 吗?我的意思是不在 Python 程序中 您是在没有安装 SSH 客户端(名称为 ssh)的 Windows 机器上执行此操作吗? 是的,我在 windows 中使用这个程序 @alfe 我在安装了 SSH 的 Windows 机器上遇到了同样的错误(ssh 命令在 cmd 中有效,但在子进程中无效) 确保找到 ssh 命令。要么相应地设置你的 PATH 变量的 Windows 等效项,要么只使用 ssh 可执行文件的完整路径而不是 ssh,即。 e.类似C:\some\path\to\ssh. 【参考方案1】:

显然这发生在 python3 中。 在此链接中找到解决方法: https://gist.github.com/bortzmeyer/1284249

system32 = os.path.join(os.environ['SystemRoot'], 'SysNative' if platform.architecture()[0] == '32bit' else 'System32')
ssh_path = os.path.join(system32, 'OpenSSH/ssh.exe')
out1, err1 = Popen([ssh_path, "pi@%s"%self.host, "%s"%cmd],
              shell=False,
              stdout=PIPE, 
              stderr=PIPE).communicate()

【讨论】:

以上是关于使用子进程从 python 执行时,ssh 未被识别为命令?的主要内容,如果未能解决你的问题,请参考以下文章

ssh:术语“ssh”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称

使用 python 子进程检查 pip 是不是安装在 Windows 上

Python 和 Windows 10:“telnet”未被识别为内部或外部命令、可运行程序或批处理文件

pip 未被识别为内部命令 [重复]

行为:术语“行为”未被识别为 cmdlet Python Selenium 的名称

使用 Python 子进程的 ssh 多个命令