使用子进程从 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”未被识别为内部或外部命令、可运行程序或批处理文件