繁体   English   中英

ssh-keygen 为空 output,在 macOS Ventura 13.1 上的 python3.10 中带有 subprocess.run 和 os.system

[英]ssh-keygen empty output with subprocess.run and os.system in python3.10 on macOS Ventura 13.1

我一直在尝试 output 使用 python 和“子进程”库从 ssh-keygen (CLI) 生成的签名公钥。 我还尝试了具有相同结果的“os”库。 我真的很想了解为什么它没有按照我的意愿进行:像我期望的那样在屏幕上显示“ssh-keygen -Lf {keyfile}”的 output。

当我使用 CLI (darwin / macOS Ventura 13.1) 在同一密钥文件上使用此命令时,我得到了预期的结果。 当我在 Python3.10 中使用命令时,我得到一个返回码“1”并且没有重大错误来帮助我理解问题。 请看下面:

预期成绩:

shell-prompt$> ssh-keygen -Lf ~/.ssh/signed_key.pub
/Users/USER/.ssh/signed_kali-os.pub:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT SHA256:REDACTED
        Signing CA: RSA SHA256:REDACTED (using rsa-sha2-256)
        Key ID: "vault-oidc-USER@domain.com-REDACTED"
        Serial: REDACTED
        Valid: from 2023-01-24T20:56:07 to 2023-01-24T21:01:37
        Principals: 
                principal-user
        Critical Options: (none)
        Extensions: 
                permit-pty

基本 Python3.10 脚本中的 Output 在打印返回码时为“1”,在打印 stdout 和/或 stderr 时为空(无)。 我已经尝试了所有我能想到的印刷方式。

这是我尝试过但没有成功的两种代码解决方案。 当我用诸如“ls -l”或“cat”之类的基本命令替换命令 (ssh-keygen) 时,我得到了预期的 output。 我相信变量 signedPath 会按预期工作,因为它在未显示的代码的其他部分工作,并且当我用硬编码路径替换变量时它仍然失败。

1)
if sys.platform == "linux" or sys.platform == "linux2" or sys.platform == "darwin":
        keyOut = subprocess.run(['ssh-keygen','-Lf',signedPath],capture_output=True)
        print(keyOut.stdout.decode())
2)
os.system('ssh-keygen -Lf {key}'.format(key=signedPath))

我在找什么? 最终,我想将此代码用于屏幕上的签名公钥 output,因为我喜欢使用 ssh-keygen 获得的 output 格式,并且我在 Python 中遇到其他 SSH 密钥库的问题。如果有一个更好的解决方案,我很想得到一些帮助,但我真的开始尝试理解为什么这个特定的代码不起作用,所以我想要一个答案而不是一个单独的解决方案。 非常感谢这里的任何帮助。

---+++ 已解决 +++---


好吧……这很尴尬……但我知道这发生在我们所有人身上。 我添加了 5 秒的睡眠,现在它按预期工作。 令人沮丧的是,在我的代码退出后,文件已完成写入,所以我不知道它在运行时是 0 字节,直到我放入更多打印语句。我正在编写的代码与保险库服务器通信以签署我的公钥,并且我没有给它时间来完成,所以 python 试图读取一个 0 字节的文件......我在制作另一个最小代码示例时想到了这一点。

---+++ 解决方案+++---


如果您遇到类似的问题,可能是您尝试读取的文件在运行时为 0 字节。

这不是一个完整的答案——从你的问题中不清楚为什么你没有看到预期的 output——但我想展示一个最小的、完整的、可验证的示例(“MCVE”)可能是什么样子的作为提供一个工作示例。

考虑这段代码,它 (a) 生成一个密钥用作签名证书,(b) 生成一个要签名的密钥,然后 (c) 使用 (a) 中的密钥对 (b) 中的密钥进行签名:

#!/usr/bin/python

import os
import subprocess

expected_files = [
    "ca_key",
    "ca_key.pub",
    "user_key",
    "user_key.pub",
    "user_key-cert.pub",
]

for name in expected_files:
    try:
        os.remove(name)
    except FileNotFoundError:
        pass

# I'm using `check_output` -- and ignoring the return value -- in order to
# supress the output from these commands. This is effectively a shortcut
# for `subprocess.run` with `capture_output=True` and `check=True`.
print("generating keys")
subprocess.check_output(["ssh-keygen", "-t", "rsa", "-f", "ca_key", "-N", ""])
subprocess.check_output(["ssh-keygen", "-t", "rsa", "-f", "user_key", "-N", ""])
subprocess.check_output(
    ["ssh-keygen", "-s", "ca_key", "-I", "user_key", "user_key.pub"]
)

# Verify that we created everything we expected to create.
for name in expected_files:
    assert os.path.isfile(name)

# Here's the code from your question.
signedPath = "user_key-cert.pub"
keyOut = subprocess.run(["ssh-keygen", "-Lf", signedPath], capture_output=True)

print("keyOut:", keyOut.stdout.decode())

上面的代码是一个独立的示例:它创建了所有必要的文件来运行您在问题中询问的代码; 有人可以暗示复制示例,将其粘贴到文件中,然后运行它。

在我的系统 ( sys.platform == linux ) 上,运行这个例子会产生:

generating keys
Signed user key user_key-cert.pub: id "user_key" serial 0 valid forever
keyOut: user_key-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT SHA256:Bca+gRvhx3twR0vFhIU3gr+TKIfFq2I1+lraJ6Z2QAI
        Signing CA: RSA SHA256:muz+6U5h9ZGyslm50m1F0VNG8VrseuQRzYwdUm2iGoo (using rsa-sha2-512)
        Key ID: "user_key"
        Serial: 0
        Valid: forever
        Principals: (none)
        Critical Options: (none)
        Extensions:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

如果您在 Linux 系统上运行代码并且您看到不同的行为,我相信通过一些关于您的环境的额外细节,我们可以弄清楚发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM